是不是平时听到说音讯队列啊,JMS啊,MQ啊 、kafka啊巴啦啦的一堆术语,听不懂?关系凌乱?明天就让咱们来一起来看看他们都是什么吧。

音讯队列介绍

首先举个收快递的栗子,传统的收快递,快递小哥把咱们的快递送到咱们的手里。他须要什么条件嗯?

  • 快递小哥有工夫送,
  • 咱们有工夫取,
  • 快递小哥和咱们约定一个工夫地点。

然而嗯。快递小哥有那么多的快递须要送,可能送我快递的时候,我不在家,可能我在家的时候,快递小哥送其余的中央的快递。所以嗯,这个时候,要么就是坐在家里等快递,要么就只能从新约个工夫点在送。那怎么办去防止这个状况嗯?

于是嗯快递柜呈现了。快递小哥不必关怀我什么时候在家,因为快递小哥有工夫了,就把快递放快递柜,而我有工夫了,我就去快递柜取我的快递。

那么快递柜所起到的作用就是咱们明天要收的音讯队列。咱们能够把音讯队列比作是一个寄存快递的的快递柜,当咱们须要获取咱们快递的时候就能够从快递柜外面拿到属于咱们的快递。

什么是音讯队列

咱们能够把音讯队列比作是一个寄存音讯的容器,当咱们须要应用音讯的时候能够取出音讯供本人应用。咱们看看维基百科上的形容:在计算机科学中,音讯队列(Message queue)是一种过程间通信或同一过程的不同线程间的通信形式,软件的贮列用来解决一系列的输出,通常是来自用户。

是不是很难了解,咱们换个说法来了解

咱们能够把音讯队列比作是一个寄存音讯的容器,当咱们须要应用音讯的时候能够取出音讯供本人应用。

音讯队列(Message queue)有什么用?

音讯队列是分布式系统中重要的组件,应用音讯队列次要是为了通过异步解决进步零碎性能和削峰、升高零碎耦合性。罕用消息中间件17个维度全方位比照

通过异步解决进步零碎性能(削峰、缩小响应所需工夫)。

举个例子:咱们在某个网站进行注册账号,咱们须要做如下四件事:

  • 填写咱们的注册信息;
  • 提交咱们的注册信息;
  • 咱们的邮箱收到注册信息;
  • 咱们的短信收到注册信息。

如果采纳同步串行,所须要的工夫是:a+b+c+d

如果采纳同步并行,所须要的工夫是:a+b+max(c,d)

如果采纳音讯队列,所须要的工夫是:a+b+音讯队列

升高零碎耦合性

举个例子,A公司做了某个零碎,B公司感觉A公司的某个性能很好,于是B公司和A公司的零碎进行了集成。这时C公司也感觉A公司的这个性能很好,于是,C公司也和A公司的零碎进行了集成。当前还有D公司…。

介于这种状况,A公司的零碎和其余公司的耦合度都很高,每集成一个公司的零碎,A公司都须要批改本人的零碎。如果采纳音讯队列,则变成了如下:

不论当前还有多少公司的应用程序想要用A公司的程序,都不须要和A公司进行集成,谁须要这个性能,谁就去音讯队列外面获取。

音讯队列的两种模式
  • 点对点模式

应用程序由:音讯队列,发送方,接管方组成。

每个音讯都被发送到一个特定的队列,接收者从队列中获取音讯。队列保留着音讯,直到他们被生产或超时。

  • 公布订阅模式

用用程序有由:角色主题(Topic)、发布者(Publisher)、订阅者(Subscriber)形成。

发布者公布一个音讯,该音讯通过topic传递给所有的客户端。该模式下,发布者与订阅者都是匿名的,即发布者与订阅者都不晓得对方是谁。并且能够动静的公布与订阅Topic。Topic次要用于保留和传递音讯,且会始终保留音讯直到音讯被传递给客户端。

介绍完了音讯队列,接着咱们介绍JMS

JMS介绍

