Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >消息队列MQ/JMS/Kafka,你都了解吗?

消息队列MQ/JMS/Kafka,你都了解吗?

作者头像
芋道源码
发布于 2021-07-13 07:27:51
发布于 2021-07-13 07:27:51
2.1K00
代码可运行
举报
文章被收录于专栏:芋道源码1024芋道源码1024
运行总次数:0
代码可运行

来源:blog.csdn.net/m0_37892044/

article/details/106603925

  • 1 消息队列介绍
    • 1.1 什么是消息队列
    • 1.2 消息队列(Message queue)有什么用?
    • 1.3 消息队列的两种模式
  • 2 JMS介绍
    • 2.1 JSM消息模型
    • 2.2 JMS消费
    • 2.3 JMS编程模型
  • 3 MQ介绍
    • 3.1 AMQP协议
    • 3.2 RabbitMQ模型
  • 4 Kafka
    • 4.1 kafka原理图
    • 4.2 生产者结构图

是不是平常听到说消息队列啊,JMS啊,MQ啊 、kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧。

1 消息队列介绍

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

  • 快递小哥有时间送,
  • 我们有时间取,
  • 快递小哥和我们约定一个时间地点。

但是嗯。快递小哥有那么多的快递需要送,可能送我快递的时候,我不在家,可能我在家的时候,快递小哥送其他的地方的快递。所以嗯,这个时候,要么就是坐在家里等快递,要么就只能从新约个时间点在送。那怎么办去避免这个情况嗯?

于是嗯快递柜出现了。快递小哥不用关心我什么时候在家,因为快递小哥有时间了,就把快递放快递柜,而我有时间了,我就去快递柜取我的快递。

那么快递柜所起到的作用就是我们今天要收的消息队列。我们可以把消息队列比作是一个存放快递的的快递柜,当我们需要获取我们快递的时候就可以从快递柜里面拿到属于我们的快递。

