一个分布式的基于发布\订阅模式的消息队列,主要应用与大数据实时处理领域。
1.1 消息系统的分类
-
Peer-to-Peer
(点对点)- 一般基于
pull
或者polling
接收消息 - 发送到队列中的消息被一个而且仅一个接收者接收,即使有多个接收者在同一队列中侦听同一消息
- 既支持异步“即发即弃”的消息传送方式,也支持同步请求/应答传送方式
- 一般基于
-
发布/订阅
- 发布到一个主题的消息,可被多个订阅者锁接收
- 发布/订阅即可基于
push
消费数据,也可基于pull
或者polling
消费数据 - 解耦能力比
P2P
更强
1.2 消息系统适用的场景
- 解耦:各系统间通过消息系统这个统一接口进行数据交换,无需了解彼此的存在
- 冗余:部分消息系统具有消息持久化能力,可规避消息处理前丢失的风险
- 扩展:消息系统是一个统一的数据接口,各系统可独立扩展
- 峰值处理能力:消息系统可顶住峰值流量,业务系统可根据处理能力从消息系统中获取并处理对应量的请求
- 可恢复性:系统中部分组件失效并不会影响整个系统,他恢复后仍然可从消息系统中获取并处理数据
- 异步通信:在不需要立即处理请求的场景下,可以将请求放入消息系统,合适的时候再处理
1.3 常用消息系统的对比
RabbitMQ
:Erlang
编写,支持多协议AMQP
、XMPP
、SMTP
、STOMP
,支持负载均衡,数据持久化,同时支持peer-to-peer
和发布\订阅模式Redis
:基于key-value键值对的nosql
数据库,同时支持MQ
功能,可用于轻量级队列服务适用,就入队操作来说,当数据小于10kb
时,redis
性能优于RabbitMQ
ZeroMQ
:轻量级,不需要单独的消息服务器或中间件,应用程序本身扮演该角色,peer-to-peer
,其本质是一个库,需要开发人员组合多种技术实现,复杂度比较高ActiveMQ
:jms
实现,peer-to-peer
,支持持久化,XA
事务Kafka
:高性能跨语言的分布式发布\订阅消息系统,数据持久化,全分布式,同时支持在线和离线处理RocketMQ
:纯java
实现,发布\订阅消息系统,支持本地事务及XA
分布式事务
1.4 Kafka的设计目标
- 高吞吐率:在廉价的机器上单机可支持每秒100万条消息的读写
- 消息持久化:所有消息均被持久化到磁盘,无消息丢失,支持消息重放
- 完全分布式:
Producer
`Broker\
Consumer`均支持水平扩展 - 同时满足适应在线流处理和离线批处理