JMS即Java音讯服务(Java Message Service)利用程序接口,是一个Java平台中对于面向消息中间件(MOM)的API,相似于JDBC。用于在两个应用程序之间,或分布式系统中发送音讯,进行异步通信。它提供创立、发送、接管、读取音讯的服务。由Sun公司和它的合作伙伴设计的利用程序接口和相应语法,使得Java程序可能和其余音讯组件进行通信。

JMS是一个音讯服务的规范或者说是标准,容许应用程序组件基于JavaEE平台创立、发送、接管和读取音讯。它使分布式通信耦合度更低,音讯服务更加牢靠以及异步性。

  • 介绍到这里,应该明确了音讯队列和JMS的区别了吧?
  • 音讯队列:计算机科学中,A和B进行通信的一种形式。
  • JMS:java平台之间分布式通信的一种规范或者标准。
  • 换句话说,JMS就是java对于音讯队列的一种实现形式。
JSM音讯模型

点对点,公布订阅,音讯队列中曾经说的很分明了,这里就不反复说了。

JMS生产
  • 同步(Synchronous)

订阅者/接管方通过调用 receive()来接管音讯。在receive()办法中,线程会阻塞直到音讯达到或者到指定工夫后音讯仍未达到。

  • 异步(Asynchronous)

音讯订阅者需注册一个音讯监听者,相似于事件监听器,只有音讯达到,JMS服务提供者会通过调用监听器的onMessage()递送音讯。

JMS编程模型

JMS编程模型十分相似于JDBC。回顾一下,咱们之前讲到的MyBatis。

  • SqlSessionFactoryBuilder去结构SqlSessionFactory会话工厂;
  • SqlSessionFactory会话工厂给咱们关上SqlSession会话;
  • SqlSession帮咱们去连贯数据库,接着咱们就能够执行增删查改。
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession openSession = sqlSessionFactory.openSession(true);ProjectMapper mapper = openSession.getMapper(ProjectMapper.class);mapper.queryAllTaskByInit("init");

JMS模型如下

  • Connection Factory给我创立Connection连贯;
  • Connection连贯给咱们创立了Session会话;
  • Session会话给咱们创立消费者和生产者;
  • 生产者生成音讯;
  • 消费者生产音讯;

MQ介绍

上文中,咱们说到了,JMS他并不是一种真正意义的技术,而是一种接口,一种标准。就想JDBC一样,无论是mybatis、hibernate,还是springJPA,不论你是那种技术实现,反正你得恪守JDBC的标准。

在Java中,目前基于JMS实现的音讯队列常见技术有ActiveMQ、RabbitMQ、RocketMQ。值得注意的是,RocketMQ并没有齐全恪守JMS标准,并且Kafka不是JMS的实现。

AMQP协定

这里咱们以RabbitMQ为例介绍MQ,首先介绍下AMQP

AMQP协定(Advanced Message Queuing Protocol,高级音讯队列协定)是一个过程间传递异步音讯的网络协议。

  • AMQP模型

  • AMQP工作过程
  • 发布者(Publisher)公布音讯(Message),经由交换机(Exchange)。
  • 交换机依据路由规定将收到的音讯分发给与该交换机绑定的队列、(Queue)。
  • 最初 AMQP 代理会将音讯投递给订阅了此队列的消费者,或者消费者依照需要自行获取。

RabbitMQ是MQ产品的典型代表,是一款基于AMQP协定可复用的企业音讯零碎。

RabbitMQ模型

RabbitMQ由两局部组成,别离是服务端和利用端;

  • 服务端包含:队列和交换机。
  • 客户端包含:生产者和消费者。

在rabbitmq server上能够创立多个虚构的message broker。每一个broker实质上是一个mini-rabbitmq server,别离治理各自的exchange,和bindings。

broker相当于物理的server,能够为不同app提供边界隔离,使得利用平安的运行在不同的broker实例上,相互之间不会烦扰。producer和consumer连贯rabbit server须要指定一个broker。音讯队列探秘 – RabbitMQ 音讯队列介绍

