常见消息中间件分享

news2025/1/12 1:05:20

文章目录

  • 概念
    • 核心角色
    • 作用&使用场景
      • 应用解耦
      • 异步通信
      • 削峰填谷
      • 大数据流处理
    • 使用模型
      • 点对点模型
      • 发布-订阅模型
  • 常见消息中间件
    • 介绍
      • 一、kafka
      • 二、RabbitMQ
      • 三、RocketMQ
    • 比较
      • 一、Kafka如何实现高吞吐量
      • 二、RocketMQ如何实现事务消息

概念

消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。

核心角色

消息中间件的使用有几个核心角色,如下图所示:
Producer 生产者:负责生产消息,将消息发送到消息队列中。
Consumer 消费者:负责消费使用消息,从消息队列中获取消息并进行处理。
Queue 消息中间件:作为消息传递的桥梁,负责存储和管理消息。
在这里插入图片描述

作用&使用场景

应用解耦

消息中间件可以将几个业务关联的微服务调用修改为基于MQ的异步通知,将消息发送方和消息接收方解耦,使得他们可以独立地进行开发和部署,不需要直接依赖于对方的实现细节。
在这里插入图片描述

异步通信

通过消息中间件,不同的服务之间可以进行异步通信,可以提高系统的吞吐量和并发性能,避免因为同步调用而导致的阻塞和性能瓶颈。
在这里插入图片描述

削峰填谷

消息中间件可以为消费者屏蔽上游的流量起伏,按自身系统的性能能力平稳消费处理消息。
在这里插入图片描述

大数据流处理

主要是Kafka,消息中间件可作为数据同步的传输工具,用于处理用户活动记录、实时数据传输、日志异步存储等场景。
在这里插入图片描述

使用模型

点对点模型

生产者将消息发送到一个特定的消息队列中,消息队列只会将消息传递给一个消费者处理。
在这里插入图片描述

发布-订阅模型

生产者将消息发送到一个主题(topic)中,消费者通过订阅该主题获取消息。在该模式下,消息队列会将消息广播给所有订阅了这个主题的消费者,一个消息可以发给多个消费者处理。
在这里插入图片描述

常见消息中间件

介绍

一、kafka

kafka是一个分布式的高吞吐量的消息系统,广泛应用于多种用途,例如实时数据流处理、日志聚合、监控、指标和日志收集、消息队列等。
kafka的基本模型是生产者向主题(Topic)发布消息,消费者从主题订阅消息。
消息通过一个或多个Kafka集群的代理(Broker)进行传输和存储,如下图所示:
在这里插入图片描述

二、RabbitMQ

一个开源的 AMQP(高级消息队列协议)消息代理软件,支持多种消息协议和多种语言的客户端,并提供可靠性、灵活性和可扩展性等优势。
RabbitMQ是erlang语言开发,结合erlang语言本身的并发优势。RabbitMQ支持许多高级特性,例如消息确认、持久化、优先级、消息 TTL、消息复制和分片等。
每个客户端都可以向不同的交换机发送消息,不同的交换机可以通过绑定key绑定多个队列,消费端通过绑定key可以消费不同的队列来实现不同的逻辑。
在这里插入图片描述

三、RocketMQ

RocketMQ是一个分布式的消息队列系统,由阿里巴巴集团开发并开源。
它具有高可用性、高吞吐量、高可靠性和可扩展性等特点,并且可以通过事务消息保证生产者和消费者之间的事务一致性。
在这里插入图片描述

比较

