Rocket MQ 从入门到实践

news2025/1/12 12:29:55

为什么要使用消息队列,解决什么问题?(消峰、解藕、异步)

消峰填谷
客户端=》 网关 =〉 消息队列=》秒杀服务
异步解耦

消息队列中的重要概念理解。(主题、消费组、队列,游标?)

主题(Topic)
消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息
队列(MessageQueue)
消息存储和传输的实际容器,一个Topic有多个队列,可水平扩展
消息(Message)
单位消息,每个消息都有扩展性,负载等信息
消费者(Consumer)
接受并处理消息的运行实体,取到消息业务逻辑进行处理,分PushConsumer和PullConsumer等
消费者组
也叫Consumer ID,多个消费行为一致的消费者的负载均衡分组
生产者
构建并传输消息到服务端的运行实体

消息队列的两种模式
队列模式
请添加图片描述
发布-订阅模式请添加图片描述
如何实现多消息者订阅同一份消息
RabbitMQ消息模式
生产者将消息发送给Exchange交换机,交换机路由到不同的队列,不同的消费者针对不同的队列进行消费,实现简单、但是消息存储冗余

RocketMQ/Kafka消息模式
生产者将消息推送到队列之后,如果有消费者去消费这个主题上的消息,在队列上记录下不同消费者互不干扰不同的消费位置,它就可享有同一份消息

RocketMQ 部署架构
请添加图片描述
核心关系:主题、队列、消费者、消费组、消费位置
请添加图片描述

最佳实践:合理划分主题和Tag

接入Rocket MQ,业务消息的拆分可以基于Topic进行,也可以基于消息tag和属性进行
遵守三个基本原则
1、消息的类型是否一致:不同类型的消息,如顺序消息和普通消息需要使用不同的主题进行拆分,无法通过tag标签进行分类
2、业务域是否相同:不同业务域和部门的消息应该拆分不同的主题。例如物流消息和支付消息应该使用两个不同的主题
3、消息量级和重要性是否一致:如果消息的量级规模存在巨大差异,或者说消息的链路重要程度存在差异,则应该使用不同的主题进行隔离拆分

订阅关系一致性
同一个消费组、订阅的Topic一样,且过滤的表达式也要一致

消息堆积怎么办?

1、发送端堆积(比较少见)
批量发送
增加并发
2、消费端堆积
增加资源
加机器、升配置等。增加机器无效果考虑增加topic队列数
提升消费性能
优化消费逻辑,批量并发消费、改用性能更好的语言
解决报错
顺序消费,某个队列单条消息消费失败(大量的消费重试),导致队列阻塞,堆积
系统降级
服务重要业务,降低影响

一定要保证消费端的性能要高于生产端的发送性能、这样才的系统才能健康的持续运行

Rocket MQ 如何确保消息不丢失(生产、存储、消费三个阶段)

生产阶段 消息在生产者创建出来,经过网络传输到Broker端
检查发送状态、失败要有补偿机制
存储阶段 在这个阶段消息在Broker端存储。
集群部署,主备都写成功,才返回成功
消费阶段 Consumer从Broker上拉取消息,经过网络传输到Consumer上
失败重试、消费者失败回应RECONSUMER_LATER
重试多次进入死信队列、堆积监控。

如何处理消费过程中的重复问题?(消费重复的情况必然存在,如何幂等处理?)

在MQTT协议中,给出了三种传递消息时能够提供服务质量的标准
At most once: 无可靠性保证、允许丢消息
At least once:至少被送达一次。即不丢消息,但也有少量重复。
Exactly once:消息只会被送达一次,不丢失也不重复

幂等性
At least once+幂等性 = Exactly once
1、利用数据库的唯一约束实现幂等(主键、如Redis setnx)
2、为更新的数据设置前置条件
3、记录并检查操作(Token机制或者GUID(全局唯一ID)机制)

Rocket MQ 如何解决消息顺序问题?(全局有序只能开一个队列,局部有序,要求顺序放同一个队列)

