再谈消息队列技术

上周,我们举办了第二届技术沙龙,我这边主要演讲了消息队列技术的议题,现分享给大家:

在我们团队内部,随着消息应用中心(任务中心)的广泛应用,有时候我们感觉不到消息队列的存在,但这不影响消息队列在高可用、分布式、高并发架构下的核心地位。

消息队列都应用到了哪些实际的应用场景中?

一、再谈消息队列的应用场景

  1. 异步处理:例如短信通知、终端状态推送、App推送、用户注册等

  2. 数据同步:业务数据推送同步

  3. 重试补偿:记账失败重试

  4. 系统解耦:通讯上下行、终端异常监控、分布式事件中心

  5. 流量消峰:秒杀场景下的下单处理

  6. 发布订阅:HSF的服务状态变化通知、分布式事件中心

  7. 高并发缓冲:日志服务、监控上报

但是,我们对消息队列的底层技术和原理还是不了解,那么我们马上开始吧…

二、消息队列的一些基本概念和简单原理

1. Broker

Broker的概念来自与Apache ActiveMQ,通俗的讲就是MQ的服务器。

2. 消息的生产者、消费者

消息生产者Producer:发送消息到消息队列。

消息消费者Consumer:从消息队列接收消息。

3. 点对点消息队列模型

消息生产者向一个特定的队列发送消息,消息消费者从该队列中接收消息;

消息的生产者和消费者可以不同时处于运行状态。

每一个成功处理的消息都由消息消费者签收确认(Acknowledge)。如图:

4. 发布订阅消息模型-Topic

发布订阅消息模型中,支持向一个特定的主题Topic发布消息,0个或多个订阅者接收来自这个消息主题的消息。在这种模型下,发布者和订阅者彼此不知道对方。实际操作过程中,

发布订阅消息模型中,支持向一个特定的主题Topic发布消息,0个或多个订阅者接收来自这个消息主题的消息。在这种模型下,发布者和订阅者彼此不知道对方。实际操作过程中,

必须先订阅,再发送消息,而后接收订阅的消息,这个顺序必须保证。

5. 消息的顺序性保证

基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。

6. 消息的ACK确认机制

即消息的Ackownledge确认机制,

为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消息了。如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。

7. 消息的持久化

消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。

8. 消息的同步和异步收发

同步:消息的收发支持同步收发的方式。

同时还有另一种同步方式:同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站,然后张三去取,当然张三写信的时候就得写明回信地址

消息的接收如果以同步的方式(Pull)进行接收,如果队列中为空,此时接收将处于同步阻塞状态,会一直等待,直到消息的到达。

异步:消息的收发同样支持异步方式:异步发送消息,不需要等待消息队列的接收确认;异步接收消息,以Push的方式触发消息消费者接收消息。

9. 消息的事务支持

消息的收发处理支持事务,例如:在任务中心场景中,一次处理可能涉及多个消息的接收、处理,这处于同一个事务范围内,如果一个消息处理失败,事务回滚,消息重新回到队列中。

三、我们对消息队列的实际使用

我们使用了两种消息队列组件:

RabbitMQ:高可用、高可靠消息应用场景,例如记账失败重试、通知服务,消息不允许丢

Kafka:高性能消息应用场景,例如日志、监控,消息允许丢失。

在此之上,我们封装了消息应用中心、日志服务等核心组件和服务。那么,消息应用中心和日志都用到了消息队列什么技术? 干货来了…

1.     消息应用中心

消息应用中心(任务中心)使用了消息队列的异步处理、数据同步、重试补偿、系统解耦、流量消峰等特性。其中:

消息应用中心(任务中心),支持RabbitMQ和Kafka两种消息通道,支持在任务元数据层面设置

任务:就是一个包含了任务执行上下文的消息,同时代表了异步处理

任务发送者(ITaskSender)发送任务:消息的生产者将任务消息发送的消息队列

任务类型:消息队列名称,例如:HaKeepAcco***Queue,充电补偿记账队列

消息队列:任务的临时存储

任务中心:任务集中处理,消息消费者

任务处理完成:消息Ack确认

任务的多级重试:多个重试消息队列,HaSysTaskStore2Queue

2.     日志组件

日志组件,使用了消息队列的高并发缓冲和发布订阅特性。其中:

