MQ学习笔记

1.MQ基本概念

在这里插入图片描述

2.MQ优势

1.服务解耦

**降低服务间耦合性,提升可维护性及扩展性。**
如下图:订单系统发送数据给库存、支付、物流三个系统,但后期又需增加X系统,此时只需X系统自己从MQ获取信息即可,无需改动订单系统代码。

在这里插入图片描述

2.流量削锋 (削锋填谷)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.异步调用

如下图:用户下单之后直接由订单系统返回下单成功即可,而不需等后面的库存系统、支付系统、物流系统都返回才通知用户,异步处理,提速。

在这里插入图片描述
在这里插入图片描述

3.MQ的劣势

在这里插入图片描述

小结

在这里插入图片描述

4.常见MQ对比

在这里插入图片描述

5.RabbitMQ

1.RabbitMQ是基于AMQP协议使用ErLang语言开发的一种消息队列产品。AMQP:是一种高级消息队列协议,类比Http
2.RabbitMQ有六种工作模式官网:https://www.rabbitmq.com/

5.1 RabbitMQ的工作模式

1.简单模式

一个生产者一个消费者

2. work Queues 工作队列模式

多个队列之间属于竞争关系,一条消息只会被一个消费者消费

在这里插入图片描述

3.发布订阅模式

声明交换机,生产者发送消息到交换机后,交换机会将消息发送至所有与之绑定的消息队列,以供不同的消费者消费。

在这里插入图片描述

4.Routting 路由模式

在这里插入图片描述

小结:
Routting路由模式在绑定交换机的时候必须必须指定RouttingKey,消息会转发到符合的Routting key的队列。交换机的类型必须为direct

5.Topics 通配符模式

在这里插入图片描述
小结:
在这里插入图片描述

6.RabbitMQ工作模式总结

工作模式官网:https://www.rabbitmq.com/getstarted.html

在这里插入图片描述

5.2 RabbitMQ高级特性

1.消息的可靠性投递

使用RabbitMQ的时候,发送方为了防止消息丢失,RabbitMQ提供了两种方式来确保消息投递的可靠性。
·confirm 确认模式:消息从producer到exchange(交换机),会返回一个confirmCallBack。
·return 退回模式:消息从producer到exchange失败后会返回一个returnCallBack。
我们利用两种callBack控制消息可靠性投递。

2.Consumer ACK机制

在这里插入图片描述

手动签收:1.开启手动签收:acknowledge=“manual”2.监听器实现ChannelLawareMessageListener接口3.如果消息处理成功,则调用channel的basicAck()签收4.如果消息处理失败,则调用channel的basicNack()拒绝签收,broker重新发送给Consumer。

3.消费端限流

首先需要确保签收模式为ACK手动签收
listener-consumer 配置属性:perfetch=1 (表示消费端每次从MQ拉取一条消息进行消费,直到手动签收完成才会拉取下一条消息)

4. TTL

TTL:全称time to live(存活时间/过期时间)当消息到达过期时间后若还未被消费会被移除。
两种过期模式:
1.队列统一过期时间;
2.消息单独过期时间;
注:如果同时设置了队列过期时间以及消息单独过期时间,以时间短的为准。

5. 死信队列

死信队列,英文缩写:DLX 。Dead Letter Exchange (死信交换机),当消息成为Dead message后,可以被重新发送到另一个交换机,这个交焕机就是DLX。

在这里插入图片描述

消息成为死信的三种情况:
1.队列消息长度到达限制
2.消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false;
3.原队列存在消息过期设置,消息到达超时时间未被消费;
队列如何绑定死信队列
队列绑定死信交换机:
给队列设置参数:x-dead-letter-exchange和x-dead-letter-routing-key

6.延迟队列

延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。
需求:
1.下单后,30分钟未支付,取消订单,回滚库存。
2.新用户注册成功7天后,发送短信问候。
实现方式:1.定时器:2.延迟队列:如下图

在这里插入图片描述

RabbitMQ如何实现延迟队列?
RabbitMQ可以通过 TTL+死信队列 来实现延迟队列效果。

