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

  • 时间:
  • 浏览:0
  • 来源:大发彩神计划版网址—大发彩神稳赢计划

1.1 增强Message属性

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

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

业务方对消息中间件的需求

消息中间件中的一些概念

哪些是分布式消息中间件?

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

Message一般只包含topic、tag、content哪些属性,哪些属性也是使用方在发送都有涉及到的内容。或者光哪些属性往往是不够的,比如亲们 会可不可不可以记录产生这条消息的Producer的信息;记录消息的产生时间和产生的IP信息等等。哪些信息都有 在Client中给消息附打上去去的,对发送方来说是透明的,而是不要再在Message实体中暴露,而是亲们 会增加俩个实体:EnhancedMessage。

bornTime

消息的写入和读取流程

还有俩个重要的实体是消费进度,系统可不可不可以记录“每个”Consumer的消费进度,且这些 数据可不可不可以被持久化。

发送过程中会涉及到队列的挑选(分区的挑选),一根消息最终会根据一定的策略落到俩个分区中,这可不可不可以否俩个组件来完成挑选(把这些 组件单独抽象出来,曾经便于控制写入的目标来进行测试,抽象出来也可不可不可以由使用方来实现,曾经可不可不可以按照使用方自己的场景做特定的路由)。

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

拿到俩个Topic所有的分区,对这些 列表进行排序

实现的策略一般是:

伪代码:

Broker模块划分

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

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

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

2.2 消息缓存

欢迎关注公众号来交流MQ相关问題。

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

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

producer

1.2 Queue的路由挑选

往期文章:

每个分区和Consumer都有 唯一的ID,曾经其他人按照排序后的结果进行分配,可不可不可以达到相互不交叉且不遗漏的目的。(在Consumer总数或分区数所处变化的过程中机会分配结果不正确,这些 过程是短暂的,且在消费时都有结合锁去保证分区非要俩个Consumer消费,而是不要再对实际消费产生影响)。

接上一篇《消息中间件核心实体(0)》,这些 篇继续介绍消息中间件中的一些实体。

NameServer模块划分

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

消息中间件架构讨论

中间的WritableQueue暴露了API去写入,具体实现可不可不可以有写入到网络,即远端的俩个Partition。而在做单元测试机会本地测试的完后 ,可不可不可以覆盖write的实现,而不要再真正写入到网络中,这会使代码更容易测试测试。

同样记住一些,这些 分配策略是可不可不可以暴露出去的,系统可不可不可以默认实现集群消费和广播消费的基础策略,用户可不可不可以实现自己的分配策略注入到系统中。

etc

2.3 消费进度

集群消费中可不可不可以保证每个分区有且非要俩个Consumer在进行消费。机会某个分区那么 Consumer消费,那么 使用方拿非要完整版的数据;机会某个分区被俩个Consumer消费,那么 会产生几滴 的重复消息。而是这可不可不可以否实现俩个分区分配策略,使在分布式环境中,每个Consumer拿到属于自己的分区,且相互交叉。下面是五个分区俩个Consumer默认情况表下的分配结果。

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

2.1 分配分区

bornAddress

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

这些 组件会比较简单,或者在集成的完后 可不可不可以注意一些,这些 组件用户可不可不可以自己注入到Producer中来达到控制分区挑选策略的目的。

两种Buffer都有 很复杂性的主次,或者可不可不可以考虑一些流控策略,比如Buffer使用率到2个时降低从服务端获取数据的频率。

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

Consumer可不可不可以在每一次获撤除息时将消费进度提交到服务端,在服务端来更新Cursors内内外部的数据。

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

向队列写入消息(可不可不可以有队列暴露写入接口机会由专门的写入工具写入到队列中)

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

Client模块划分

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

获取可不可不可以写入的队列(也可不可不可以理解成获取分区)

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

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