kafka学习(七):消息队列与JMS

news2025/8/10 7:53:49

1、消息队列

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

1.1、消息队列有什么用?

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

1.2、消息队列的两种模式

点对点模式

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

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

发布订阅模式

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

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

        Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

1.3、为什么需要消息队列

  消息队列的核心作用就是三点:解耦一个系统中各个子模块的互相绑定与依赖,异步执行后台耗时逻辑,并行处理一个请求中涉及的多个操作。

  以我们常见的下订单场景来说明,我们熟悉的淘宝,后台运作着成千上百的子系统,一个简单的加入购物车并下单的操作,后台要经过购物车存储记录,计费中心计算总值,订单中心处理订单,后转交仓库处理等等子系统的逻辑,如果每下单一件物品,都要等所有流程跑完,再返回下单成功的提示,那用户体验是极差的,因为在多个子系统的信息传递和处理会带来时间上的巨大开销。同时这样的架构设计也是不合理的,各个子系统会存在互相依赖甚至循环依赖的情况,在子系统日益增多的场景下,这样的一个庞大系统是难以维护的。

  而我们现实的体验是,每次一点击下单,马上就返回了订单处理成功的提示。那是因为淘宝后台广泛的使用了消息中间件,将订单信息以消息的形式发送到MQ消息中间件。而后台所有子系统各自独立运作,通过收发消息来并行的对订单作存储,计费,入库,出库操作,这样极大的提高了系统的灵活性,减少用户等待提示的时间,带来了更好的用户体验。

2、JMS规范

        JMS是什么:JMS是Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,类似于JDBC。即:Java提供的一套技术规范和关于消息中间件的协议。

  JMS干什么用:通过生产者Producer,消息服务器,以及消费者通力合作,使异构系统能进行集成通信,缓解系统瓶颈,提高系统的伸缩性增强系统用户体验,使得系统模块化和组件化变得可行并更加灵活,其中生产者,消息服务器,以及消费者的工作模型如下:

        用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。它提供创建、发送、接收、读取消息的服务。由Sun公司和它的合作伙伴设计的应用程序接口和相应语法,使得Java程序能够和其他消息组件进行通信。

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

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

消息队列:计算机科学中,A和B进行通信的一种方式。

JMS:java平台之间分布式通信的一种标准或者规范。

2.1、JMS的消息传输模型 

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

2.2、JMS核心组件

  • Destination 消息发送的目的地。
  • message 被发送的消息
  • producer 消息的生产者,发送消息必须通过生产者来发送
  • consumer 与生产者对应,这是消息的消费者和接收者,通过它来接收一个消息

 

接口名称p2ppub/sub备注
connectionFactoryqueueConnectionFactoryTopicConnectionFactory基于工厂模式,创建和jms提供者之间的链接,需要制定链接的url和协议,任何jms客户端和jms提供者之间的交互,都必须要制定链接
Destinationqueuetopic”目的地“ jms提供者用于标记消息所属类型的标记
connectionqueueConnectiontopicConnection”链接“用于描述一个具体的链接入udp和tcp,任何交互数据都需要通过这个链接进行,jms实现者定义数据格式(协议),在物理层用于区分jms客户端,一般而言,一个应用只有一个“链接”。
sessionqueueSessiontopicSession”会话“,在逻辑上用于区分jms客户端,因为链接可被共用已提高网络利用率,每个session可以支持相对独立的事务和相关属性,每个session都有ID
message"消息",jms api中提供了多种message类型,它们有各自的”序列化/反序列化“机制;消息中可以包含多种jms属性以及客户端自定义的消息属性和内容
producerqueueSenderTopicPublisher“生产者”,一种可以向jms提供者提交消息的客户端类型
consumerqueueReceiverTopicSubscriber”消费者“一种可以向jms获取消息的客户端类型

2.3、JMS的可靠性

