核心问题

顺序消息
如何保证顺序消息?
顺序由producer发送到broker的消息队列是满足FIFO的,所以发送是顺序的,单个queue里的消息是顺序的。多个Queue同时消费是无法绝对保证消息的有序性的。所以,同一个topic,同一个queue,发消息的时候一个线程发送消息,消费的时候一个线程去消费一个queue里的消息。
追问:怎么保证消息发到同一个queue里?
RocketMQ给我们提供了MessageQueueSelector接口,可以重写里面的接口,实现自己的算 法,比如判断i%2==0,那就发送消息到queue1否则发送到queue2。
消息过滤
如何实现消息过滤?
有两种方案,一种是在broker端按照Consumer的去重逻辑进行过滤,这样做的好处是避免了无用的消息传输到Consumer端,缺点是加重了Broker的负担,实现起来相对复杂。另一种是在Consumer端过滤,比如按照消息设置的tag去重,这样的好处是实现起来简单,缺点是有大量无用的消息到达了Consumer端只能丢弃不处理。
消息去重

如果由于网络等原因,多条重复消息投递到了Consumer端,你怎么进行消息去重?
这个得先说下消息的幂等性原则:就是用户对于同一种操作发起的多次请求的结果是一样的,不 会因为操作了多次就产生不一样的结果。只要保持幂等性,不管来多少条消息,最后处理结果都一 样,需要Consumer端自行实现。
去重的方案:因为每个消息都有一个MessageId, 保证每个消息都有一个唯一键,可以是数据库的主键或者唯一约束,也可以是Redis缓存中的键,当消费一条消息前,先检查数据库或缓存中是否 存在这个唯一键,如果存在就不再处理这条消息,如果消费成功,要保证这个唯一键插入到去重表 中。
分布式事务消息
你知道半消息吗?RocketMQ是怎么实现分布式事务消息的?
半消息:是指暂时还不能被Consumer消费的消息,Producer成功发送到broker端的消息,但是此消息被标记为“暂不可投递”状态,只有等Producer端执行完本地事务后经过二次确认了之后, Consumer才能消费此条消息。

猜你喜欢

转载自blog.csdn.net/qq_42918433/article/details/113914589