在这里插入图片描述

7.日志与监控

RabbitMQ默认日志存放路径: /var/log/rabbitmq/rabbit@xxx.log查看日志命令:(控制台查看更直观)
查看队列# rabbitmqctl list queues
查看exchanges# rabbitmgctl list exchanges
查看用户# rabbitmgctl list users
查看连接# rabbitmgctl list connections
查看环境变量# rabbitmgctl environment
查看未被确认的队列# rabbitmqctl list queues name messages unacknowledged
查看单个队列的内存使用# rabbitmqctl list queues name memory
查看准备就绪的队列# rabbitmactl list queues name messages ready
查看消费者信息# rabbitmgctllist consumers

8.消息追踪

在使用任何消息中间件的过程中,难免会出现某条消息异常丢失的情况。
对于RabbitMQ而言,可能是因为生产者或消费者与RabbitMQ断开了连接,而它们与RabbitMQ又采用了不同的确认机制;也有可能是因为交换器与队列之间不同的转发策略;甚至是交换器并没有与任何队列进行绑定,生产者又不感知或者没有采取相应的措施;另外RabbitMQ本身的集群策略也可能导致消息的丢失。
这个时候就需要有一个较好的机制跟踪记录消息的投递过程,以此协助开发和运维人员进行问题的定位
在RabbitMQ中可以使用Firehose和rabbitmg tracing插件功能来实现消息追踪。

9.RabbitMQ应用问题

1.消息的可靠性保障
·消息补偿机制
需求:确保消息100%发送成功。
消息补偿方案如下图:

在这里插入图片描述

2.消息的幂等性保障
·乐观锁解决方案幂等性指一次和多次请求某一个资源,对于资源本身应该具有同样的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同
在MQ中指,消费多条相同的消息,得到与消费该消息一次相同的结果
常用幂等性方案,使用数据库的乐观锁,如下图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LuaRadio介绍

介绍 LuaRadio是一个用于构建信号处理流程图的框架 在软件定义的无线电流图中,源和接收块倾向于实现某种I/O,如从SDR加密狗读取样本,或将样本写入IQ文件,而处理块倾向于计算,如滤波器和乘法器。 数据类型说明 LuaRadio…

高端品牌如何利用软文抓住顾客的心?

如今高端品市场价值巨大,但之前由于“口罩”影响和冲击,高端品牌的线上销售份额占比较少,同时得益于互联网和新媒体技术的发展,高端品的利润来源大多数是线上推广进行销售,而软文就是高端品常用的推广方式,…

【操作系统】聊聊不可中断进程和僵尸进程

当我们输入top命令之后 其中S代表的是当前进程的状态 R (Running 或 Runnable) 进程在CPU的就绪队列中,正在运行或者等待运行。D (Disk Sleep) 不可中断睡眠,进程正在跟硬件交互,不运行被其他进程或者中断打断。Z (Zombie) 进程已经结束&am…

Nosql redis高可用和持久化

Nosql redis高可用和持久化 1、redis高可用2、redis持久化2.1redis持久化2.2Redis 持久化方法2.3RDB 持久化2.3.1RDB持久化工作原理2.3.2触发条件2.3.3其他自动触发机制2.3.4执行流程2.3.5启动时加载 2.4AOF 持久化2.4.1AOF持久化原理2.4.2开启AOF2.4.3执行流程2.4.4文件重写的…

Docker之Dockerfile搭建lnmp

目录 一、搭建nginx ​编辑 二、搭建Mysql(简略版) 三、搭建PHP 五、补充 主机名ip地址主要软件mysql2192.168.11.22Docker 代码示例 systemctl stop firewalld systemctl disable firewalld setenforce 0docker network create --subnet172.18.…

springboot家政服务管理平台springboot29

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

Qt开发学习笔记02

将窗口设为提示框 Qt::ToolTipQt 数据库连接池 #ifndef SQLITE_H #define SQLITE_H#include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QQueue> #include <QMutex> #include <QDebug> #include "../con…

深入了解 RabbitMQ:高性能消息中间件