JMS提供了持续化/ack确认机制/事务 来保证消息的可靠性(防止消息丢失,消息的重复消费)

  • 持久化
    • 当服务宕机时,数据不丢失,会保存在服务器本地,持久化可以保证消息在未被消费方消费前不丢失,默认为持久化传送模式,保证消息只被传输一次和消费一次,可靠性是优先考虑因素。
    • topic持久化,消费者需要在MQ注册一个自己的身份id标识,在消费者宕机时,生产者会为对应的id保留数据。
  • 事务
    • acid生产者消费者为了保证多条消息发送保证同步提交和同步消费,可以开启事务功能,需要提交事务,

  • 从发送这角度来看,jms提供者为这组消息提供了高速缓存,知道执行commit为止,如果发生了故障或者执行了rollback操作,这些消息就会丢弃,在一个事务中传送给消息服务器的消息,它并不会转发给消费者,直到生产者生产完消息并执行了commit操作为止。
  • 从消费者角度来看,jms支持事务的接收,jms提供者在提供这些消息给消费者时,消费者消费这些消息要么全部接收,要么一条也不接收,这些消息会尽快传给接收者,但是它们一直由jms提供者保存,直到接收者在会话对象上执行commit为止,如果发送发生了故障或者执行了rollback操作,提供者会试图重新发送消息,在这种情况下,这些消息会设置重新传送标记。

  • ACK确认机制
    • 1.自动ack消费者自动ack
    • 2.手动ack 需要自己手动提交ack信息
    • 3.运行重复签收,用于可以多消费者签收的消息

事务和ack都是消息确认的方式,同时存在时事务的优先级要高一些,开启事务时ack是无效的,非事务的模式下,ack开启才有效。

3、Kafka介绍

  Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目,目标是为处理实时数据提供一个统一、高通量、低等待的平台,Kafka被广泛地应用于各种流式计算中。

  Kafka提供了类JMS的特性,但在设计实现上并不遵循JMS规范,Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。同时无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。

Kafka核心组件及简单的运作流程图:

  Topic :消息根据Topic进行归类
  Producer:发送消息者
  Consumer:消息接受者

  Kafka cluster:kafka集群
  broker:每个kafka实例(server)
  Zookeeper:依赖集群保存meta信息

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCE | 神经元为胰腺癌细胞提供营养

胰腺导管腺癌 (PDAC) ,最常见的胰腺癌 (Pancreatic cancer) 类型 ,是最致命的实体肿瘤之一,具有很高的侵袭性。PDAC 治疗的不良预后与其独特而复杂的微环境和代谢可塑性有关。PDAC 的肿瘤微环境 (TME) 主要成分是细胞外基质 (ECM)、脉管系统、…

tensorflow2 MobileNet

简介 深度学习的发展伴随着模型参数的暴涨,导致对运行模型的设备有很大的限制,普通的卷积神经网络模型难以运用到移动或嵌入式设备中,主要是这些设备的内存有限,其次这些设备的算力不能满足足够的响应速度,即实时性差…

[附源码]java毕业设计疫情期间回乡人员管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Swin Transformer目标检测实验——环境配置的步骤和避坑

Swin Transformer1. 网上基础教程(带视频讲解)2. 配置虚拟环境时遇到的一些问题(按操作顺序排列)1. 网上基础教程(带视频讲解) 大家是不是都从b站来的呀,先给你们基础环境的配置和搭配的视频教…

【SQLite】三、SQLite 的常用语法

作者主页:Designer 小郑 作者简介:软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲…

[论文阅读笔记18] DiffusionDet论文笔记与代码解读

扩散模型近期在图像生成领域很火, 没想到很快就被用在了检测上. 打算对这篇论文做一个笔记. 论文地址: 论文 代码: 代码 0. 扩散模型简述 首先介绍什么是扩散模型. 我们考虑生成任务, 即encoder-decoder形式的模型, encoder提取输入的抽象信息, 并尝试在decoder中恢复出来. 扩…

亚马逊鲲鹏系统:批量注册亚马逊买家号软件

