消息中间件的使用

1.什么是消息中间件

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。

2.为什么使用消息中间件

解耦、异步、削峰
虚拟场景:用户注册后,需调用其它系统,发相关的通知短信或邮件。

2.1 解耦

图1:后续工作中增加系统E、F、G、H…,A系统工作人员需增加调用E、F、G、H…接口的工作。
图2:很好的解决了重复性的工作。

2.2 异步

图1 客户端获得返回耗时
系统耗时ABCD总耗时
串行50505050200
并行5050100

图2客户端获得返回耗时
系统耗时AMQBCD总耗时
MQ505055

2.3 削峰

图1:如果A系统业务简单处理快速,B、C、D处理速度慢,在遇到大流量时,B、C、D很容易被压垮。
图2:将A处理后的任务放到MQ队列,B、C、D系统处理完成一个拿一个。

3.常用消息中间件

产品 kafka RocketMQ RabbitMQ
设计定位 系统间的数据流管道,实时数据处理。
例如:常规的消息系统、网站活性跟踪,监控数据,日志收集、处理等
非日志的可靠消息传输。
例如:订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等
可靠消息传输。和RocketMQ类似。
成熟度 日志领域成熟 成熟 成熟
所属社区/公司 Apache Alibaba开发,已加入到Apache下 Mozilla Public License
社区活跃度
API完备性
文档完备性
开发语言 Scala Java Erlang
客户端语言 C/C++、Python、Go、Erlang、.NET、Ruby、Node.js、PHP等 Java Java、C、 C++、 Python、 PHP、Perl 等
持久化方式 磁盘文件 磁盘文件 内存、文件
部署方式 单机/集群 单机/集群 单机/集群
集群管理 zookeeper name server
事务消息 不支持 支持 不支持
优点 1、在高吞吐、低延迟、高可用、集群热扩展、集群容错上有非常好的表现
2、producer端提供缓存、压缩功能,可节省性能,提高效率。
3、提供顺序消费能力
4、提供多种客户端语言
5、生态完善,在大数据处理方面有大量配套的设施。
1、在高吞吐、低延迟、高可用上有非常好的表现;消息堆积时,性能也很好。
2、api、系统设计都更加适在业务处理的场景。
3、支持多种消费方式。
4、支持broker消息过滤。
5、支持事务。
6、提供消息顺序消费能力;consumer可以水平扩展,消费能力很强。
7、集群规模在50台左右,单日处理消息上百亿;经历过大数据量的考验,比较稳定可靠。
1、在高吞吐量、高可用上较前两者有所不如。
2、支持多种客户端语言;支持amqp协议。
3、由于erlang语言的特性,性能也比较好; 使用RAM模式时,性能很好。
4、管理界面较丰富,在互联网公司也有较大规模的应用;
缺点 1、消费集群数目受到分区数目的限制。
2、单机topic多时,性能会明显降低。
3、不支持事务
1、相比于kafka,使用者较少,生态不够完善。消息堆积、吞吐率上也有所不如。
2、不支持主从自动切换,master失效后,消费者需要一定的时间才能感知。
3、客户端只支持Java
1、erlang 语言难度较大。集群不支持动态扩展。
2、不支持事务、消息吞吐能力有限
3、消息堆积时,性能会明显降低

4.Rabbit术语

术语 解释
Broker RabbbitMQ消息队列代理服务器实体。
Producer 发送消息的应用程序。
Consumer 接收消息的用户程序。
Exchange 交换器,生产者直接将消息发送给交换器。交换器将消息分发给指定的队列。它指定消息按什么规则,路由到哪个队列。
Binding 绑定,指的是交换器和队列之间的关系。它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key 路由关键字,exchange根据这个关键字进行消息投递。
vhost 虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
Channel 消息通道,包含了大量的API可用于编程。在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
Connection 在客户创建一个到某个虚拟主机的连接。
ConnectionFactory 连接工厂类。可以创建一个连接。

5.Rabbit五种模式

RabbitMQ五种模式(SIMPLE模式)
RabbitMQ五种模式(WORK模式)
RabbitMQ五种模式(P/S模式)
RabbitMQ五种模式(ROUTING模式)
RabbitMQ五种模式(TOPICS模式)

6.中间件几个问题

6.1消息重复消费

问题:
当Consumer消费完一条消息时,需要向Broker发送ack,如果因为网络等问题Consumer没有成功向Broker发送ack,那么消息将会被再此消费。
解决:
这就要求我们在消费消息时,需要考虑到幂等性消费(即同一数据调用一次和调用多次结果是一样的)。

6.2消息顺序问题

问题:
当Producer向Broker发送的消息需要Consumer有顺序的消费。
解决:
1.一个Consumer消费一个队列。
2.多个Consumer对应相应队列,Producer在生产消息时,需要顺序的消息通过一定的规则发送到同一队列。

6.3分布式系统事务问题

问题:
当系统间调用,希望同时成功或同时回滚的时候。
解决:
使用mq实现分布式事务-补偿事务一致性
分布式事务——消息最终一致性方案
RabbitMQ之消息确认机制(事务+Confirm)