顺序消息:有网络延迟如何保证消费顺序?
因为网络延迟M2消息比M1先到Server服务端
全局有序
增加ACK确认机制,全局串行,缺点只要一条消息有问题,就会全局阻塞
局部有序
需要顺序消费时,针对队列加锁串行消费,这样实现局部有序,适用于大多数场景,使得同一个Topic中多个队列能并行消费,提高效率

RocketMQ 事务消息:二阶段消息+反查机制

概念:事务消息,主要解决生产方和消费方的数据最终一致性问题。
Q1:作为消息发送方,如何保证两步数据一致?
Q2:作为消息发送方,能保证消费时一定成功么?
请添加图片描述

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

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

相关文章

C++向函数传递函数

函数指针的定义格式为&#xff1a; <函数返回类型> (*指针变量)(<函数形参列表>) 例如&#xff1a; 下面定义了一个函数指针变量fp: double (*fp)(int);这意味着fp可以指向返回类型为double,参数类型为int的任何函数 比如&#xff1a; double func(int x){...}获…

基于springboot的购物商城管理系统

1.项目简介 1.1 用户简介 用户主要分为管理员和用户端&#xff1a; 管理员&#xff1a; 管理员可以对后台数据进行管理、拥有最高权限、具体权限有登录后进行首页轮播图的配置管理、商品的配置、新品家具商城的配置管理、、家具商城分类管理配置、家具商城详情商品管理、用户…

【Rockchip 安10.1 默认给第三方apk默认开启所有权限】

Rockchip 安10.1 默认给第三方apk默认开启所有权限 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip 3229 OS:Android 10.1 Kernel: 4.19 问题描述 有些第三方或者主界面&…

openEuler学习总结1(仅供学习参考)

华为的openEuler内核是源于Linux。 openEuler操作系统安装流程 第一步&#xff1a;开启虚拟化 第二步&#xff1a;安装一个虚拟化软件virtualbox 第三步&#xff1a;镜像 第四步&#xff1a;配置 设置虚拟机所在的目录 把网卡类型选择成桥接网卡 挂载镜像 设置完成&#xff0…

Git——修改历史记录详解

目录 Git1、修改历史信息1.1、启动互动模式1.2、修改Commit信息的影响1.3、取消Rebase 2、多个Commit合并位一个Commit3、一个Commit拆解成多个Commit4、在某些Commit之间插入新的Commit5、删除Commit6、调整Commit的顺序7、Revert指令7.1、取消Commit7.2、取消Revert1、再开一…

9. 综合案例-ATM系统 (1~7节知识综合练习)

ATM系统_综合大练习 今天的任务是对之前所有的学习的知识, 进行一个综合性的大练习. 老师说的好, 键盘敲烂 这个项目我写了大量的注释给大家参考, 如果有同学是跟着我的系列学习的, 一定动手练一练. 下面的代码只要按着敲是可以直接运行起来的, 我也把完整代码上传到了CSDN上…

17.WEB渗透测试--Kali Linux(五)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;16.WEB渗透测试--Kali Linux&#xff08;四&#xff09;-CSDN博客 1.ettercap简介与使用…

【技术类-04】python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示&#xff1a; 背景需求&#xff1a; 把python实现docx表格文字和段落文字的“手动换行符&#xff08;软回车&#xff09;”变成“段落标记&#xff08;硬回车&#xff09;合并在一起统计数量 【技术类-02】python实现docx段落文字的“手动换行符&#xff08;软回车&a…

C语言 数据在内存中的存储

目录 前言 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1.练习一 2.2 练习二 2.3 练习三 2.4 练习四 2.5 练习五 2.6 练习六 三、浮点数在内存中的存储 3.1 浮点数存的过程 3.2 浮点数取的过程 总结 前言 数据在内存中根据数据类型有不同的存储方式&#xff0c;今…

ElasticSearch常见用法,看这一篇就够了(文末送书)

