消息中间件需要解决什么问题?
Publish/Subscribe(发布/订阅)
发布订阅是消息中间件最基本的功能。
Message Priority(消息优先级)
在一个消息队列中,每条消息都有不同的优先级,一般用整数描述,优先级高的消息先投递,如果消息完全在一个内存队列,那么在投递前可以按照优先级排序,令优先级高的先投递。
RocketMQ所有的消息都是持久化的,所以如果按照优先级排序,开销非常大,智能通过变通的形式实现类似功能,即配置一个单独的有限队列和一个普通队列,不同优先级的发送到不同队列。
Message Order(消息有序)
消息有序指的是一类消息消费时,能按照发送的顺序来消费。比如一个订单产生3条消息,订单创建、付款、完成。消费时,需要按照这个消费顺序才有意义。但订单之间是可以并行消费的。
Message Filter(消息过滤)
Broker端消息过滤,减少Consumer无用消息的网络传输。
Comsumer端消息过滤,由应用自定义。
Message Persistence(消息持久化)
持久化部分的性能,直接决定了整个消息中间件的性能。
一般通常采用几种持久化方式:
- 持久化到数据库
- 持久化到KV存储
- 文件记录
- 对内存数据坐持久化镜像
Message Reliablity(消息可靠性)
影响消息可靠性的几种情况:
- Broker正常关闭
- Broker异常Crash
- OS Crash
- 机器掉电,但是能立即恢复
- 机器无法开机(可能是关键设备损坏)
- 磁盘损坏
LowLatencyMessaging(低延时消息)
在消息不堆积的情况下,消息到达Broker后,能立刻到达Consumer。
RocketMQ使用长轮训拉取,可以保证消息实时性。
AtLeastOnce(至少消费一次)
消费者将消息pull到本地,消费完成后,才向服务器返回。
ExactlyOnlyOnce(消息不重复)
消费者和服务者,不重复消费或发送消息。
Broker的Buffer满了怎么办
持久化磁盘,定期清楚。
回溯消费
消费者已经成功的消费了消息,由于业务需要重新消费消息。
消息堆积
消息堆积可以挡住前端的数据洪峰,相对于大坝的功能
分布式事物
定时消息
指消息发到Broker后,不能立刻被消费者消费,需要到特定的时间后才能被消费
消息重试
Consumer消费消息失败后, 要提供重试机制,让消息再消费一次