甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

RocketMQ简介

RocketMQ:分布式开放消息系统

消息中间件需要解决哪些问题?

发布订阅(Publish/Subscribe)

发布订阅是消息中间件的最基本功能,也是相对于传统RPC通信而言。在此不再详述。

消息优先级(Message Priority)

两种方式:

  1. 严格优先级,例如0-65535。开销大,精准,但可能没有必要。
  2. 档位优先级。高、中、低,或其他。每个优先级可以用不同的topic表示,发消息时,指定不同的topic来表示优先级。精确性低。

消息有序性(Message Order)

  1. 一个订单的发出的消息顺序不能变
  2. 订单之间是可以并行消费

消息过滤(Message Filter)

消息协商器(Broker端)消息过滤

在Broker中,按照Consumer的要求做过滤 1. 优点是减少了对于Consumer无用消息的网络传输。 2. 缺点是增加了Broker的负担,实现相对复杂。

淘宝Notify支持多种过滤方式: 包含直接按照消息类型过滤,灵活的语法表达式过滤,几乎可以满足最苛刻的过滤需求。

淘宝RocketMQ支持按照简单的Message Tag过滤,也支持按照Message Header、body进行过滤。

CORBA Notification规范中也支持灵活的语法表达式过滤。

Consumer端消息过滤

这种过滤方式可由应用完全自定义实现,但是缺点是很多无用的消息要传输到Consumer端。

消息持久化(Message Persistence)

持久化(Persistence):即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。

消息中间件通常采用的几种持久化方式:

  1. 持久化到数据库,例如Mysql。
  2. 持久化到KV存储,例如levelDB、伯克利DB等KV存储系统。
  3. 文件记录形式持久化,例如Kafka,RocketMQ
  4. 对内存数据做一个持久化镜像,例如beanstalkd,VisiNotify
  5. (1)、(2)、(3)三种持久化方式都具有将内存队列Buffer进行扩展的能力,(4)只是一个内存的镜像,作用是当Broker挂掉重启后仍然能将之前内存的数据恢复出来。

JMS与CORBA Notification规范没有明确说明如何持久化,但是持久化部分的性能直接决定了整个消息中间件的性能。

RocketMQ充分利用Linux文件系统内存cache来提高性能。

消息可靠性(Message Reliablity)

响消息可靠性的几种情况:

  1. Broker正常关闭
  2. Broker异常Crash
  3. OS Crash
  4. 机器掉电,但是能立即恢复供电情况。
  5. 机器无法开机(可能是cpu、主板、内存等关键设备损坏)
  6. 磁盘设备损坏

(1)、(2)、(3)、(4)四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。

(5)、(6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。

RocketMQ从3.0版本开始支持同步双写。

参考文献

  1. 十分钟入门RocketMQ