常见消息中间件分享

文章目录

  • 概念
    • 核心角色
    • 作用&使用场景
      • 应用解耦
      • 异步通信
      • 削峰填谷
      • 大数据流处理
    • 使用模型
      • 点对点模型
      • 发布-订阅模型
  • 常见消息中间件
    • 介绍
      • 一、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.mfbz.cn/a/399827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

猿辅导送给新时代家长的一份教育指南,让孩子“学会学习”

新课标发布以来,各学科综合素养内容占比逐渐提升,成为校内教学考察的新方向,素养教育也成为学校、家长讨论的新话题。论坛上,各领域教育创新者、教育实践者围绕素养教育,探讨了学习本质、学习兴趣、作业问题、厌学情绪…

JAVA并发编程之原子性、可见性与有序性

并发编程-原子性、可见性与有序性 一、CPU的可见性 1.1 缓存一致性问题的出现 CPU处理器在处理速度上,远胜于内存,主内存执行一次内存的读写操作,所需要的时间足够处理器去处理上百条指令。 为了弥补处理器与主内存处理能力之间的差距&am…

2023 re:Invent 用 PartyRock 10 分钟构建你的 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些 keynote 和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

3 Nacos源码下载并集成达梦数据库驱动

1、Nacos源码下载 源码直接下载gitee上的nacos2.2.3,具体链接:Nacos: 概览 欢迎来到 Nacos 的世界! Nacos 致力于帮助您发现、配置和管理微服务 - Gitee.com,具体如下图

在编老师可以有副业吗

许多在编老师或许都会面临这样一个问题:除了教书育人,我是否还能有点别的追求?副业,对于很多人来说是一个增加收入、拓展兴趣的途径,但对于在编老师而言,这个问题却显得有些复杂。 老师这份工作本身就充满…

宋仕强介绍说,萨科微slkor

宋仕强介绍说,萨科微slkor(www.slkoric.com)研制了碳化硅SiC SBD二极管、碳化硅SiC MOSFET管、IGBT管、超快恢复功率二极管等高端产品,萨科微SLKOR还有肖特基二极管、ESD静电保护二极管、TVS瞬态抑制二极管、通用二极管和三极管&a…

0-前置知识

前言 SpringBoot框架在设计之初,为了有更好的兼容性,在不同的运行阶,段提供了非常多的扩展点,可以让程序员根据自己的需求,在整个Spring应用程序运行过程中执行程序员自定义的代码。 ApplicationContextInitializer …

springcloud-网关(gateway)

springcloud-网关(gateway) 概述 \Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为其提供跨领域的关注,如:安全、监控/指标和容错 常用术语 Route(路由): 网关的基本构件。它由一个ID、一个目的地…

软考 系统分析师系列知识点之企业信息化规划(1)

所属章节: 第7章. 企业信息化战略与实施 第2节. 企业信息化规划 企业信息化建设是一项长期而艰巨的任务,不可能在短时间内完成。因此,企业信息化建设必然会分解成各个相对独立的项目,在不同时期分别实施,从而建立多个…

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK 全部学习汇总: g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 上面是涉及到的源代码,而这次需要分析的就是78、79行的两个中断。首先,需要确认NVIC_SYSPRI2寄存器的作用。 进一…

jquery写组件滑动人机验证组件

jquery组件,虽然 jquery 语法古老,但是写好了用起来真的很爽啊,本文用滑动人机验证给大家做个详细教程(直接复制代码就可以用噢o(* ̄▽ ̄*)ブ) 第一步 先看下组件本身 component.js (function() {…

QT中的多线程有什么作用?

概述 在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上…

Python urllib模块学习

HTTP协议 HTTP 协议:一般指HTTP(超文本传输)协议。 HTTP是为Web浏览器和Web服务器之间的通信而设计的,基于TCP/IP通信协议嘞传递数据。 HTTP消息结构 客户端请求消息 客户端发送一个HTTP请求到服务器的请求消息包括以下格式 请求行(request line)请求…

基于Java开发的个人视频网站的搭建与实现[附源码]

基于Java开发的个人视频网站的搭建与实现[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &am…

威来国际教育:留学服务的全新标杆,打造无忧留学体验

在当今全球化日益加深的背景下,留学已成为众多年轻人拓宽视野、提升个人能力的重要手段。随着留学市场的不断扩大和留学目的地的多样化,家庭和学生在选择留学服务时更加注重专业性和全面性。 在这一领域,威来国际教育凭借其深厚的背景和专业的…

mysql 2-20

TEXT类型 枚举类型 SET类型 二进制字符串类型 BLOB类型 注意事项 JSON类型 提取数据 空间类型 选择建议 约束

Spark 离线开发框架设计与实现

一、背景 随着 Spark 以及其社区的不断发展,Spark 本身技术也在不断成熟,Spark 在技术架构和性能上的优势越来越明显,目前大多数公司在大数据处理中都倾向使用 Spark。Spark 支持多种语言的开发,如 Scala、Java、Sql、Python 等。…

创业者看到这3000多箱磁吸春联滞销面临销毁一定要吸取教训!

2月18日,浙江金华一个工厂🏭3000多箱龙年磁吸春联, 因为滞销,加上春联中含有龙元素和日期而面临报废销毁, 造成了数十万的损失以及大量的资源浪费。 —————————— 而引起广泛的社会讨论🗣️&…

《Solidity 简易速速上手小册》第8章:高级 Solidity 概念(2024 最新版)

文章目录 8.1 高级数据类型和结构8.1.1 基础知识解析更深入的理解实际操作技巧 8.1.2 重点案例:构建一个去中心化身份系统案例 Demo:创建去中心化身份系统案例代码DecentralizedIdentityContract.sol 测试和验证拓展案例 8.1.3 拓展案例 1:管…

C++力扣题目 121--买卖股票的最佳时机 122-- 买卖股票的最佳时机II 123--买卖股票的最佳时机III 188--买卖股票的最佳时机IV

121. 买卖股票的最佳时机 力扣题目链接(opens new window) 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所…