日志组件使用Kafka作为消息通道,因为Kafka的性能好,吞吐量大, 可以容忍偶尔的消息数据丢失

日志组件使用发布订阅的消息模型

日志组件包含日志服务SDK和日志HSF服务,二者都是消息的生产者Producer

日志类型:消息的Topic主题

日志处理器:消息的消费者、Topic的订阅、日志数据处理(Hbase\ES\其他)

3.     RPC服务状态变化通知

RPC服务状态变化通知,使用了消息队列的发布订阅特性。其中:

RPC服务状态变化通知,使用了RabbitMQ消息队列技术

使用发布订阅的消息模型

Topic:RPCServiceState

RPCService.Proxy:RPC服务状态变化消息的订阅者

RPC服务注册、发布:消息的生产者,发送RPC服务状态变化消息。

四、消息队列使用的最佳实践

1.  RabbitMQ的连接,底层都是Socket连接,长连接 or 短连接?

RabbitMQ每个在创建每个连接的同时,会自动创建一个监视线程来定时(默认60s)侦测连接的状态,如果连接断开,触发ConnectionShutdown事件。

    用长连接,还是用短连接??

    发送端:建议使用短连接,用完即释放,避免长连接带来的端口占用,因为发送端无处不在,发送操作短而急促。

接收端:建议使用长连接,时刻接收处理消息,因为消息的接收消费比较集中,接收操作久而弥坚。

2. 网络是有抖动的,连接的断开是正常的,如何应对?

    发送端:发送失败重试

接收端:注册ConnectionShutdown事件同时捕获消息接收异常,重新建立连接,接收消费消息

3. RabbitMQ Exchange(Topic)模式下带来的消息队列数量激增

    只是创建了一个Exchange(Topic),为什么会增加这么多Queue。

   因为,每个Topic的订阅都是绑定一个Queue用作消息的消费。

4. 需求的演变,消息结构的变更,如何平滑过度?

    消息是byte[]数组,我们将复杂对象消息二进制序列化。

    接收到消息后,我们将二进制数组反序列化为实体类。

    当我们的实体类消息体的结构发生变化后,因为受二进制序列化处理的

影响,导致无法反序列化。

    解决方案:

    消息体预留一些string类型的扩展字段

   消息队列版本化,支持多个版本的消息体。

5. Kafka Consumer Group

   同一Topic的一条消息只能被同一个Group内的一个Consumer消费

   多个Consumer Group可同时消费同一条消息

   

6. 消息的积压

消息的积压产生的原因:消息接收消费的速率低,发送的速度>接收的速度。

消息积压后的影响:

消息大量积压后,当新的消费者连接上MQ并开始接收消息时,发送速率会大幅降低。

消息队列集群的压力增加,大量的消息要持久化存储和同步。

如何减少消息积压:快速消费消息,同时保持消息体的不要过大

原文地址:http://www.cnblogs.com/tianqing/p/7110468.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器性能指标(二)——CPU利用率分析及问题排查

转载自 服务器性能指标(二)——CPU利用率分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load、cpu、mem、qps、rt等。每个指标都有其独特的意义,很多时候在线上出现问题时&…

20级:班级日常分享,一天一瞬间

点击上方蓝色关注我们!今天批改的作业不仅仅是卡个印有“优”字样式的章,当然也不仅仅是用红笔写个“SSSS9.28”字样的批语了。除了给每个学生的作业本上都卡了“优”的章之外,还送给每位同学一句或长或短的话,有表扬有批评&#…

SpringMVC的视图解析器

文章目录SpringMVC的自定义视图解析器[1] SpringMVC的视图解析器[2] SpringMVC的自定义视图解析器SpringMVC自定义视图解析器的使用[1] 目前项目资源的声明位置和访问中存在的问题[2] 使用自定义视图解析器优化资源跳转路径[3] 使用restful声明公共单元方法请求转发WEB-INF下的…

【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】