Exchange有4种类型:direct(默认),fanout, topic, 和headers

  • Direct:间接交换器,工作形式相似于单播,Exchange会将音讯发送齐全匹配ROUTING_KEY的Queue。
  • Fanout:播送是式交换器,不论音讯的ROUTING_KEY设置为什么,Exchange都会将音讯转发给所有绑定的Queue(所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定能够是多对多的关系)。
  • Topic:主题交换器,工作形式相似于组播,Exchange会将音讯转发和ROUTING_KEY匹配模式雷同的所有队列,比方,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 .stock,user.stock, . 和#.user.stock.#的队列。( 表是匹配一个任意词组,#示意匹配0个或多个词组)。
  • 至于如何在代码中应用RabbitMQ,这里咱们先不撸代码,本文目前只介绍实践梳理知识点。

Kafka

上完中咱们提到过,kafka不是JMS的实现,因而在MQ章节中,咱们没有提及到它。当初咱们开始学习kafka吧。大白话带你意识 Kafka

先来放张kafka的原理图,置信你看到这个图片时,心田是奔溃的。我草,啥玩意。接下来咱们就一点一点的消化吧。

kafka原理图

先介绍上图中的术语。

  • Producer :音讯生产者,就是向kafka broker发消息的客户端。
  • Consumer :音讯消费者,向kafka broker取音讯的客户端。
  • Topic :kafka给音讯提供的分类形式。broker用来存储不同topic的音讯数据。一个Topic能够认为是一类音讯,每个topic将被分成多个partition(区),每个partition在存储层面是append log文件。任何公布到此partition的音讯都会被间接追加到log文件的尾部,每条音讯在文件中的地位称为offset(偏移量),offset为一个long型数字,它是惟一标记一条音讯。它惟一的标记一条音讯。kafka并没有提供其余额定的索引机制来存储offset,因为在kafka中简直不容许对音讯进行“随机读写”。
  • broker:中间件的kafka cluster,存储音讯,是由多个server组成的集群。
  • Partition:为了实现扩展性,一个十分大的topic能够散布到多个broker(即服务器)上,一个topic能够分为多个partition,每个partition是一个有序的队列。partition中的每条音讯都会被调配一个有序的id(offset)。kafka只保障按一个partition中的程序将音讯发给consumer,不保障一个topic的整体(多个partition间)的程序。
  • Offset:kafka的存储文件都是依照offset.kafka来命名,例如你想找位于2049的地位,只有找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。

相似于JMS的个性,但不是JMS标准的实现。kafka对音讯保留时依据Topic进行归类,发送音讯者成为Producer,音讯接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存信息。

kafka基于文件存储。通过分区,能够将日志内容扩散到多个server上,来防止文件尺寸达到单机磁盘的下限,每个partiton都会被以后server(kafka实例)保留;能够将一个topic切分多任意多个partitions,来音讯保留/生产的效率.此外越多的partitions意味着能够包容更多的consumer,无效晋升并发生产的能力。

kafka和JMS不同的是:即便音讯被生产,音讯依然不会被立刻删除。日志文件将会依据broker中的配置要求,保留肯定的工夫之后删除。

Kafka高可用机制
  • 多个broker组成,每个broker是一个节点;
  • 你创立一个topic,这个topic能够划分为多个partition,每个partition能够存在于不同的broker上,每个partition就放一部分数据。
  • 采纳replica正本机制,每个partition的数据都会同步到其余机器上,造成多个replica正本。
  • 所有replica会选举一个leader进去,那么生产和生产都跟这个leader打交道,而后其余replica就是follower。
  • 读数据时,从leader读取,写数据时,leader把数据同步到所有follower下来。如果某个broker宕机了,这个broker在其余的broker还保留正本,假如这个broker下面存在leader,那么就从新选一个leader。

内容有点多,须要联合图片一点一点消化。Kafka是什么,次要利用在什么场景?

生产者结构图

至此,尽管看的云里雾里,不过置信你们还是能辨别了吧?

整顿一下

音讯队列:指计算机领域中,A和B通信的一种通信形式;

JMS:Java中对于音讯队列的接口标准;

ActiveMQ/RabbitMQ:JMS接口标准具体实现的一种技术;

RocketMQ:不齐全是JMS接口标准具体实现的一种技术;

Kafka:非JMS接口标准具体实现的一种技术;

起源:blog.csdn.net/m0_37892044/article/details/106603925