RocketMQ笔记

  1. RocketMQ笔记
    1. NameServer
    2. 顺序消费
      1. 消息积压处理

RocketMQ笔记

NameServer

消息客户端与NameServerBroker的交互设计要点如下。

1)Broker每隔30s向NameServer集群的每一台机器发送心跳包,包含自身创建的topic路由等信息。
2)消息客户端每隔30s向NameServer更新对应topic的路由信息。
3)NameServer收到Broker发送的心跳包时会记录时间戳。
4)NameServer每隔10s会扫描一次brokerLiveTable(存放心跳包的时间戳信息),如果在120s内没有收到心跳包,则认为Broker失效,更新topic的路由信息,将失效的Broker信息移除。

同一个groupname的消费者订阅同一个topic 会根据instanceName 进行负载均衡没有指定会默认指定ip +pid

顺序消费

https://www.cnblogs.com/qdhxhz/p/11134903.html

https://www.cnblogs.com/crazymakercircle/p/17948000

https://juejin.cn/post/7149152825426542600

如何保证消息的顺序性

Apache RocketMQ 的消息的顺序性分为两部分,生产顺序性和消费顺序性。

  • 生产顺序性

    Apache RocketMQ 通过生产者和服务端的协议保障单个生产者串行地发送消息,并按序存储和持久化。

    如需保证消息生产的顺序性,则必须满足以下条件:

    • 单一生产者:消息生产的顺序性仅支持单一生产者,不同生产者分布在不同的系统,即使设置相同的消息组,不同生产者之间产生的消息也无法判定其先后顺序。
    • 串行发送:Apache RocketMQ 生产者客户端支持多线程安全访问,但如果生产者使用多线程并行发送,则不同线程间产生的消息将无法判定其先后顺序。

    个人理解:

    比如流水线生产东西,多个流水线,每个流水线之间的产品流程按顺序进行生产,互不干扰,最后发货;相当于顺序消息分为全局顺序消息与部分顺序消息,全局顺序是指某个Topic下的所有消息都要保证顺序;部分顺序消息只要保证每一组消息被顺序消费即可。流水线就属于部分顺序消息,如果想要实现全局顺序消息,那么只能使用一个队列,以及单个生产者,这是会严重影响性能。

一条订单产生的三条消息:订单创建、订单付款、订单完成。上面三消息是有序的,消费时要按照这个顺序依次消费才有意义,但是不同的订单之间这些消息是可以并行消费的。

全局顺序可以指定只有一个queue

局部有序,生产者发送一组数据到一个队列中,消费时一个线程消费一个队列的数据

消息积压处理

https://www.cnblogs.com/crazymakercircle/p/17895128.html

  • 通过配置多线程数量开启

    • 顺序消费时也是可以开启多线程消费的,每隔线程对应一个队列,保证同一个流程的消息是发送有序的,发送到同一个queue中,消费时每隔线程会对一个queue加锁处理
  • 部署多个消费者实例