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

  • 时间:
  • 浏览:0
  • 来源:幸运飞艇_幸运飞艇官方

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

有一种组件会比较简单,而且 在集成的事先 都都能能 注意有一种,有一种组件用户都都能能 另一方注入到Producer中来达到控制分区选泽策略的目的。

etc

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

每个分区和Consumer时会 唯一的ID,没办法 该人按照排序后的结果进行分配,都都能能 达到相互不交叉且不遗漏的目的。(在Consumer总数或分区数处于变化的过程中机会分配结果不正确,有一种过程是短暂的,且在消费时时会结合锁去保证分区只能有一三个小Consumer消费,什么都时会对实际消费产生影响)。

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

这段是Rocket开源版本中真正将消息写入到网络的实现,看起来总爱非常臃肿,另外我想知道是如可mock哪几种实现以达到在本地做测试的目的的。

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

实现的策略一般是:

向队列写入消息(都都能能 是队列暴露写入接口机会由专门的写入工具写入到队列中)

1.2 Queue的路由选泽

bornTime

路由组件非常的简单,一般是Router会根据topic获取到topic的元数据(元数据含高了多有分区的信息),而且 根据消息的属性机会用户的参数计算出落到哪个分区,比如都都能能 根据用户的参数对分区总数取模来选泽分区,没办法 都都能能 做到将某一类消息发送到有一三个小分区,比如同有一三个小用户的消息或同一笔订单的不同消息。

2.1 分配分区

2.3 消费进度

Broker模块划分

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

伪代码:

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

1.1 增强Message属性

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

获取都都能能 写入的队列(都里都能能 理解成获取分区)

NameServer模块划分

上一篇主而是 Message、Topic、TopicMeta和Queue没办法 最基础的实体,这几篇介绍有一种发送和消费的过程中会涉及到的实体和组件。

有一种Buffer时会 很繁复的每段,而且 都都能能 考虑有一种流控策略,比如Buffer使用率到几只时降低从服务端获取数据的频率。

Client模块划分

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

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

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

Message一般只含高topic、tag、content哪几种属性,哪几种属性也是使用方在发送时会涉及到的内容。而且 光有哪几种属性往往是不足的,比如亲们会都都能能 记录产生这条消息的Producer的信息;记录消息的产生时间和产生的IP信息等等。哪几种信息时会 在Client中给消息附添加去的,对发送方来说是透明的,什么都时会在Message实体中暴露,而是 亲们会增加有一三个小实体:EnhancedMessage。

消息里边件架构讨论

producer

里边的WritableQueue暴露了API去写入,具体实现都都能能 是写入到网络,即远端的有一三个小Partition。而在做单元测试机会本地测试的事先 ,都都能能 覆盖write的实现,而时会真正写入到网络中,这会使代码更容易测试测试。

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

往期文章:

2.2 消息缓存

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

消息的写入和读取流程

消息里边件中的有一种概念

bornAddress

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

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

集群消费中都都能能 保证每个分区有且只能有一三个小Consumer在进行消费。机会某个分区没办法 Consumer消费,没办法 使用方拿只能完整篇 的数据;机会某个分区被有一三个小Consumer消费,没办法 会产生血块的重复消息。什么都这都里都能能 实现有一三个小分区分配策略,使在分布式环境中,每个Consumer拿到属于另一方的分区,且相互交叉。下面是三个小分区有一三个小Consumer默认情形下的分配结果。

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

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

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

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

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

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

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

RocketMQ在TopicPublishInfo中实现分区的选泽,TopicPublishInfo含高了队列信息(List<MessageQueue> messageQueueList属性),笔者更倾向于抽象出独立的路由组件,以便在特定的场景用户都都能能 另一方实现路由,机会在测试时都都能能 做到使用特定路由规则。

根据另一方处于的Consumer列表的位置和Consumer总数,从分区列表中获取对应的一每段

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