首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

消息中间件的四种投递模式对比

2019-12-19

音讯中间件在企业开发中变得越来越重要。本文介绍音讯中间件中的四种音讯投递模型,主要是介绍模型的中心特性,以及不同模型之前的差异。这四种模型分别是:

PTP模型

Pub/Sub模型

Partition模型

Transfer模型

其间PTP模型和Pub/Sub模型在JMS标准中有界说,音讯中间件ActiveMQ就完结了JMS标准。可是一些音讯中间件,并没有完结JMS标准,而是自己规划出了一套模型,例如Kafka和RocketMQ就选用了Partition模型。此外业界还有一些其他的音讯投递模型,例如Transfer模型,这是笔者自己起的姓名。

1 PTP模型

Point-to-Point,点对点通信模型。 PTP是根据行列的,一个行列能够有多个生产者,和多个顾客。 音讯服务器依照收到音讯的先后次序,将音讯放到行列中。 行列中的每一条音讯,只能由一个顾客进行消费,消费之后就会从行列中移除。

需求留意的是,虽然这儿运用Queue的概念,但并不是先进入行列音讯,必定会被先消费。 在存在多个下流Consumer状况下,一些音讯中间件,例如ActiveMQ,为了提高消费才干,会将行列中的音讯分发到不同Consumer并行进行处理。 这意味着音讯发送的时分或许是有序的,可是在消费的时分,就变成无序了。

为了确保消费的有序,一些MQ供给了 专有顾客” 或许 排他顾客” 的概念,在这种状况下,行列中的音讯仅答应一个顾客进行消费,假如存在多个顾客,那么从中挑选一个。 可是,这意味着在音讯在处理中没有了并行性。 假如音讯量许多的状况下,将会发生音讯积压。

为了处理 专有顾客”的功能问题,一些音讯中间件选用分区的概念来处理功能问题,咱们将在后文进行介绍。

2 Pub/Sub模型

publish-and- subscribe, 即发布订阅模型。 在Pub/Sub模型中,生产者将音讯发布到一个主题中,订阅了该Topic的一切下流顾客,都能够接收到这条音讯。 如下图:

通常状况下,一个条音讯只需被消费一次就行了,那么什么状况下需求一切的顾客都对这条音讯进行消费呢? 最典型的状况便是需求在内存中对数据进行缓存,并需求实时进行更新。

例如,笔者做过一个违禁词体系,对用户输入的谈论内容进行违禁词汇检测。 这个违禁词体系,布置了在N台服务器上,为了提高检测功能,每台机器都会将违禁词库全量加载到内存中,词库的更新,是经过发送MQ音讯来完结的。 因为选用Pub/Sub模型,每台机器的consumer,都能够接收到这条音讯,直接在内存中更新灵敏词库即可。

3 Partition模型

为了处理在PTP模型下,有序音讯需求经过 专有顾客”消费带来的功能问题,一些音讯中间件,如rocketmq,kafka选用了Partition模型,即分区模型,如下所示:

生产者发送音讯到某个Topic中时,终究挑选其间一个Partition进行发送。 你能够将Parition模型中的分区,了解为PTP模型的行列,不同的是,PTP模型中的行列存储的是一切的音讯,而每个Partition只会存储部分数据。

关于音讯者,此刻多了一个顾客组的概念,Paritition会在同一个顾客组下的顾客中进行分配,每个顾客只消费分配给自己的Paritition。 上图演示了不同的顾客或许会分配到不同数量的 Paritition 。

Paritition形式奇妙的将PTP模型和Pub/Sub模型结合在了一同:

关于PTP模型:

一条音讯只会由一个顾客进行消费,而Partition模型中每个分区终究也只会有一个顾客进行消费。 关于经过 专有顾客 来确保大局消费有序的场景,在Partition模型中,只需确保创立的Topic只需一个Partition即可,这个Paritition终究也只会分配其间一个顾客。 别的,在绝大部分场景下,咱们没有必要确保大局有序,例如一个订单发生了3条音讯,分别是订单创立,订单付款,订单完结。消费时,要依照这个次序消费才干有意义。可是订单之间是能够并行消费的,例如将订单1发生的3条音讯发送到Partiton 1,将订单2发生的3条音讯发送到Partition 2,如此便到达了不同订单之间的并行消费。

关于Pub/Sub模型:

一条音讯一切的下流顾客都能够进行消费。 在Paritition模型中,只需求为每个顾客设置成不同的顾客组即可。 可是,过多的顾客组,会给音讯中间件运维带来费事。所以一些音讯中间件,结合了Partition模型和Pub/Sub模型。例如RocketMQ,支撑为顾客组设置消费形式,假如是集群形式,就依照上述描绘进行消费,假如是播送形式,就依照Pub/Sub模型进行消费。

当然,Partition模型也不全是长处,其最大的约束在于Partition数量是固定的,且只能够分配给其间一个顾客。 当顾客的数量大于Partition数量时,这些多出来的顾客将无法消费到音讯。

一些音讯中间件对此进行了优化,例如rocketmq,支撑单个partition的并行消费。 即在对单个顾客内,一起发动多个线程,来消费这个Partition中的数据,当然条件是要求音讯不是有序的,关于有序的音讯,只能运用一个线程按次序消费这个Partition中的数据。

4 Transfer模型

Paritition模型中的顾客组概念很有用,同一个Topic下的音讯能够由多个不同业务方进行消费,只需运用不同的顾客组即可,不同顾客组消费到的方位独自记载,互不影响。  可是,Paritition模型仍是约束了顾客数量不能多于分区数。

因而,又有了别的一种消费模型,笔者称之为Transfer模型,如下图所示:

生产者仍是将音讯发送到Topic中,针对一个Topic,能够创立多个通道,这儿称之为channel。 与分区不同的是,发送到Topic中的每条音讯,都会转发到每个channel,因而每个channel都有这个Topic的全量数据。 当然,没有必要把真的把音讯体完好的复制一份到channel中,能够只记载一下音讯元数据,表明有一条放到这个channel中了。

顾客在消费音讯时,有必要指定从哪个channel消费。 多个顾客消费同一个channel时,每条音讯只会有一个顾客消费到达,这一点与PTP模型相似。 事实上,咱们能够以为,消费了同一个channel的顾客,就主动组成了一个顾客组。 可是,与Partition模型不同的是,这儿没有分区的概念,因而顾客的数量能够是恣意的。 事实上,GO言语编写的NSQ音讯中间件,选用的便是这种模型。

当然,这种模型与PTP相同,也不能确保被音讯有序,除非经过相似于”专用顾客”的概念。

长按二维码,重视我,加老友,进群沟通

数据库中间件详解

异地多活场景下的数据同步之道

mysql binlog使用场景与原理深度分析

InnoDB MVCC 机制

深化了解数据库编程中的超时设置

可靠音讯一致性的奇淫技巧

分布式业务概述

详解HTTP 与TCP中Keep-Alive机制的差异

TCP粘包、拆包与通信协议详解

分析Spring多数据源

热门文章

随机推荐

推荐文章