RocketMQ:分布式开放消息系统
消息中间件需要解决哪些问题?
发布订阅(Publish/Subscribe)
发布订阅是消息中间件的最基本功能,也是相对于传统RPC通信而言。在此不再详述。
消息优先级(Message Priority)
两种方式:
- 严格优先级,例如0-65535。开销大,精准,但可能没有必要。
- 档位优先级。高、中、低,或其他。每个优先级可以用不同的topic表示,发消息时,指定不同的topic来表示优先级。精确性低。
消息有序性(Message Order)
- 一个订单的发出的消息顺序不能变
- 订单之间是可以并行消费
消息过滤(Message Filter)
消息协商器(Broker端)消息过滤
在Broker中,按照Consumer的要求做过滤 1. 优点是减少了对于Consumer无用消息的网络传输。 2. 缺点是增加了Broker的负担,实现相对复杂。
淘宝Notify支持多种过滤方式: 包含直接按照消息类型过滤,灵活的语法表达式过滤,几乎可以满足最苛刻的过滤需求。
淘宝RocketMQ支持按照简单的Message Tag过滤,也支持按照Message Header、body进行过滤。
CORBA Notification规范中也支持灵活的语法表达式过滤。
Consumer端消息过滤
这种过滤方式可由应用完全自定义实现,但是缺点是很多无用的消息要传输到Consumer端。
消息持久化(Message Persistence)
持久化(Persistence):即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
消息中间件通常采用的几种持久化方式:
- 持久化到数据库,例如Mysql。
- 持久化到KV存储,例如levelDB、伯克利DB等KV存储系统。
- 文件记录形式持久化,例如Kafka,RocketMQ
- 对内存数据做一个持久化镜像,例如beanstalkd,VisiNotify
- (1)、(2)、(3)三种持久化方式都具有将内存队列Buffer进行扩展的能力,(4)只是一个内存的镜像,作用是当Broker挂掉重启后仍然能将之前内存的数据恢复出来。
JMS与CORBA Notification规范没有明确说明如何持久化,但是持久化部分的性能直接决定了整个消息中间件的性能。
RocketMQ充分利用Linux文件系统内存cache来提高性能。
消息可靠性(Message Reliablity)
响消息可靠性的几种情况:
- Broker正常关闭
- Broker异常Crash
- OS Crash
- 机器掉电,但是能立即恢复供电情况。
- 机器无法开机(可能是cpu、主板、内存等关键设备损坏)
- 磁盘设备损坏
(1)、(2)、(3)、(4)四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。
(5)、(6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。
RocketMQ从3.0版本开始支持同步双写。