2024送书福利正式起航 关注「哪吒编程」&#xff0c;提升Java技能 文末送3本《一本书讲透Elasticsearch&#xff1a;原理、进阶与工程实践》 大家好&#xff0c;我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎&#xff0c;它以其出色的实时搜索、稳定可靠、快速安…

PCIE问题定位000:PCIe需要的定位手段

1、PCIe debug环境说明 本文将以PCIe EP用户逻辑举例&#xff0c;描述PCIe可以添加哪些定位手段。 如图所示&#xff0c;PCIe IP作为endpoint与RC对接&#xff0c;用户实现了应用逻辑&#xff0c;与PCIe IP进行交互&#xff0c;交互信号中data格式为TLP报文格式&#xff0c;且…

单链表-合并两个集合的数

bb都在代码里哈哈哈哈 对了这里有个要求&#xff0c;不能破坏原来的链表 #include<iostream> #include<cstring> using namespace std;typedef struct LNode {int data;struct LNode* next; }LinkNode; void Create(LinkNode*& L, int a[], int l)//首先建链…

mongodb查询大全mongo语句-MongoDB语句与MySQL语句对比

mongodb查询大全mongo语句 以前版本官网:https://www.mongodb.com/ 现在版本2021年12月7日官网:https://www.mongodb.com 直通车:https://docs.mongodb.com 一、前言 虽然这些语句在开发当中不会使用,因为springdataMongoDB封装的非常完美了。但是这里的语句思想和关系型…

惯导系统静止初始化方法与代码实现并在gazebo中测试

惯导系统静止初始化方法与代码实现并在gazebo中测试 前言静止初始化方法惯导静止初始化实现代码在gazebo中进行测试 前言 在进行GPS加IMU的组合导航或者Lidar加IMU的组合导航时&#xff0c;用EKF或者ESKF的滤波方法时&#xff0c;需要提前知道惯导的测量噪声、初始零偏、重力方…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

机器学习——压缩网络作业

文章目录 任务描述介绍知识蒸馏网络设计 Baseline实践 任务描述 网络压缩&#xff1a;使用小模型模拟大模型的预测/准确性。在这个任务中&#xff0c;需要训练一个非常小的模型来完成HW3&#xff0c;即在food-11数据集上进行分类。 介绍 有许多种网络/模型压缩的类型&#xff0…

如何写好Stable Diffusion的prompt

Stable Diffusion是一种强大的文本到图像生成模型&#xff0c;其效果在很大程度上取决于输入的提示词&#xff08;Prompt&#xff09;。以下是一些关于如何编写有效的Stable Diffusion Prompt的秘诀&#xff1a; 明确描述&#xff1a;尽量清晰地描述你想要的图像内容。使用具体…

3.4 bp,si,di寄存器,寻址方式,寄存器总结

汇编语言 1. [bxidata] 我们可以用[bx]来指明一个内存单元我们也可以用[bxidata]来表示一个内存单元&#xff0c;它的偏移地址为bx中的数值加上idata mount c d:masm c: debug r d 2000:1000 e 2000:1000 12 34 56 78 a mov ax,2000 mov ds,ax mov bx,1000 mov ax,[bx] mov c…

训练YOLOv8m时AMP显示v8n

在训练Yolov8模型时&#xff0c;使用AMP&#xff08;Automatic Mixed Precision&#xff09;可以加速训练过程并减少显存的使用。AMP是一种混合精度训练技术&#xff0c;它通过将模型参数的计算转换为低精度&#xff08;如半精度&#xff09;来提高训练速度&#xff0c;同时保持…

llama笔记:官方示例解析 example_chat_completion.py

1 导入库 from typing import List, Optional从typing模块中导入List和Optional。typing模块用于提供类型注解的支持&#xff0c;以帮助明确函数预期接收和返回的数据类型。List用于指定列表类型Optional用于指定一个变量可能是某个类型&#xff0c;也可能是None。 import fir…