消息中间件
消息中间件是在分布式系统中传送数据的组件。
- 消息中间件的定义?
利用高效可靠的消息传递机制与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
消息中间件,全称为消息队列中间件,Mesage Queue Middleware,简称MQ。
官方的解释比较拗口,其实就是用于程序间通信的一种手段,系统间通过消息传递完成交互。 - 消息中间件应用主要场景
- 异步:有些业务不需要立即处理消息,可以异步处理,快速返回
- 解耦:服务双方不需要知道彼此的存在,只要发布消息,消费消息即可
- 削峰:消息中间件可以在峰值时堆积消息,不会因突发的超负荷请求而致使系统崩溃,在之后慢慢消费消息
在做微服务的时候,有一个重要的组件是
config
,如果需要动态更改配置需要用到Bus
,而通知应用免重启更新配置文件就需要用到消息中间件解耦。
- 如何衡量一个消息中间件?
- 服务性能:QPS级别是万级、十万级,时延(时效性)
- 数据存储:存储在内存还是磁盘
- 集群架构:保证高可用
- 消息中间件的传递模式:
- 点对点(P2P):基于队列,生产者发送消息到队列,消费者从队列中接收消息
- 发布/订阅(Pub/Sub):定义了如何向一个内容节点发布和订阅消息。
- 消息队列的缺点
- 系统可用性降低:MQ挂了,系统无法运转了
- 复杂性提升:设计的时候处处需要考虑MQ的协调
- 一致性问题:消息丢失,重复消费
主流中间件
ActiveMQ
- Apache出品,曾经最流行的开源消息中间件,完全支持JMS
- 丰富的API、多种集群构建模式
- 依赖Zookeeper,Master-Slave、NetWork模式
Kafka
- 出自LinkedIn,开源于Apache
- 借助了操作系统,最求高吞吐
- 主要用于日志收集和传输
- 存在消息重复消费、丢失等
- 依赖Zookeeper
RocketMQ
- 出自阿里,开源于Apache
- 高吞吐,高可用,适合大规模分布式系统
RabbitMQ
- 使用Erlang语言
- 基于AMQP协议
- 可靠性好,安全性高
- 与Spring完善整合
- 表达式配置,HA模式,镜像队列mirror queue
RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同应用之间共享数据。
RabbitMQ越来越受到追捧,还是跟它的表现分不开的:
- 可靠性:使用了持久化、传输确认等
- 灵活的路由:通过交换机路由消息
- 扩展性:多个RabbitMQ节点可以方便地组成集群
- 高可用性:集群中存在备份,部分节点失效时队列仍可用
- 多客户端:支持多种语言的客户端,如Java、Python、Ruby、PHP等
- 管理界面:有一个管理界面,可以监控和管理消息与集群
- 插件:有多种插件,扩展很方便
AMQP
- RabbitMQ为什么选Erlang ?
- Erlang有着和原生Socket一样的延迟
- AMQP是什么?
- 高级消息队列协议:Advanced Message Queuing Protocol
- 二进制协议,提供统一消息服务的应用层标准高级消息队列协议
AMQP 名词
- Server:又称Broker,接受客户端连接
- Connection:应用程序与Broker的网络连接
- Channed:网络信道。消息读写的通道。
- Message:消息。服务器和应用程序之间传送的数据,由Properties和Body组成
- Virtual host:虚拟地址。用于逻辑隔离,最上层的消息路由
- Binding:虚拟连接,Exchange和Queue之间的虚拟连接
- Routing key:路由规则,虚拟机可用它来确定如何路由一个特定消息
- Queue:消息队列,保存消息并将它们转发给消费者