欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

RocketMQ的工作流程

时间:2023-04-19
工作流程:

        1、启动NameServer,NameServer启动后开始监听端口,等待broker,producer,consumer连接

        2、启动broker时,broker会和所有的NameServer建立并保持长链接,然后每隔30s向NameServer定时发送心跳包

        3、发送消息前,可以先创建Topic,创建Topic时需要指定该topic要存储在哪些broker上,同时也会将topic和broker的关系写入到NameServer,不过这步并不是必需的,也可以在发送消息时自动创建topic

手动创建Topic有两种模式:

   1)集群模式:该模式下创建的Topic在该集群中,所有Broker的Queue数量是相同的。

   2)Broker模式:该模式下创建的Topic在该集群中,每个Broker的Queue数量可以不同。

自动创建Topic时,默认采用Broker模式,会为每个Broker默认创建4个Queue

        4、producer发送消息,启动时与NameServer集群中的其中一台建立长链接,并从NameServer中获取路由信息,即当前发送的Topic和Queue与Broker的地址(IP+Port)的映射关系。然后根据算法策略从队列选择一个Queue,与队列所在的broker建立长链接从而向broker发送消息。在获取到路由信息后,Producer会首先将路由信息缓存到本地,再每隔30s从NameServer更新一个路由信息。

        5、Consumer和Producer类似。和其中一个NameServer建立长链接,获取其所订阅的Topic信息,然后根据算法策略从路由信息中获取到所要消费的Queue,然后和broker建立长链接,开始消费其中的消息。Consumer在获取到路由信息后,也会每隔30s从NameServer更新一次路由信息,不过和Producer不同的是,Consumer还会向Broker发送心跳,以确保Broker的存活状态。

读/写队列:

从物理上来讲,读和写是同一个队列,不存在读写队列的数据同步问题,读/写队列是逻辑上进行区分的概念。一般情况下,读/写队列数量是相同的。也有特殊情况:

例如:创建Topic时设置的写队列数量为8,读队列数量为4,则会创建8个队列,分别是0~7,Producer会将消息写入到8个队列中,而Consumer只会消费0~3队列中的消息,剩下的消息是不会被消费的。

再如:创建Topic时设置的写队列数量为4,读队列数量为8,则会创建8个队列,分别是0~7,Producer会将消息写入到4个队列中,而Consumer会消费0~7队列中的消息,但因为4~7是没有消息的,则若Consumer Groups中有两个Consumer,其中一个是没有消息可消费的。

这样设计的目的是为了方便Queue的缩容

例如:原来创建的Topic有16个Queue,如何能使Queue缩容为8个,而且不丢失信息?

答:可以动态修改队列数量为8.首先读队列的数量不变,此时新的消息只能写入前八个队列,而消费的仍然是16个队列中的数据。当发现8个Queue中的数据都消费完成后,再修改读队列的数量为8.

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。