特性KafkaRabbitMQRocketMQ
关键字高性能、高吞吐、大数据可靠、简单易接入可靠、事务支持
消息确认发送消息:同步确认、异步确认;消费消息:支持,但消费消息后不删除,避免文件更新,更新offset(偏移量)支持支持
数据存储磁盘内存内存
持久化支持,写入log文件支持支持
分布式事务不支持不支持支持
消息 TTL支持支持支持
延迟队列不支持,可自己手动实现,创建一个单独针对延迟队列的 topic,同时创建 18 个 partition 针对不同的延迟级别,发送消息的时候根据延迟参数发送到延迟 topic 对应的 partition,对应的key为延迟时间,同时把原 topic 保存到 header 中,使用定时器去轮询延迟的TopicPartition,如果到了时间就转发到真实的topic,如果没到则继续等待。默认不支持,可通过死信机制通过消息过期实现;增加DelayExchange插件可支持延迟队列支持,固定时间延迟队列,默认时间间隔分为 18 个级别,1s、 5s、 10s、 30s、 1m、 2m、 3m、 4m、 5m、 6m、 7m、 8m、 9m、 10m、 20m、 30m、 1h、 2h。
顺序消费一个topic只能有一个发送者,保证消息发送的有序性。一个topic只能有一个分区,避免分区导致消息并发消费,而不是顺序消费。如果非要有多个分区,那么需要有一个key来保证相同key的消息在同一个分区。一个分区只能有一个消费者,可以通过锁保证。保证消息发送的有序性;保证一组有序的消息都发送到同一个队列;保证一个队列只包含一个消费者全局有序:这种方式主要是控制在一个Topic中,只允许有一个队列,并且生产者和消费者都需要只有一个实例进行,这样可以保证所有的消息都在同一个队列中被消费,从而实现顺序消费。分区有序:这种方式适用于一些复杂的业务场景,如电商业务的订单处理流程。在这种场景下,可以将每个订单相关的消息(如创建、付款、推送、完成等)分别发送到一个单独的主题中,然后在消费端开启负载均衡模式,以确保一个消费者能拿到的是按照订单处理的消息序列
死信机制不支持支持支持
吞吐量级单机10W/s级别单机1w/秒级别单机10W/s级别
消费模式push+pullpush+pullpush+pull

一、Kafka如何实现高吞吐量

顺序写磁盘:Kafka的producer生产数据,要写入到log文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到600M/s,而随机写只有100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。
零拷贝技术:“零拷贝技术”只用将磁盘文件的数据复制到页面缓存中一次,然后将数据从页面缓存直接发送到网络中(发送给不同的订阅者时,都可以使用同一个页面缓存),避免了重复复制操作。如果有10个消费者,传统方式下,数据复制次数为4*10=40次,而使用“零拷贝技术”只需要1+10=11次,一次为从磁盘复制到页面缓存,10次表示10个消费者各自读取一次页面缓存。Kafka是采用了Java提供NIO包中的的FileChannel的transfer方法实现了高性能的IO传输操作,FileChannel提供了transferTo和transferFrom方法,都是采用了调用底层操作系统的sendfile函数来实现的CPU零拷贝机制。
Topic分区:kafka对每个Topic进行分区提高了并发,也提高了效率。

二、RocketMQ如何实现事务消息

RocketMQ的事务消息是通过两阶段提交(Two-phase Commit)协议实现的。具体实现步骤如下:
发送半事务消息:发送方将半事务消息发送至RocketMQ服务端,由于消息为半事务消息,在未收到生产者对该消息的二次确认前,此消息被标记成“暂不能投递”状态,不会被消费。
执行本地事务:发送方开始执行本地事务逻辑。可能是一系列的数据库更新、文件写入等操作,他们要么全部成功,要么全部回滚。
二次确认:发送方根据本地事务执行结果向服务端提交二次确认(Commit 或是 Rollback),服务端收到 Commit 状态则将半事务消息标记为可投递,订阅方最终将收到该消息;服务端收到 Rollback 状态则删除半事务消息,订阅方将不会接受该消息。
丢弃消息:如果二次确认时,发送方的本地事务没有执行完成,则可以向服务端返回 Unknown 状态,服务端收到 Unknown 状态则会等一段时间后,重新向发送方发起状态确认。如果发送方多次返回 Unknown 状态,服务端则会直接丢弃这一条消息。
在这里插入图片描述

思考题:事务消息解决什么问题?