之前我们有谈到过,想要注册亚马逊买家号,需要邮箱、ip、信用卡、收货地址和手机号。自己手动注册一个一个的太麻烦,还会花费大量的时间,那么有没有可以节约时间的自动化操作软件呢?想要自动化操作软件,来试…

金属带宽度测量方案

一、硬件部分 1.相机 像素:4864*3232 相机选择 1600 万像素即 4864*3232,即检测视场长宽比为 3:2 工件最大的直径为 320mm,假设检测的视场范围为 510*340 因 此 每 个 像 素 大 小 为 340mm/32800.104mm , 即 检 测 精…

数组形式的整数加法

1 问题 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如,对于 num 1321 ,数组形式是 [1,3,2,1] 。 给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num k 的 数组形式 。 2 方法 根据问题的描述…

ROS中使用protoBuf通信

ROS自身话题也挺好的,不过暂时还不知道如何判断网络,因此,还是想换回tcp/udp通信。 但是发现通信时数据比较多,调查一下,发现ROS支持google的protoBuf。 先建立一个ROS的项目,方便后面我们测试。 然后建立…

疫情物资储藏库建设规划问题,使用matlab+cplex+yalmib求解

疫情物资储藏库建设规划问题,使用matlabcplexyalmib求解一、Cplex安装及配置二、yalmib安装及配置三、案例分析一、Cplex安装及配置 一、安装Cplex Cplex 是一款商业化的规划问题求解器,支持python和matlab等常用语言,功能非常强大。可以根据…

19 0A-检索服务器支持的所有DTC的状态

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,19服务作为UDS中子功能最多的服务,一共有28种子功能,本文将介绍常用的19 0A服务:检索服务器支持的所有DTC的状态。此子功能不论DTC是否发生、状态如何,都让ECU返回所有…

1533_AURIX_TriCore内核架构_指令集信息

全部学习汇总: GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 学习的顺序有一点调整,切换到了内核的第二卷。先了解一下指令集的基本信息。第二卷主要就是讲指令集以及扩展的,而且基本上只…

RSA加密算法Python实现

RSA加密算法Python实现1.RSA算法简介2.RSA算法涉及的数学知识2.1互素2.2 欧拉定理2.3求模逆元2.4 取模运算2.5 最大公因数2.6 最小公倍数2.7 欧几里得算法2.8 扩展欧几里得算法3.RSA算法数学实现3.1理论3.2实践4.RSA算法代码实现4.1RSA算法代码实现14.1RSA算法代码实现21.RSA算…

STP、RSTP、MSTP

STP、RSTP、MSTP的配置 本篇介绍STP、RSTP、MSTP的配置和常用的管理命令。 STP/RSTP/MSTP简介 以太网中为了进行链路备份,提高网络可靠性,通常会使用冗余链路,但是这也带来了网络环路的问题。网络环路会引发广播风暴和MAC地址表振荡等问题…

连续仨月霸占牛客榜首,京东 T8 呕心沥血神作:700 页 JVM 虚拟机实战手册

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只…

基于结构应力方法的焊接结构疲劳评估及实例分析(下篇)

作者 | 裴宪军 ,仿真秀专栏作者 一、写在文前 焊接技术作为现代制造业中的支柱技术之一,是制造强国的关键保障。由于其整体性强、轻量化、经济性好等优点,焊接结构被广泛应用于轨道交通、航空航天,船舶、重型装备等领域&#xf…

LinkedIn领英开发客户方法大全(篇一)

一、准备工作 (绝对不能小看准备工作!!!!所以我写的很详细!!!) 1.建议大家使用网页版的领英开发客户,并且界面语言要切换为英文!! 领…

你听说过LabVIEW吗?

LabVIEW是美国国家仪器公司NI的图形化的编程语言,LabVIEW的全称是Laboratory Virtual Instrument Engineering Workbench,平时我们常见的Python、C/C、Java编程语言虽然也分编译型语言和解释型语言、底层语言和高级语言等,但基本都是文字形式…

[附源码]java毕业设计疫情状态下病房管理平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…