自学rabbitmq入门到精通

news/2024/6/16 3:00:04 标签: rabbitmq, 分布式

交换机的fault (发布与订阅模式)

因为消息是由生产者发送给excahnge,exchange发送给队列, 然后由队列发送给消费者的。

展示使用图形化界面使用fanout模式。

创建交换机

然后创建三个队列,绑定对应的交换机,发现给交换机发送消息给队列, 3个队列同都收到了消息

direct模式

 相对于发布订阅模式就是加了一个路由Key,如果说,消息的key是相同的,那么exchange就发送给对应的队列。

这个东西就像一个数据库,  queue就相几张表, 交换机就往里面发数据。批量发,条件发。

和上面的一样,不过 使用 direct模式的交换机,可以指定路由key,也可以不指定路由key,

不过,如果是设置由

如果说是一个没有routKey的消息发送,那么就会发送给那些没有路由的队列

如果说 是由routkey的,那么就只会发送消息给那些 队列中由routkey的队列

主题模式的交换机(topic)

可以看到主题模式相对于direct模式来说,添加了模糊匹配的路由规则

这里只是需要了解到 *的意思是一个,有且只有一个

#是一个或者多个。

headers的主题模式,带有参数的模式。

参数就是Arguments  ,如果是代码的话就是props代表里面的参数显示。

上面的都是图形化的界面的显示。 下面使用springboot进行整合

fanout 发布订阅模式

应用场景:

用户再下单之后相多个服务发送了短信推送服务、邮件服务、sms短信服务、微信推送服务

如果说在没有使用中间件的情况下,肯定是使用线程池,将每个消息都进行线程推送

但是这样 jvm中开启多个线程就十分的消耗资源,然后使用线程的过程中也是十分占用内存的资源,所以这个选择再开一台服务器,代替来工作,减少单台服务器的压力。

死信队列和过期时间的应用

这里只是 创建订单 -》做定时任务,超过10秒钟,将订单删除 

如果说用户在这个时候支付了订单,可以将数据库中的支付状态改为 1 , 那么消息接收的时候判断支付状态:如果支付状态为1,那么就不删除,如果支付状态不为1,是0(表示未支付) 那么就不将订单删除。

或者,如果用户在这个时候支付了订单,那么同时将消息队列中的这个消息删除。

rabbitmq常见的问题:

1.如何保证消息消费的可靠性:

1)对于生产者:通过事物消息:对于本地来说,如果在进行一个业务的时候需要进行消息的发送,那么,将这个同时包裹为一个事物,这两个东西必须一块完成。(这里可以通过confirm方法判断消息是否发送成功),如果说投递失败了,可以放到重试队列中进行重试。

2)对于MQ本身,打开持久化,避免宕机出现消息的丢失。

3)对于消费者:改为手动应答机制ack,确认接收到了某个消息。

2.如何避免重复消费

避免不重复消费: 1)生产者:不进行重复投递

                               2)消费者:不进行重复消费,将消费过的消息放到redis中,接收到了消息之后判断在redis中有无,如果有的话,那么就是消费过了,如果没有,那么就进行消费。

这里的判断可以将消息进行组合加密成字符串,放到redis中。

                               

3.如何保证顺序消费

单一消费者,但是对并发的效果不太友好。将需要保证顺序的进行hash,放到一组到同一个work模式。

4.如何实现延迟消息

一般使用死信队列。  本地存库,通过轮询。

5.消息为什么会堆积:

消费者消费的慢。  nack的多,可能有一直重发的。

或者再开一个topic服务。


http://www.niftyadmin.cn/n/5436432.html

相关文章

python 炸敌人。

给定一个二维矩阵,每一个格子可能是一堵墙 W、一个敌人E或者空0(数字0)。返回用一个炸弹可杀死的最多敌人数。炸弹会杀死所有在同一行和同一列没有墙阻隔的敌人墙不会被摧毁,只能在空地放置炸弹。 class Solution:def maxKilledEnemies(self, grid):rows len(grid)cows len(g…

视觉系统对透明胶水的检测都有哪些方案?

透明胶水的检测在工业生产中是一个挑战,因为传统的基于RGB相机的视觉系统通常难以检测透明物体。然而,随着技术的发展,现在有多种方法可以有效地检测透明胶水。 1. 高光谱相机:高光谱相机可以提供不同于传统RGB相机的解决方案。例…

C#处理文件

目录 1.管理文件2.管理驱动器3.管理目录4.管理路径5.获取文件信息6.控制如何处理文件 1.管理文件 C# 中使用 File 类可以进行文件的读取、写入和删除操作。File 类提供了多个静态方法来处理文件,如 File.Exists() 用于检查文件是否存在,File.ReadAllTex…

面试经典150题(114-118)

leetcode 150道题 计划花两个月时候刷完之未完成后转,今天完成了5道(114-118)150 gap 了一周,以后就不记录时间了。。 114.(70. 爬楼梯) 题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不…

HDOJ 2064

汉诺塔III Problem Description 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一…

Oracle 死锁、指标汇总

一、Oracle RAC 架构 待~ "SYS"."V_$SESSION" 与 "SYS"."GV_$SESSION"的区别 哪个列可以区分V$和GV$: 添加条件 S.INST_ID USERENV(INSTANCE) SELECT * FROM GV$SESSION S WHERE S.USERNAME SCOTT AND S.INST_ID USERENV(IN…

【Godot4自学手册】第二十六节用GPUParticles2D节点实现地宫入口的奇异光芒

我们的主人公与NPC对话完成后,夜晚来临,在城北有一处乱石岗,出现了奇异光芒,这是地宫的入口,但是有一妖怪把守,我们必须消灭妖怪后才可发现地宫入口。这一节,主要记录利用粒子系统GPUParticles2…

学完排序算法,终于知道用什么方法给监考完收上来的试卷排序……

由于每个老师批改完卷子之后装袋不一定是有序的,鼠鼠我被拉去当给试卷排序的苦力。面对堆积成山的试卷袋,每一份试卷袋的试卷集又很重,鼠鼠我啊为了尽早下班,决定用一种良好的办法进行排序。 1.插入排序 首先考虑的是插入排序。…