事务消息解决的问题是:Provider本地事务 + 消息投递 一起执行。解决应用端 和 MQ端两个独立的应用的操作,在一个事务里面完成
因为传统的模式无法保证这一点,比如MQ宕机,或者网络丢失,而事务消息有一个两阶段确认的这一操作,可以大大降低这种丢失的概率。
但是这个功能和消费者无关,并不能确保该消息能被消费者成功消费。
消费端同样也存在这个分布式的问题:成功的从MQ中取出消息到本地 + 消费端成功业务上消费这个消息

思考题:事务消息和发送同步ack有什么区别:

RocketMQ有发送同步消息的功能,只有Broker Ack Send_OK状态码时才代表消息发送成功,否则阻塞重试,重试2次还失败就报错。
既然同步消息可以保证消息成功的写入到MQ中,为什么还要有事务消息呢?因为会遇到消息投递成功而本地事务执行失败的场景。
事务消息解决的问题是:Provider本地事务 + 消息投递 一起执行。
而同步消息解决的问题是:消息一定投递成功

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

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

相关文章

14. rk3588自带的RKNNLite检测yolo模型(python)

首先将文件夹~/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/下的文件librknnrt.so复制到文件夹/usr/lib/下(该文件夹下原有的文件librknnrt.so是用来测试resnet50模型的,所以要替换成yolo模型的librknnrt.so),如下图所示&am…

【办公类-16-07-03】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环、有场地、贴墙版”(python 排班表系列)

作品展示——有场地说明 背景需求: 前期做了一份“贴周计划”用的班主任版的户外游戏安排表(中X班19周,没有场地) 【办公类-16-07-02】“2023下学期 周计划-户外游戏 每班1周五天相同场地,6周一次循环”(…

击败.helper勒索病毒:恢复被加密的数据文件的方法

导言: 近年来,勒索病毒成为网络安全领域的一大威胁,其中.helper勒索病毒更是备受关注。该类型的勒索软件以其高效的加密算法,能够将用户的文件加密,迫使用户支付赎金才能解密数据。本文将介绍.helper勒索病毒的特点、恢复被加密数…

unity学习(30)——跳转到角色选择界面(跳转新场景)

1.在scene文件夹中([siːn]),右键->create->scene,名字叫SelectMenu(选择角色场景)。 2.把新建场景拖拽到hierarchy[ˈhaɪərɑːki]中。 3.此时才能在file->build setting中Add open scene&…

vue页面基本增删改查

练手项目vue页面 新手前端轻喷: 效果如下 1、2两个部分组成: 对应代码中 element-ui中的 el-form 和 el-table 照着抄呗,硬着头皮来! 建议:认真读一遍你用的组件 这篇文章烂尾了,对不起大家

MySQL安装教程(详细版)

今天分享的是Win10系统下MySQL的安装教程,打开MySQL官网,按步骤走呀~ 宝们安装MySQL后,需要简单回顾一下关系型数据库的介绍与历史(History of DataBase) 和 常见关系型数据库产品介绍 呀,后面就会进入正式…

计算机视觉基础:【矩阵】矩阵选取子集

OpenCV的基础是处理图像,而图像的基础是矩阵。 因此,如何使用好矩阵是非常关键的。 下面我们通过一个具体的实例来展示如何通过Python和OpenCV对矩阵进行操作,从而更好地实现对图像的处理。 示例 示例:选取矩阵中指定的行和列的…

总结Rabbitmq的六种模式

RabbitMQ六种工作模式 RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。 RabbitMQ有六…

请介绍一下美国德克萨斯州历史地理与环境经济文化与社会教育与科研结论请介绍一下罗格斯大学(Rutgers University)校园与分校学术项目研究与创新学

目录 请介绍一下美国德克萨斯州 历史 地理与环境 经济 文化与社会 教育与科研 结论 请介绍一下罗格斯大学(Rutgers University) 校园与分校 学术项目 研究与创新 学生生活 社会贡献 请介绍一下德州A&M大学系统 组成成员 教育与研究 …

板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程:第六节 HttpSession对象全解 一、什么是HttpSessionSession的本质 二、创建Seesion及常用方法三、Session域对象四、Session对象的销毁 在上一节中,我们学习了Servlet五大对象里的第三个Cookie对象,但Cookie是有大小限制和…

关于开放系统互联的一些笔记

最近几天就发几篇计算机方面的基础知识 属于个人归纳整理,便于理解希望对大家有帮助 原文地址:关于开放系统互联的一些笔记 - Pleasure的博客 下面是正文内容: 前言 最近在恶补一些计算机方面的基础知识…… 正文 首先为了能够更透彻的理…

VSCode C/C++无法跳转到定义(又是你 clangd !)

原博客:VSCode C/C无法跳转到定义、自动补全、悬停提示功能_c/c:edit configurations(json)-CSDN博客 我在此基础上加一点: 首先确保自己有这个插件: 点击 齿轮⚙ 符号,进入 配置设置,找到 把 C_cpp : Intelli Sens…

【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)

