首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >消息队列MQ/JMS/Kafka,你都了解吗?

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

作者头像
芋道源码
发布于 2021-07-13 07:27:51
发布于 2021-07-13 07:27:51
2.2K20
代码可运行
举报
文章被收录于专栏:芋道源码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 删除。

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

评论
登录后参与评论
2 条评论
热度
最新
非常感谢
非常感谢
回复回复点赞举报
牛逼大哥
牛逼大哥
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
WordPress 技巧:如何改变 JPEG 图片上传后的压缩质量
可能这对大家比较陌生,WordPress 在图片上传后会默认压缩图片质量为原来的 90%,这样做的好处可以极大的加快页面的载入速度与缩小图片大小所占服务器空间。但部分站长(包括我)对于这 10% 的压缩还是比较在意的,还是希望 100% 原质量才能让我舒心。 🙂 那么如何禁止 WordPress 自动压缩上传图片质量呢?把如下代码插入到你的主题 functions.php 文件里,则以后不会对上传质量有所压缩了 add_filter( 'jpeg_quality', create_function( ''
Denis
2023/04/15
9310
WordPress 技巧:提高 WordPress 搜索的相关性
实在扛不住 Google 自定义搜索的速度了,把我爱水煮鱼的搜索换回了 WordPress 自带的搜索,但是 WordPress 的默认搜索结果是按照文章的发布时间来排序的,这样的搜索结果的相关性并不强,应该让搜索结果按照内容相关性排序,而不是按照时间或者 ID,所以我们可以在当前主题的 functions.php 添加如下代码来增强 WordPress 搜索的相关性:
Denis
2023/04/15
3210
开箱即用的前端图片压缩方案
我们都知道在“寸土寸金”的互联网时代, 速度是第一竞争力, 虽然我们的5G发展已经摇摇领先, 但是也经不住用户在一个网页里传很多“巨无霸”图片, 最终导致的结果就是页面“龟速”打开......
徐小夕
2022/09/27
1.4K0
开箱即用的前端图片压缩方案
WordPress 支持 WebP格式图片上传方法
WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,派生自影像编码格式VP8,被认为是WebM多媒体格式的姊妹项目,是由Google在购买On2 Technologies后发展出来,以BSD授权条款发布。
阳光岛主
2019/12/30
2.3K0
WordPress 支持 WebP格式图片上传方法
实现WordPress上传图片自动重命名的方法
然而,大家都知道 WordPress 是舶来物,对于中文用户来说,我们都会把图片命名为中文的,由于 WordPress 机制的原因,并不能正常的显示图片或者各种的问题。
你的明明呐丶
2022/06/27
1K0
【Web技术】907- 前端图片最优化压缩方案
上传图片/视频/文件是我们经常会遇到的问题,但是一旦图片过大就会导致不好的操作体验。图片上传是前端中常见的的业务场景。无论是前台还是后台,适当的对图片进行压缩处理, 可以显著的提升用户体验。而在后台管理系统中,图片压缩不仅仅能够提升后台管理员操作体验,更是可以防止后台设置过大的图片导致前台图片加载过久,从而影响用户体验。
pingan8787
2021/04/07
1K0
【Web技术】907- 前端图片最优化压缩方案
H5图片压缩与上传
现在手机用户拍照照片都十分巨大,1m-10m,而普通用户的上传带宽大概为100kb/s-1m/s,导致上传图片十分缓慢
仙士可
2019/12/19
2.1K0
H5图片压缩与上传
【说站】WordPress网站文章ID不连续如何解决?
对于WordPress网站文章ID不连续的问题困扰了我很久,今天将WordPress文章ID不连续的原因和具体解决办法做详细的说明。
很酷的站长
2022/11/24
7330
【说站】WordPress网站文章ID不连续如何解决?
微信小程序图片上传压缩
在具体业务中,我们会遇到需要让用户上传本地图片的场景,随着现在的手机像素越来越高,图片的大小也越来越大,上传原图后一方面是难以上传成功,另一方面是上传成功后在列表中图片太大加载时间过长或者加载失败。若是直接提示用户 “无法上传xxM以上的图片” ,用户体验会不好,于是需要我们对用户上传的图片进行压缩。本文主要记录了开发过程中探索压缩图片的过程和方式,以及一些踩坑记录。
maureen
2022/09/07
10.9K0
七牛镜像存储 WordPress 插件 的代码化
WordPress 界中使用七牛云存储的博主可能都知道“我爱水煮鱼”开发的一个七牛镜像存储 WordPress 插件。该插件确实是为WordPress 博客使用七牛云存储提供了便利,但随着鱼叔的更新,感觉越发臃肿起来,遂将核心代码提取出来,将该插件代码化。 该插件目前已经提交到WordPress 官方了,这里是官方插件地址。 因为Jeff 只使用到其中主题静态文件的转存,所以Jeff 直接在主题的functions.php 文件中添加如下代码: //将主题自带的 CSS 和 JS 文件替换成七牛镜像存储 d
Jeff
2018/01/19
8760
在线网页图片无损压缩工具 Smush.it 和其 WordPress 插件
网页图片优化是网页加速中非常重要的一步,对图片进行压缩,不仅能够节约带宽,并且加快网页的速度。我们常用的图片编辑软件都可以在压缩图片。而使用 Smush.it 则可以大幅压缩图片,并且它还是一个无损的压缩工具。
Denis
2023/04/14
6280
在线网页图片无损压缩工具 Smush.it 和其 WordPress 插件
WordPress 会自动压缩JPEG 格式的图像?
在老外的一篇文章那里看到一个Jeff 之前不知道的信息:当jpeg 格式的图像被上传到WordPress,它会自动压缩图片为原来的90% 。不过那个谁说得好:“实践是检验真理的唯一标准”,Jeff亲自去上传了一张高分辨率、高容量的jpeg 格式的图像。但最后发现,无论是图片文件体积还是清晰度都没有改变。 老外的原英文文章点击这里,不知道是不是Jeff 理解错误,反正WordPress 就是没有压缩图片(恩,一定是我打开的方式不对)。该文还给出了个自定义压缩率的代码,呵呵,真搞不懂;既然我都发现没有压缩,怎么
Jeff
2018/01/19
8640
前端实现图片压缩干货分享
在Web开发中,图片压缩是一个常见且重要的需求。随着高清图片和多媒体内容的普及,如何在保证图片质量的同时减少其文件大小,对于提升网页加载速度、优化用户体验至关重要。前端作为用户与服务器之间的桥梁,实现图片压缩的功能可以显著减轻服务器的负担,加快页面渲染速度。本文将探讨前端实现图片压缩的几种方法和技术。
用户10501441
2024/11/24
5050
前端实现图片压缩干货分享
前端图片压缩方案及代码实现
随着互联网的发展,图片在各种网站和应用中铺天盖地,运营人员在后台管理系统中上传图片时常常忽略的图片的体积大小,随之产生的带宽和服务器容量也大大增加,图片压缩的需求随之产生。
越陌度阡
2023/02/13
1.6K0
前端图片压缩方案及代码实现
TinyPNG 和 WordPress 图片压缩插件:Compress JPEG & PNG images
我们在建立网站的时候,经常会遇到很多图片比较大,比如观赏类的网站文章,每篇文章里面都要用到很多清晰的大图片,为了兼顾图片清晰度和容量我们就需要通过适当压缩图片的方式来做优化。目的是加速页面打开,提高浏
魏艾斯博客www.vpsss.net
2018/06/01
1.6K0
这个图片压缩神器,直接可以在前端用
想必大家都用过图片压缩工具吧!对于前端来说这图片压缩是必不可少的,今天就给大家介绍一个js工具库,让前端也能实现图片压缩~
程序员老鱼
2024/07/12
6720
这个图片压缩神器,直接可以在前端用
前端:Canvas进行简单图片压缩算法
图片压缩算法 通过canvasAPI进行在Web端上传的时候进行图片压缩。 通过宽高压缩(第一次压缩 - Canvas宽高) 通过API压缩(第二次压缩 - HTMLCanvasDom.toDataURL()) 简述步骤 通过input输入框用来坐上传,通过chang事件获得上传的文件。 对上传的文件进行一些简单的类型,大小的判断然后开始压缩。 压缩图片第一步将用户上传的图片(file)转为base64格式-new FileReader() -> ReaderAsDataUrl()异步读取
19组清风
2021/11/15
2K0
【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
① 文件压缩 : 图片的文件压缩 , 一张图片可以经过压缩 , 占用更少的磁盘或网络空间 ;
韩曙亮
2023/03/27
4.7K0
WordPress 网站文章中插入图片同主题代码不一样的原因
WordPress 网站文章中插入图片同主题代码不一样的原因。最近有主题用户问:为什么查看插入到文章中的图片源代码与我博客的不一样,多出很多代码。这些多出的代码是WordPress 增加一个叫“图片多屏自适功能”,用于在不同屏幕大小的设备上显示不同尺寸的图片。
主机教程网2bcd.com
2022/11/01
5820
优化网站性能的终极图片压缩神器!
大家在日常生活中经常会遇到一个问题:图片太大了! 有些时候分享和上传时,速度总是很慢~
程序员老鱼
2023/09/07
4730
优化网站性能的终极图片压缩神器!
推荐阅读
相关推荐
WordPress 技巧:如何改变 JPEG 图片上传后的压缩质量
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档