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

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

拿到有有还还有一个 Topic所有的分区,对什儿 列表进行排序

1.1 增强Message属性

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

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

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

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

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

什儿 组件会比较简单,如果 在集成的随可不都后能 够 注意什儿 ,什儿 组件用户还能够 此人 注入到Producer中来达到控制分区选着 策略的目的。

有什儿 Buffer也有所以样化的次要,如果 能够 考虑什儿 流控策略,比如Buffer使用率到几只时降低从服务端获取数据的频率。

bornAddress

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

NameServer模块划分

伪代码:

获取还能够 写入的队列(也还能够 理解成获取分区)

2.1 分配分区

producer

路由组件非常的简单,一般是Router会根据topic获取到topic的元数据(元数据富含了多有分区的信息),如果 根据消息的属性肯能用户的参数计算出落到哪个分区,比如还能够 根据用户的参数对分区总数取模来选着 分区,曾经还能够 做到将某一类消息发送到有有还还有一个 分区,比如同有有还还有一个 用户的消息或同一笔订单的不同消息。

2.2 消息缓存

Message一般只富含topic、tag、content哪几种属性,哪几种属性也是使用方在发送时会 涉及到的内容。如果 光有哪几种属性往往是过低的,比如亲戚亲戚朋友会能够 记录产生这条消息的Producer的信息;记录消息的产生时间和产生的IP信息等等。哪几种信息也有在Client中给消息附换成去的,对发送方来说是透明的,所以不要在Message实体中暴露,如果 亲戚亲戚朋友会增加有有还还有一个 实体:EnhancedMessage。

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

消息里边件架构讨论

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

里边的WritableQueue暴露了API去写入,具体实现还能够 是写入到网络,即远端的有有还还有一个 Partition。而在做单元测试肯能本地测试的如果,还能够 覆盖write的实现,而不要真正写入到网络中,这会使代码更容易测试测试。

消息的写入和读取流程

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

往期文章:

消息里边件中的什儿 概念

每个分区和Consumer也有唯一的ID,曾经该人按照排序后的结果进行分配,还能够 达到相互不交叉且不遗漏的目的。(在Consumer总数或分区数处于变化的过程中肯能分配结果不正确,什儿 过程是短暂的,且在消费时时会 结合锁去保证分区必须有有还还有一个 Consumer消费,所以不要对实际消费产生影响)。

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

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

集群消费中能够 保证每个分区有且必须有有还还有一个 Consumer在进行消费。肯能某个分区必须Consumer消费,必须使用方拿必须完正的数据;肯能某个分区被有有还还有一个 Consumer消费,必须会产生极少量的重复消息。所以这还可不都后能 够 实现有有还还有一个 分区分配策略,使在分布式环境中,每个Consumer拿到属于此人 的分区,且相互交叉。下面是还还有一个分区有有还还有一个 Consumer默认情况表下的分配结果。

2.3 消费进度

etc

Client模块划分

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

同样记住什儿 ,什儿 分配策略是能够 暴露出去的,系统还能够 默认实现集群消费和广播消费的基础策略,用户还能够 实现此人 的分配策略注入到系统中。

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

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

Consumer还能够 在每一次获取消息时将消费进度提交到服务端,在服务端来更新Cursors內部的数据。

1.2 Queue的路由选着

发送过程中会涉及到队列的选着 (分区的选着 ),第一根消息最终会根据一定的策略落到有有还还有一个 分区中,这还可不都后能 够 有有还还有一个 组件来完成选着 (把什儿 组件单独抽象出来,曾经便于控制写入的目标来进行测试,抽象出来也还能够 由使用方来实现,曾经还能够 按照使用方此人 的场景做特定的路由)。

RocketMQ在TopicPublishInfo中实现分区的选着 ,TopicPublishInfo富含了队列信息(List<MessageQueue> messageQueueList属性),笔者更倾向于抽象出独立的路由组件,以便在特定的场景用户还能够 此人 实现路由,肯能在测试时还能够 做到使用特定路由规则。

根据此人 处于的Consumer列表的位置和Consumer总数,从分区列表中获取对应的一次要

向队列写入消息(还能够 是队列暴露写入接口肯能由专门的写入工具写入到队列中)

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

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

Broker模块划分

bornTime

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

实现的策略一般是:

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

欢迎关注公众号来交流MQ相关哪几种的问提。

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