目录地址 前言 打错了一个地方之接60,还有输出“Peace”能拿60。还有题目坑爹害得我用了哈希,可以无视 QAQ 正题 有一个n*n的图,有m条边,不知道几个城市,给出两个位置,求两个位置移动到相遇(…

互联网级监控系统必备-时序数据库之Influxdb技术

时间序列数据库,简称时序数据库,Time Series Database,一个全新的领域,最大的特点就是每个条数据都带有Time列。 时序数据库到底能用到什么业务场景,答案是:监控系统。 Baidu一下,互联网监控系…

存放80000000学生成绩的集合,怎么统计平均分性能高

大家好,我是雄雄,好久不介绍一下我,就被大家淡忘了……我们都知道,遍历集合的方式最常用的有两种,一种是使用下标的方式遍历,第二种便是使用foreach遍历,代码分别如下:使用下标的方法…

数组元素的默认值

数组元素的默认值 数组元素是整型:0 数组元素是浮点型:0.0 数组元素是char型:0或’\u0000’,而非’0’ 数组元素是boolean型:false 数组元素是引用数据类型:null eg 非数组元素必须初始化后才能进行使用…

ssl初一组周六模拟赛【2018.3.10】

前言 先说一下成绩(因某人要求去掉了某人): 姓名成绩xjq280wyc200(本人)lrz200zyc100hjq40lw30hzb0 正题 题目1:Clocest (ssl2574) 贪心30分,改后100分dfs 链接: http://blog.c…

如何重构箭头型代码

转载自 如何重构"箭头型"代码 本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论,在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我…

SpringMVC的上传与下载

文章目录SpringMVC的上传SpringMVC的下载SpringMVC的上传 [1] 上传的功能需求 随着我们互联网的发展,我们的用户从直接访问网站获取信息。变为希望将自己本地的 资源发送给服务器,让服务器提供给其他人使用或者查看。还有部分的用户希望可以将 本地的资…

中秋节支付宝口令红包解析

大家好,我是雄雄。继上篇文章(10.1日)发完之后就没有再日更公众号了,给自己也放几天假。这个假期实在是太太太长了,放的我都心气憔悴!出去玩吧,没地儿去,在家吧,除了看书…

asp.net core高级应用:TagHelper+Form

上一篇博客《asp.net core新特性(1):TagHelper》我讲解了TagHelper的基本用法和自定义标签的生成,那么我就趁热打铁,和大家分享一下TagHelper的高级用法~~,大家也可以在我的博客下随意留言。对于初步接触asp.net core的骚年可以看看我对TagHe…

爸妈没多大本事……

本文原创:王晓丹世界上什么都不公平,唯独时间最公平,你是懒惰还是勤奋,时间都会给出结果。每个人都是孤独的,你的人生不会辜负你的。那些流下的泪和那些辛苦的汗水 全都让你成为一个独一无二的自己。把懒惰放一边 &…

我终于搞清楚了和String有关的那点事儿

转载自 我终于搞清楚了和String有关的那点事儿 String,是Java中除了基本数据类型以外,最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对&#xff1a…

SpringMVC的拦截器

文章目录SpringMVC的拦截器学习SpringMVC的拦截器学习 [1] SpringMVC拦截器的介绍 问题: 在之前学习Servlet的时候,我们学习了过滤器的知识。过滤器的作用是保护 请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围&#xff…

考研英语二大纲22年考研

全国硕士研究生招生考试英语(二)考试大纲(非英语专业)(2022年版)   I.考试性质   英语(一)考试是为高等学校和科研院所招收硕士研究生而设置的具有选拔性质的全国统一入学考试科目,其目的是科学、公平、有效地测试考生对英语语言的运用能力,评价的标…

ssl1763-观光旅游【最小环,Floyd,dijkstra】

正题 就是给出一个无向图&#xff0c;求最小环。 输入输出&#xff08;需要自取&#xff09; Input 每组数据的第一行包含两个正整数&#xff1a;十字路口的个数N(N<100)&#xff0c;另一个是道路的 数目M(M<10000)。接下来的每一行描述一条路&#xff1a;每一行有三个…

物联网模式下的多活数据中心架构认识与实践

做互联网应用很重要的一点是要保证服务可用性&#xff0c;特别是某些业务更是需要7*24小时不间断的对外提供服务&#xff0c;任何停机、宕机都会引起大面积的用户不满。持续可用性是把业务服务化时一个需要考虑的重要指标&#xff0c;很多时候我们都会牺牲一些功能来换取可用性…

subList?? subString???

今天看到了java中List中有个subList方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。1String类的subStringString中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串&am…