消息中间件核心实体(1)

  • 时间:
  • 浏览:0

2.2 消息缓存

消费都须要分为多种辦法 ,从获撤除息的辦法 上都须要分为Pull和Push四种 类型的Consumer;从消费消息的辦法 上都须要分为集群消费和广播消费。这里不展开讨论各种模式的实现(原先单独会讨论Consumer该实现哪几种内容),会以Push模式&集群消费的Consumer为例,把消费流程中涉及到的一点组件进行介绍。

bornTime

根据自己处在的Consumer列表的位置和Consumer总数,从分区列表中获取对应的一部分

四种 组件会比较简单,有但是在集成的原先须要注意一点,四种 组件用户都须要自己注入到Producer中来达到控制分区选着策略的目的。

获取都须要写入的队列(也都须要理解成获取分区)

接上一篇《消息里面件核心实体(0)》,四种 篇继续介绍消息里面件中的一点实体。

里面两幅图是Rocket开源版本中发送相关的一点代码,私以为这段代码非常的不优雅,读起来很糙累,很糙是requestHeader的各种属性设置。

欢迎关注公众号来交流MQ相关难题。

每个分区和Consumer就有唯一的ID,原先所有人 按照排序后的结果进行分配,都须要达到相互不交叉且不遗漏的目的。(在Consumer总数或分区数处在变化的过程中因为分配结果不正确,四种 过程是短暂的,且在消费时不会结合锁去保证分区还不都可以 一一个 Consumer消费,好多好多 不想对实际消费产生影响)。

路由组件非常的简单,一般是Router会根据topic获取到topic的元数据(元数据所含了多有分区的信息),有但是根据消息的属性因为用户的参数计算出落到哪个分区,比如都须要根据用户的参数对分区总数取模来选着分区,原先都须要做到将某一类消息发送到一一个 分区,比如同一一个 用户的消息或同一笔订单的不同消息。

RocketMQ中实现消息缓存由ProcessQueue实现,笔者倾向于独立出Buffer模块,另外Buffer须要提供锁,以实现顺序消费。

业务方对消息里面件的需求

消息里面件中的一点概念

消息里面件架构讨论

实现的策略一般是:

这段是Rocket开源版本中真正将消息写入到网络的实现,看起来老要非常臃肿,另外我没哟乎 是怎样mock哪几种实现以达到在本地做测试的目的的。

引申一点,Producer发送消息的大致过程如下:

Client模块划分

往期文章:

因为本文对您有帮助,点一下右下角的“推荐”

消息缓存除了提供基础的put和take来实现存入消息和取出消息,还须要自身容量,水位控制等配置。

集群消费中须要保证每个分区有且还不都可以 一一个 Consumer在进行消费。因为某个分区那末Consumer消费,那末使用方拿还不能 全版的数据;因为某个分区被一一个 Consumer消费,那末会产生极少量的重复消息。好多好多 这里须要实现一一个 分区分配策略,使在分布式环境中,每个Consumer拿到属于自己的分区,且相互交叉。下面是一个分区一一个 Consumer默认清况 下的分配结果。

上一篇主假如Message、Topic、TopicMeta和Queue原先最基础的实体,这几篇介绍一点发送和消费的过程中会涉及到的实体和组件。

消息里面件核心实体(0)

伪代码:

增强Message属性,得到EnhancedMessage的实例

四种 Buffer就有好多好多 样化的部分,有但是须要考虑一点流控策略,比如Buffer使用率到几个时降低从服务端获取数据的频率。

Message一般只所含topic、tag、content哪几种属性,哪几种属性也是使用方在发送不会涉及到的内容。有但是光有哪几种属性往往是严重不足的,比如让当我们 会须要记录产生这条消息的Producer的信息;记录消息的产生时间和产生的IP信息等等。哪几种信息就有在Client中给消息附换成去的,对发送方来说是透明的,好多好多 不想在Message实体中暴露,假如让当我们 会增加一一个 实体:EnhancedMessage。

还有一一个 重要的实体是消费进度,系统须要记录“每个”Consumer的消费进度,且四种 数据须要被持久化。

哪几种是分布式消息里面件?

发送过程中会涉及到队列的选着(分区的选着),三根消息最终会根据一定的策略落到一一个 分区中,这里须要一一个 组件来完成选着(把四种 组件单独抽象出来,原先便于控制写入的目标来进行测试,抽象出来也都须要由使用方来实现,原先都须要按照使用方自己的场景做特定的路由)。

NameServer模块划分

2.1 分配分区

消费端一一个 重要的组件是消息缓存。为了提升性能,在消费端消息的获取和消息的消费是异步的。Consumer实物有守护多多线程 专门从服务端获撤除息写入到消息缓存中,另外有守护多多线程 从缓存中获撤除息调用用户的回调接口来执行业务操作。

拿到当前所有的Consumer,对Consumer列表进行排序

RocketMQ在TopicPublishInfo中实现分区的选着,TopicPublishInfo所含了队列信息(List<MessageQueue> messageQueueList属性),笔者更倾向于抽象出独立的路由组件,以便在特定的场景用户都须要自己实现路由,因为在测试时都须要做到使用特定路由规则。

向队列写入消息(都须可是队列暴露写入接口因为由专门的写入工具写入到队列中)

bornAddress

Consumer都须要在每一次获撤除息时将消费进度提交到服务端,在服务端来更新Cursors实物的数据。

EnhancedMessage继承自Message,并会增加一点如下的属性:

拿到一一个 Topic所有的分区,对四种 列表进行排序

消费进度须要记录某个Group对某个Topic的某个分区的消费位点。进度是按照Topic维度去组织的(持久化在服务端),实物如下:

producer

里面的WritableQueue暴露了API去写入,具体实现都须可是写入到网络,即远端的一一个 Partition。而在做单元测试因为本地测试的原先,都须要覆盖write的实现,而不想真正写入到网络中,这会使代码更容易测试测试。

1.1 增强Message属性

Broker模块划分

etc

1.2 Queue的路由选着

同样记住一点,四种 分配策略是须要暴露出去的,系统都须要默认实现集群消费和广播消费的基础策略,用户都须要实现自己的分配策略注入到系统中。

最近两篇内容将一点基础实体和组件简单的介绍了一下,下一篇讨论一下消息应该由Server Push给Consumer还是Consumer主动来Pull消息。

消息的写入和读取流程

2.3 消费进度