一、什么是消息队列 消息队列(Message Queue)是在消息的传输过程中保存消息的容器、 消息指的是两个应用间传递的数据。数据的类型有很多种形式 二、应用场景 主要有三个作用异步处理 场景说明: 用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法串行的应用解耦 场…

竞赛选题 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

anaconda安装及配置+pytorch安装与配置(自用笔记)

anaconda安装及配置 1、anaconda官网下载安装包 下载好后进行安装 2、anaconda安装地址(记住安装路径)&#xff1a; 3、配置环境变量 打开anaconda prompt: 输入命令conda list: 可以看到安装好的很多包&#xff01; 至此anaconda配置完成。 PyTorch的安装与配置 使用con…

成功解决@Async注解不生效的问题,异步任务处理问题

首先&#xff0c;有这样一个异步监听方法 然后配置好了异步线程池 package com.fdw.study.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conf…

机器学习笔记 - 两个静态手势识别的简单示例

一、关于手势识别 手势识别方法通常分为两类:静态或动态。 静态手势是那些只需要在分类器的输入处处理单个图像的手势,这种方法的优点是计算成本较低。动态手势需要处理图像序列和更复杂的手势识别方法。 进一步了解可以参考下面链接。 静态手势识别和动态手势识别的区别和技…

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】

文章目录 1.1 什么是 CI-700?1.1.1 关于 CI-7001.1.2 CI-700 特点1.2 全局配置参数1.2.1 寻址能力1.3 组件和配置1.3.1 CI-700 互联的结构1.3.2 Crosspoint(XP)1.3.3 外部接口1.4 组件(Components)1.4.1 RN-I & RN-D1.4.2 HN-F(Fully coherent Home Node)1.4.3 SBSX(AM…

Redis作为缓存,mysql的数据如何与redis进行同步?

Redis作为缓存&#xff0c;mysql的数据如何与redis进行同步&#xff1f; 一定要设置前提&#xff0c;先介绍业务背景 延时双删 双写一致性:当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致 读操作:缓存命中&#xff0c;直接返回;缓存未…

招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

electron之进程间通信

Electron进程间通信 使用electron编写程序时经常遇到下面这种场景&#xff1a; 当用户点击一个按钮时&#xff0c;需要将页面输入的信息保存到本地电脑上&#xff1b; 或者是点击菜单时&#xff0c;需要页面窗口做出响应。 用户点击的按钮和窗口展示的内容是运行在渲染进程中&…

超好用的IDEA插件推荐!

大家好&#xff0c;Apipost 最新推出IDEA插件V2版本&#xff01;V2版本主要是Apipost 符合更多用户的需求而推出&#xff0c;支持在插件中获取 token、支持代码完成后在插件中进行 API调试 &#xff0c;同时也保留了1.0版本部分功能如上传选择目录功能等。 V1版本还会继续保留…

湖南互联网医院|湖南互联网医院牌照办理流程及材料

互联网医牌照&#xff0c;一个让医疗行业焕发数字化新生的通行证。随着时代的进步和技术的发展&#xff0c;互联网已经深入各个行业&#xff0c;医疗领域也不例外。而互联网医牌照的办理流程、内容以及所需材料&#xff0c;则是诸多医疗机构所关注的核心内容。 第一种是实体医…

nssm nginx window 部署和开机启动服务

部署 去到Nginx官网&#xff1a;nginx news &#xff0c;然后点击“download” 在nginx的配置文件是conf目录下的nginx.conf nginx.exe http://localhost 在cmd命令窗口里面输入nginx命令(快速停止nginx) &#xff1a; nginx -s stop 或者使用(完整有序的停止nginx)命…

语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆

文章目录 mask图像介绍步骤代码 mask图像介绍 根据 mask 图像来画分割对象的外接椭圆是一种常见的图像分割任务。Mask 图像通常是一个二值图像&#xff0c;其中包含了感兴趣对象的像素。通常情况下&#xff0c;白色像素表示对象&#xff0c;黑色像素表示背景。 步骤 以下是一…