1.1 什么是消息队列

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。我们看看维基百科上的描述:在计算机科学中,消息队列(Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。

是不是很难理解,我们换个说法来理解

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。

1.2 消息队列(Message queue)有什么用?

消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

通过异步处理提高系统性能(削峰、减少响应所需时间)

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

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

如果采用同步串行,所需要的时间是: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公司进行集成,谁需要这个功能,谁就去消息队列里面获取。

1.3 消息队列的两种模式

点对点模式

应用程序由:消息队列,发送方,接收方组成。

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

图片

发布订阅模式

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

发布者发布一个消息,该消息通过topic传递给所有的客户端。该模式下,发布者与订阅者都是匿名的,即发布者与订阅者都不知道对方是谁。并且可以动态的发布与订阅Topic。Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

图片

介绍完了消息队列,接着我们介绍JMS

2 JMS介绍

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

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

介绍到这里,应该明白了消息队列和JMS的区别了吧?

  • 消息队列:计算机科学中,A和B进行通信的一种方式。
  • JMS:java平台之间分布式通信的一种标准或者规范。

换句话说,JMS就是java对于消息队列的一种实现方式。

2.1 JSM消息模型

点对点,发布订阅,消息队列中已经说的很清楚了,这里就不重复说了。

2.2 JMS消费

  • 同步(Synchronous)

订阅者/接收方通过调用 receive()来接收消息。在receive()方法中,线程会阻塞直到消息到达或者到指定时间后消息仍未到达。

  • 异步(Asynchronous)

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

2.3 JMS编程模型

JMS编程模型非常类似于JDBC。回忆一下,我们之前讲到的MyBatis。

  • SqlSessionFactoryBuilder去构造SqlSessionFactory会话工厂;
  • SqlSessionFactory会话工厂给我们打开SqlSession会话;
  • SqlSession帮我们去连接数据库,接着我们就可以执行增删查改。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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会话给我们创建消费者和生产者;
  • 生产者生成消息;
  • 消费者消费消息;

图片

3 MQ介绍

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

在Java中,目前基于JMS实现的消息队列常见技术有ActiveMQ、RabbitMQ、RocketMQ。值得注意的是,RocketMQ并没有完全遵守JMS规范,并且Kafka不是JMS的实现。

3.1 AMQP协议

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

AMQP协议(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。

AMQP 模型

图片

AMQP 工作过程

发布者(Publisher)发布消息(Message),经由交换机(Exchange)。

交换机根据路由规则将收到的消息分发给与该交换机绑定的队列、(Queue)。

最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

RabbitMQ是MQ产品的典型代表,是一款基于AMQP协议可复用的企业消息系统

3.2 RabbitMQ模型

RabbitMQ由两部分组成,分别是服务端和应用端;

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

在rabbitmq server上可以创建多个虚拟的message broker。每一个broker本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。

broker相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的broker实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个broker。

图片

图片

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,这里我们先不撸代码,本文目前只介绍理论梳理知识点。

4 Kafka

上完中我们提到过,kafka不是JMS的实现,因此在MQ章节中,我们没有提及到它。现在我们开始学习kafka吧。

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

4.1 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。

内容有点多,需要结合图片一点一点消化

4.2 生产者结构图

图片

至此,虽然看的云里雾里,不过相信你们还是能区分了吧?

整理一下:

  • 消息队列:指计算机领域中,A和B通信的一种通信方式;
  • JMS:Java中对于消息队列的接口规范;
  • ActiveMQ/RabbitMQ:JMS接口规范具体实现的一种技术;
  • RocketMQ:不完全是JMS接口规范具体实现的一种技术;
  • Kafka:非JMS接口规范具体实现的一种技术;

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
梳理消息队列 MQ/JMS/Kafka
是不是平常听到说消息队列啊,JMS啊,MQ啊 、kafka等一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧。
玄姐谈AGI
2021/09/17
5560
Mq消息队列核心问题剖析与解决
这篇文章就谈谈对mq各种问题的思考,以及不同的mq业务方案的解决,注意这篇文章为了解决在学习三大mq的一些问题,和不同mq差异导致的出现的不同的消息解决方案,这往往是很多人所忽视的,我教你!
Joseph_青椒
2023/10/06
1.3K0
Mq消息队列核心问题剖析与解决
消息队列MQ面试专题(rabbitmq)
公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。
java进阶架构师
2020/09/22
1.1K0
消息队列MQ面试专题(rabbitmq)
Message Queue消息队列基本原理
如果需要和新的系统建立通信或删除已建立的通信,都需要修改代码,这种方案显然耦合度很高。
Java宝典
2021/01/14
3.3K0
Message Queue消息队列基本原理
消息队列基本原理和选型对比
作者:anncdchen,腾讯 PCG 后台开发工程师 消息队列使用场景 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,削峰填谷等问题。实现高性能、高可用、可伸缩和最终一致性架构。 解耦:多个服务监听、处理同一条消息,避免多次 rpc 调用。 异步消息:消息发布者不用等待消息处理的的结果。 削峰填谷:较大流量、写入场景,为下游 I/O 服务抗流量。当然大流量下就需要使用其他方案了。 消息驱动框架:在事件总线中,服务通过监听事件消息驱动服务完成相应动作。 消息队列模式 点对点模
腾讯技术工程官方号
2022/08/26
1.2K0
消息队列基本原理和选型对比
【Kafka】(一)Kafka的简介
Kafka 是最初由 Linkedin 公司开发,是一个分布式、分区的、多副本的、多订阅者,基于 zookeeper 协调的分布式日志系统(也可以当做 MQ 系统),常见可以用于 web/nginx 日志、访问日志,消息服务等等,Linkedin 于 2010 年贡献给了 Apache 基金会并成为顶级开源项目。
redszhao
2021/08/09
2.6K0
【Kafka】(一)Kafka的简介
分布式消息队列
一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。 二、消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。 2.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种
用户1263954
2018/01/30
3K0
分布式消息队列
大型网站架构系列:消息队列(二)
本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka)。 【第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源】 本次分享大纲(接上篇) 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本
小小科
2018/05/03
1.3K0
大型网站架构系列:消息队列(二)
从没有人能把MOM异步通信,消息中间件,消息队列?给一次性讲清
在微服务架构中,使用REST和RPC的方式最大的问题就是请求/响应模式的通信模式可能导致服务之间调用的可用性降低,客户端与服务端需要同时在线,双方都需要知道对方的URL地址,或者服务消费者需要通过某种发现机制来定位服务实例的地址。
愿天堂没有BUG
2022/10/28
7030
从没有人能把MOM异步通信,消息中间件,消息队列?给一次性讲清
01 . 消息队列之(Kafka+ZooKeeper)
Kafka最核心的最成熟的还是他的消息引擎,所以Kafka大部分应用场景还是用来作为消息队列削峰平谷。另外,Kafka也是目前性能最好的消息中间件。
iginkgo18
2020/09/27
1.1K0
01 . 消息队列之(Kafka+ZooKeeper)
常用消息队列介绍和对比
消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。
朝雨忆轻尘
2019/06/19
4.6K0
常用消息队列介绍和对比
网易终面:4款主流分布式MQ消息队列如何技术选型?
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。它可以实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。
终码一生
2022/04/15
1.4K0
网易终面:4款主流分布式MQ消息队列如何技术选型?
详细剖析kafka分布式消息系统
1.背景 最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveMQ的分布式实现的很奇怪,所以希望找一个适合分布式的消息系统。 以下是内容是调研过程中总结的一些知识和经验,欢迎拍砖。 2.基础知识 2.1.什么是消息队列 首先,我们来看看什么是消息队列,维基百科里的解释翻译过来如下: 队列提供了一种异步通信协议,这意味着消息的发送者和接收者不需要同时与消息保持联系,发送者发送的消息会存储在队列中,直到接收者拿到它。
Java架构
2018/05/04
1.9K0
详细剖析kafka分布式消息系统
进击消息中间件系列(一):Kafka 入门(基本概念与架构)
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
民工哥
2023/08/22
2.3K0
进击消息中间件系列(一):Kafka 入门(基本概念与架构)
一篇文搞定消息队列选型
消息队列是重要的分布式系统组件,在高性能、高可用、低耦合等系统架构中扮演着重要作用。可用于异步通信、削峰填谷、解耦系统、数据缓存等多种业务场景。本文是关于消息队列(MQ)选型和常见问题的精心整理。在这篇文章中,我们将详细介绍消息队列的概念、作用以及如何选择适合自己需求的消息队列系统。 本文中介绍到的 Kafka 、 RabbitMQ 、 RocketMQ 等,均有对应的腾讯云产品,除了兼容社区开源版以外,还具备更高的性能、可用性和产品特性,欢迎大家了解试用。
腾讯云开发者
2024/09/06
2.2K0
一篇文搞定消息队列选型
消息队列及常见消息队列介绍
曾令武
2017/09/29
51.4K6
消息队列及常见消息队列介绍
Kafka 入门
消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术。消息队列,一般会简称为 MQ(Message Queue)。消息队列是一种帮助开发人员解决系统间异步通信的中间件,常用于解决系统解耦和请求的削峰平谷的问题。
RendaZhang
2020/12/16
7040
消息队列面面观
其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么?
王知无-import_bigdata
2020/03/04
7370
Kafka入门与实战
今天我们来聊一聊现在MQ中最火爆的Kafka吧。关于Kafka的内容还是比较多的。本篇大概15000左右字,大家根据自己的需求来看吧。本文的大纲如下图所示: 一、消息队列的作用是什么?
爪哇缪斯
2023/05/10
7670
Kafka入门与实战
大数据Kafka(一):消息队列和Kafka的基本介绍
消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来存储消息的队列 。来看一下下面的代码
Lansonli
2021/10/11
2.2K0
大数据Kafka(一):消息队列和Kafka的基本介绍
相关推荐
梳理消息队列 MQ/JMS/Kafka
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验