文章目录 一、前言二、ShaderGraph1.什么是ShaderGraph2.在使用ShaderGraph时需要注意以下几点:3.优势4.项目 三、实例效果边缘发光进阶:带方向的菲涅尔边缘光效果裁剪进阶 带边缘色的裁剪溶解进阶 带边缘色溶解卡通阴影水波纹积雪效果不锈钢效果、冰晶效…

AR智能眼镜主板硬件设计_AR眼镜光学方案

AR眼镜凭借其通过导航、游戏、聊天、翻译、音乐、电影和拍照等交互方式,将现实与虚拟进行无缝融合的特点,实现了更加沉浸式的体验。然而,要让AR眼镜真正成为便捷实用的智能设备,需要解决一系列技术难题,如显示、散热、…

钉钉小程序无法关联应用

钉钉小程序无法关联应用 problem 后台创建了新的应用钉钉小程序开发者工具>企业内部应用>关联应用 没有下拉列表 无法关联,只能点击新增按钮,重新进入后台很奇怪,明明创建好了应用,为什么关联下拉列表没有这个应用呢&…

在VS里使用C#制作窗口应用

新建项目 创建项目的时候搜索net,选择这个。 打开应该是这样 第一个控件 选择公共控件 - PictureBox - 拖入Form 在Image处选择上传本地资源,建议上传一个小一点的图片。 修改一下尺寸。 ctrls 保存 从“属性”切换到“事件” 双击Click事件…

STM32-开发工具

开发过程中可能用到的工具 1、烧录下载调试工具ST-LINK ST-LINK,是ST(意法半导体)推出的调试编程工具,适用于STM32系列芯片的USB接口的下载及在线仿真器。 2、串口调试工具/串口下载工具 串口调试工具是一种用于通过串口通信协议与目标设备进行数据交…

Linux——进程替换

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、进程程序替换1、替换原理2、替换函数3、函数解释4、命名理解 二、用例测试1、execl测试2、…

基于多种机器学习模型的西北地区蒸散发模拟与趋势分析_季鹏_2023

基于多种机器学习模型的西北地区蒸散发模拟与趋势分析_季鹏_2023 摘要关键词 1 资料和方法1. 1 研究区域与观测数据1. 2 机器学习模型构建与验证方法1. 3 SHAP 可解释性方法 2 主要结果2. 1 不同模型的模拟性能和泛化能力2. 2 不同模型的可解释性分析2. 3 5 km 分辨率格点蒸散发…

长短期记忆神经网络

目录 LSTM 神经网络架构 分类 LSTM 网络 回归 LSTM 网络 视频分类网络 更深的 LSTM 网络 网络层 分类、预测和预报 序列填充、截断和拆分 按长度对序列排序 填充序列 截断序列 拆分序列 指定填充方向 归一化序列数据 无法放入内存的数据 可视化 LSTM 层架构 …