粉丝661获赞2117


好,同学们,接下来我们就开始今天的第二章, rabbit mq 的快速入门, 在这一章当中啊,我们会去了解一下 rabyten q, 并且呢去安装它,然后我们会给大家介绍一下 rabytem q 当中的常见消息模型,最后呢我们还会带着大家动手呢,去写代码,看一看 rabyten q 它如何实现这种意步的消息通讯。 好,那接下来我们就进入第一部分啊, rabbit mq 的一个简单认识和安装。 rabbit mq 啊,是一个基于啊浪语言开发的开源消息通讯中年间, 而阿浪语言大家可能不太熟,这是一个面向并发的变成语言,天生就是为了分布式系统来设计的,而 rabbit mq 基于他来 完成,自然就具备了这些个特征,那因此他的一个性能,吞吐量都还是相对来讲不错的啊。但 rabomq 最擅长的其实是消息的可靠性,稳定性,整个系统的这种高可用啊。 那这里呢是 mq 的一个官方网站,我已经提前打开了啊,大家可以看到啊,这个网站啊,这上面有一群的兔子,那另外呢,这边呢还会有一些文档,那大家呢,如果想要去学习 mq 最好呢基于这个文档去进行学习啊, 好,那现在我们再回到 ppt 啊啊,那在这里呢,我们就带大家去安装一下 rabyten q 了啊,安装方式呢,可以参考课前资料, rabyten q 的部署指南, 我们打开看见资料可以看到呢,这里有一个文档,然后咱们 q 不输指南,我们把它打开。 好,那接下来呢,我们就来完成这个部署,这个部署呢有单击部署和集训部署两种方式,我们呢就来看单击部署就行了,我们将在三斗司训练机当中利用刀砍来进行部署,因为这种方式是最简单最方便的嘛。 啊,那第一步肯定是要获取刀壳的镜像了,那么这个镜像大家可以去直接 po 拉取,也可以从科研资料当中去导入这个踏包,而导入的方式我们之前已经讲过了啊,就是利用这个刀壳 low 的命令来完成导入,对吧? 那么下边呢,我们就来打开我们的训练机,我们通过 docker amidis 先查看一下我们本地印象。啊, 好,可以看到,我这里也没有 mq, 对不对?那接下来呢,我就按照刚才文档中所说把它导入一下,那我们打开, 哎,课前资料这里呢有一个套包,现在呢,我们把它上传上来啊,那上传到哪里呢?我们上传到这个 tmp 的目录吧,这临时目录嘛,我们把它拖上来。 好,我们可以看到一百多兆啊, 好,上传完成,完成以后,我们再次回到这个小控台,然后通过一个命令来安装啊,我们先进入天平部路看一眼,有的吧,怎么导入?同学们,命令是什么?告诉我 刀干什么 low 的,干啊,哎, mq 点踏,哎,很好啊,走 好。经过一番安装,我们发现导入成功了,我们通过 docker images 查看一眼,发, 发现这里导入了一个名为 rap mq 版本呢,是三杠 management 的这样一个镜像,已经成功导入了。好,那第一步我们就完成了,我们再次回到文档看一下, 导入了以后,下一步自然就是安装 mq 了,运行这个刀口 rad 命令吗?那这个命令呢?在这我已经给大家贴好了, dock run 杠一 杠一呢是给我们的 mq 设置一个黄金变量,黄金变量我这配了两个,一个是 user, 一个是 password, 也就是用户名和密码。将来我们需要去访问 mq 或者是登录他的管理平台,都需要用这个账号和密码, 再往下干个 name 呢,是给他起个名字,这块呢是配置主机名,不配呢,也没问题,但是如果将来做集群部署就要配这个东西了。杠批呢是他的端口映射,这里我们开放了两个端口啊,一 个是幺五六七二,这个呢是 raby 咱们 q 的管理平台的端口,他会给我们提供一个 ua 界面,我们去管理起来就非常方便了。第二个五六七二呢,是将来做消息通信的一个端口,也就是说我们将来发消息,收消息都要通过这个端口去建立连接。 杠地是后台运行,最后呢是镜像的名称。好,那下边呢,我们就把这个命令啊给他敲一下,我们回到下个控制台,然后在这呢进一个粘贴回车 好容器创建完成,我们通过刀砍 ps 查看一下是不是成功的启动起来了。启动起来以后呢,我们就可以去访问了啊,他端口我们刚才讲了,幺五六七二是他的什么端口啊?是不是空了台端口,所以我们只需要在浏览器里访问这个地址就能够看到了 啊,那现在呢,我们就打开浏览器,在这里输入训练基地地址啊,幺九二点幺六八点幺五零点幺零幺,端口呢是幺五六七二,大家记住这个端口啊, 好,回车可以看到呢,成功的进入了 raby temque 的管理界面了吧,这里啊要输入一个账号和密码,我们刚刚在刀口 rat 命令中啊,指定的是 it cast, 密码是一二三三二一,点击 log in, 这样呢就成功的登入了我们 rabbit mq 的一个管理平台了。同学们, 那么在这个界面当中有很多的东西啊,大家现在都不认识啊,没有关系,等一会呢,我们就会一一给大家介绍。那首先呢,这第一个界面叫 overview, 就是总懒,那么这个界面呢,主要就是 mk 的一些节点的一些详细信息,当前我们是单节点运行,没有集群吧,所以节点中只有一个,然后呢,后边是他的这个硬件的一个信息啊, 然后在这儿 connection, connection 就是连接,将来无论是消息的发布者还是消息的消费者,都应该跟我们的 mq 键连接吧,所以这个 connection 呢,就是连接, 而前头呢是一个通道,将来我们建立连接了以后,一定要创建一个前头通道, 然后生产者或者是消费者才能基于钱脑完成消息的发送或者是接收啊,所以你可以认为钱脑是 mq 当中做消息发送也好,接收也好等等各种操作的一个具体对象了啊,将来每一个连上来的人都应该去创建一个或多个通道啊,再往下呢, x 欠着,这个叫交换机,他是一个消息的路由器啊,就跟咱们那个教室里边的路由器交换机效果是类似的。然后 q 呢,就是对列了, 对列就是来做这个消息存储的啊,那现在呢,可以看到还没有任何的对列吧?刚才交换机看到还是有一些交换机的啊,但是没有对列 好,那最后奥特曼呢?是叫做管理,那么在这个界面当中,我们可以去管理当前这个呃用户信息啊,比方说我现在是不是有个用户叫 it 卡死他呀?那我还可以干什么呢?在这创建更多的用户, 比方说我现在要创建个用户,我只需要在这点击爱的 uzer, 然后在这呢给用户起个名字啊,比如说就叫李四,然后给他起个密码,比如说一二三,一二三,那这样一个新的用户信息就填好了,这里还可以给用户分配一个这个 呃角色啊,比如说艾特曼呢,是超级管理员啊,这里的 money 特呢,就是一个系统监控的啊等等,我们可以去选,比如说选艾特曼啊,超级管理员,那么这个信息呢,就成功的提入到这里了,最后点击艾的 user, 那么我们这个用户就添加成功了, 但是你发现啊,当我新增一个用户以后,他其实是没有任何访问权的,看到没有?没有 no access, 那这个是因为什么呢?这里有一个说明啊,大家可以看到叫做 virtue house, 虚拟主题 啊,虚拟主机啊,虚拟主机是什么呢?是我们 mq 当中的一种逻辑划分,将来我们会有很多个用户,对吧?那这个埃迪卡斯的用户,他来操作我们的 rabbit mq, 创建自己的队列,自己的交换 机等等,那么我们的李四用户也来做这些事,那这两个人在操作过程中是不是有可能产生冲突啊, 那为了避免这种问题的发生啊,我们就有一个叫 virtue house 虚拟主机的概念,那通过虚拟主机对不同的用户进行一个隔离,大家互相看不到对方的东西,这种呢就称之为多租户的一种处理了,对吧?是一种隔离,这就是虚拟主机的概念了, 虚拟主题目前啊默认只有一个,就是斜杠,那我们还可以通过在这玩手 houses 创建更多的虚拟主题,比如说添加一个新的名字呢,也可以随便取,比如说就叫杠, it cost, 然后在下边呢,还有这个虚拟主机的一些描述信息啊,你也可以写,也可以不写好,点击添加,你看一个新的虚拟主机是不是创建好了,现在我们再次回到 u 字界面,在这个界面当中呢, 我们可以看到艾迪卡斯用户具备杠和艾迪卡斯访问权限,而李四还是没有任何权限,而你点击用户信息了,就会进入用户的视力界面,你可以给他分配权限啊, 怎么分配呢?比如说我让他访问爱迪卡斯特,那这样呢,点击赛的 permission, 他就具备了对爱迪卡斯的这个虚拟主题的访问权了。那我们再次返回到优乐界面,可以看到是不是有访问权了, 然后呢,我们还可以点击到交换机的界面来看一眼,在这个界面当中,你会发现啊,虚拟主机杠和 airicast 他们所具备的信息是不是一样的, 也就是说呢,这里面虽然名称是冲突的,但是呢,因为虚拟主机不同,他们是不是给被隔离开了?一般情况下,同学们,我们回答的跟你见面每一个用户应该由自己独享的虚拟 主题啊,同学们能理解的意思吧,好比方说我的艾迪卡斯的,我点进去我就让他只具备杠的防御拳,不具备这个艾迪卡斯的防御拳,那这样一来,他们两个的业务是不是就被隔离开了,互相就看不到对方的这个内容了? 那这就是我们的这个多租户以及这个虚拟主机的一个隔离了。行了,那 mq 的安装就完成了,下面呢,我们回到 ppt 来看一下我们这个 mq 的一个整体结构啊,刚才其实我们已经给大家做了简单介绍了,这边 population 呢,是我们的消息发送者,看修门呢,自然就是我们消息的消费者, 他们的意思呢,将来会把消息发送到 x change, 也就是我们的交换机,交换机呢,负责路由,再把消息投递到 q 对列,对列负责斩存小。 而后呢,我们的消费者再去从队列当中获取消息,然后处理消息,整体呢,就是这样子的啊,那你会发现呢,这里有一个叫 vershow house 的一个概念虚拟主机吗?将来我创建了一个用户以后, 他呢会有自己的一个虚拟主机,再创业,新的用户再有虚拟主机,那各个虚拟主机之间是相互隔离的,看不到的,这样可以避免干扰,这就是整体 mq 的一个架构了啊, 好,那最后呢,我们来做一个总结, rabbitom q 当中的几个概念,第一呢是 channel, 是操作 mq 的工具啊,你做消息的发送也好,接收也好,都必须要用的 channel。 x change 是消息陆游,将来消息发送给他,他在陆游给对列。对列呢?当然就是缓存消。 记得了 versa house 的虚拟主题是对 q x 限制等等这些东西资源。那个逻辑分组啊,将来呢?给它隔离起来,不同用户可以访问不同的虚拟主题。好,那我们这节课的内容就到这里。

大家好,这个视频记录了 santos 八安装 rabbit mpu 的操作步骤,避免新手踩坑。 rabbit mpu 需要以 airline 为基础版本,需要对应正确。首先打开 rabbit mpu 官网, 点击上方菜单的 get started, 点击 download 加 installation 按钮,在这个位置找到 sentos, 点击进入往下拉,找到这个位置,打开我们的 sentos 八 新建配置文件我这里已经安装过了,大家打开时应该是空白的。复制页面上的内容, 按键盘的 i 键粘贴进来,输入 w q 保存,注意前面的英文冒号更新 yum 有个错误原因是 santos 八停止了原的服务,再执行 young update y 就可以了。 我这里 docker 版本有些老,需要跳过,按照提示信息加上参数就可以了。指定第一步的配置信息。 安装 airline 和 rabbit mpu, 安装好后,启动 rabbit mpu, 查看启动是否成功,可以看到绿色的 active 设置,开机自动启动。 开放防火墙的幺五六七二和五六七二两个端口,使用如下命令,打开端口并重新启动防火墙。 刚安装好时, 管理页面打不开,因为还需要启用管理页面插件重启 rabbit mpu 默认的 guest 只能通过 local host 本机访问,所以需要自己添加新用户。我们这里添加一个 root 用户, 给用户赋予权限, 就可以使用 root 用户成功登录了。在 exchanges 的 tap 下拉框中,默认只有四种类型,需要自己安装延迟队列插件,复制一下插件下载地址, 找到你 rabbit mq 下的 plugins 目录, 使用 w get 命令下载至插件目录中。启用延迟队列插件, 查看延迟队列插件是否启用成功,然后就可以在 exchanges the type 选项中找到 x delayed message。 如果你喜欢这个视频,记得点赞关注下个视频见,感谢观看!

raphanim q 是如何实现死性对列的?死性对列是 raphan m q 提供了一种特殊序列,处理那些无法被正常消费的消息。 那么通常呢,就有三种情况会产生实行对联。第一种呢就是消息被消费者明确拒绝。 第二种是消息达到了预设的过期时间,仍然呢没有被消费。第三点呢,就是消息由于对列已经达到最大长度限制而被丢弃。那么在 rap 的名 q 中实现实现对列呢?只需要给正常对列增加三个合金参数就可以了。 第一个呢,就是 d delete exchange, 指定了当前对列对应的死刑对列。第二个就是 d delete roting key, 指定消息转入死刑对列时的路由键。第三也就是 message t t l 消息在对联 中的过去时间。那么接下来呢,我们就可以往正常对立中发消息,如果消息满足了哪些条件,就会成为死性,并被重新发送到对应的死性对立中。而此时 rap 的名 q 会在消息的头部添加一些与死性相关的 补充信息,例如时间成为死性的原因原对列等等。应用程序呢,可以按需处理这些补充的消息。 那么最后呢,死性对立中的消息都是正常业务处理失败的消息。应用程序需要创建一个消费者来专门处理 这些被遗漏的消息,例如记录日志,发送警报等等,这样才能保证业务数据的完整性。关于这个问题的详细文字版解答,我已经整理进了一份八十万字的加瓦密斯大全,需要的小伙伴评论区置顶领取。

rabbit m q 的镜像队列原理,那么要理解这个镜像队列的话呢,就必须理解啊,凯菲老师上一节课讲的这个 rabbit m q 的这个集群啊,因为这个镜像队列是基于集群模式的,就在集群模式的情况下呢,才能够啊,就是设置这个镜像队列, 所以说呢,一定啊,设置镜像对列的话,首先我们就要存在这个多个节点,存在多个节点啊,比如说先要做集群,然后才能来到设置镜像对列,那么这个镜像对列呢,其实就是在集群模式上做了一个升级,因为我们前面讲了,这个集群呢,他是保证不了高可用的,那么这个 rapid mq 你要想使用这个就是要想保证呢,这个高可用的话,他们就必须使用这个镜像对列啊,集群加镜像对列, 那么这个迹象对列啊又是怎么回事?来看一下啊,这个本视频的文档我已经整理好了,并且与往期内容一起汇入,放在了视频的最后面,坚持看完,一定对你有关。所以说谭伟老师这张图啊,是将官网上的就是 rapidmq 的官方网站啊,上面的这张图就进行了一点点优化啊,进行点点优化,呃,官网上的那张 图了,我们只能够焊出几个角色,看不出他的一个流程,这里呢,我们简单的看一下啊,这张图优化之后,就首先呢,这里是一个 q, 就是我们的这个 amqp 啊,这个 q 我们要理解一下啊,那么在这个 rapidmq 中,他的这个 q 呢,其实包含了在这个镜像对列里面啊,如果你设置为镜像对列的话,那这个 q 呢,包含了四个部分, 前面的这个 q 呢,就是我们我刚刚说的这个 a m q p q 啊,就是我们整个 q 啊,就是这整个 q, 其实这里呢应该叫,应该叫做 a m q p q 啊, 那么整个队列包含四个部分啊,第一个部分是这个 q, 就是 a m q b q, 它用来处理什么呢?用来处理负责处理 a m q b 协议,就是比如说我们的提交啊,回本呐,还有 a c k 啊,对吧?等等这些交互啊,由它来处理。 那么还有一个呢,里边呢,这个这个 q 里边就是包含了一个 blocking q, 这个 blocking q 就是个主色队列,它就是真正用来存储消息的,就说这个 blocking q 啊,它是真正用来负责存储的啊,像 消息实际上是存储在 blocking q 中,那么它外边呢,有一个叫做 mirror 刚 q 杠 slave, 那么前面当然有个 master 啊,这个镜像的话,实际上就是存在这个储存架构嘛,那么这个 q slave 以及这个 master 呢?它其实是两个进程,这两个进程呢,真正的负责操作这个 blocking q 啊,这里讲了 mirror 杠 q 杠 master 或者是 slave, 它们负责消息的一个处理,就说比如说我消息进来了啊,由这个进程负责了,将这个消息呢写到这个 blocking q 中,或者是说呃,从 blocking q 中呢,把这个消息呢,把它呃读出去啊,由这个进程呢来负责处理 master 中就是这个 master 了啊, 啊,那么下面这个 g m 又是什么呢?这个 g m 呢,就是我们这个也是这个 q 中的一大模块,也是其中的一个模块啊,那么这个 master 下面这个 g m 呢?它还有一个协调者的一个作用,这里要注意一下,那么这个 g m 是干什么用的呢?这里呢还不是画了很多的箭头啊。首先呢,我们来看一下这个箭头,就是这个这个 环形的这个箭头实际上代表着他是一个链表啊,一个链表,那么每一个 q, 每一个 q 啊,就是我这边标为了灰色的,就是重,重接点啊,就是重接点,那么就是镜像,真正的镜像对列就是标为灰色。为什么标为灰色呢?因为这是镜像对列啊,在正常情况下,他们是不会工作的, 他们只负责同步数据,不对外提供读写服务啊,由 master 对外呢,由这个 master 对外提供读写服务。镜像对列只是在这里做备份只是做备份啊, 那么他们这个就是这个镜像对列啊,那么这个 gm 他就负责消息的广播,也就说当我这个呃发送者把消息发进来之后,发送进来之后啊,这个 gm 呢?他就会把这个消息广播出去,怎么广播呢?这里其实 gm 维护了一个列表,他为了维护他相邻的节点,就说他知道他的下一个节点是谁,知道他的上一个节点是谁, 那么他收到这条消息之后,他就把这条消息要发给他的下一个节点,发给这个 gm, 发给这个 gm, 那么这个 gm 收到之后呢,他也是他也知道他的下一个节点是谁,对吧?就这个列表啊,他有一个指针,那么 这个 gm 呢?他呢把这个消息呢?发给了发给他的下一个节点,那么这个 gm 呢?同样的也要把他的消息发发给他的下一个节点,说白了就是形成了一个环,对不对啊?当这个 gm 把这个消息哎发给他的时候,那么当这个 master, 这个 gm 收到了这条消息,就是我,就是我发出去的这条消息,我自己又收到了,意味着什么?意味着这条消息呢?同步完成了啊,就这条消息, 呃,收到消息啊,收到消息时代表了消息同步完成,那么这种通过这种机制啊,保证这条消息呢,可以在我的这个 呃这个集群中多个节点上都有备份。那么只是如果说我这个 master 要是挂掉了的话,那么呢我就可以把这个 slay 五了,把它提成这个组,他也会对外提供服务啊, 那么怎么提呢?是这个 gm, 就是这个整个集群中啊,就是时间最长的这个 slave, 它会晋升为 master, 但这是它里边这个选举机制啊,就是存在时间最长的这个 slave, 会被选选成这个 master, 成为这个新的 master, 因为这个存在时间最长的这个字类物呢,肯定是跟这个呃主这个 master 呢进行同步的最多的啊,那么通过这种环形的这种同步好,那么这里边啊,为什么还有这么三个箭头?就是干什么这个箭头啊,就这个箭头跟这个箭头啊, 那么这个箭头是负责干什么的?就是我, gm 就是你,你这个组不是把消息发过来了吗?对不对?发给了这个 gm, 但是 gm 这个模块呢,他不负责操作这个 blocking, 所以说这个 gm 呢,收到消息之后呢,他会去调这个 mirror q 杠四类物,由他负责把这个消息呢放到这个 blocking q 中去, 相当就是完成了整个消息同步的一个过程啊。好,那么这个其实就是这个镜像对列的一个简单的一个图, 所以呢我们结合这个镜像队列啊,这个镜像队列结合前边的这个 rapid m q 的那个集群,那么呢就可以实现这个高可用了,就说我这个 master 当调,对吧?我这个 slave 呢可以提成 master, 从而呢保证这个高可用。好,那么这里呢就是 rapid m q 的 镜像对列原理的一个啊,减速, i don't want to be left behind。

大家好,今天这个视频我们来看一下怎么用 rapid m q 延迟对列插件实现订单超时取消的功能。经过我的实践发言,只能在消费延伸消息时对业务进行判断来实现订单取消功能。 也许你搜索时看到有文章写的,可以通过 channel 点 basic guide 方法对延时对列中的消息进行循环获取, 然后判断是否找到目标消息,从而实现在消息过期前删除的目的。我可以告诉你,那都是没有经过实际验证的错误。结论,首先 basic get 方法实际上是对消息进行消费,获取消息的前提是目标对列中必须 有消息,而根据插件的描述,宵夜是在到期之后才会分发到银蛇队列的,所以 basic 该的方法后期到的只能是浪指,大家也可以自己去进行下实验, 用一个 direct 的模式,然后不要让接收方进行接收,这个时候你才能用 basic 盖的方法从目标对列中获取到发送的消息。下面我们来看一下用 reaby 的 mkr 延迟对列插件实现订单超时取消的演示。我们这里先新建一个 mak glay, 用来对数据进行临时保存,这个是用来对数据持久化进行一个模拟。发送方有两个入餐,一个是订单 id, 一个是支付状态。首先分两步, 第一个是发送消息到订单延迟对列,然后经过一段时间后把支付状态存储起来,接着方监听这个延迟对列。获取到消息后,首先到存储数据的地方, 比如 redis 或者是数据库获取到存储的数据,然后对状态进行一个判断, 如果之前没有付款成功,就走到后面的订单取消逻辑,如果付款成功的话,就直接跳过后续逻辑。我们来看一下实际操作,比如说按键是一二三,然后是没有支付创建成功,付款超时订单取消, 然后我们让他孵化成功。好,他就不会走这个订单取消的逻辑了。 好了,上面就是用 rapidamq 演示对的插件实现订单超时取消的演示,希望能对大家的工作学习有所帮助。如果您有其他可实现的方式,还请布林赐教, 感谢观看下个视频,再见!


rabbit mq 的事物消息,那么在这个 rabbit mq 里面,他是支持这个带事物的一个消息的啊, 我们这边说的这个事物跟我们数据库中说的这个事物呢,也是一样的啊,都是呢,会保证这个 acid 的一个特性啊, 他这个事物跟我们数据库的这个事物很像啊,就是可以开启这个事物,然后呢提交以及回滚,他都有了这个相应的 api 一个支持啊, 那么这个 raby 的 mq 他的这个事物消息了,我们要注意一点啊,这个事物消息啊,他的这个性能呢,通常不太高,这个我们要知道,但是呢在有些场景下面呢,又必须要去使用这个事物消息, 比如说我们这个生产者,对吧?把这条消息发出去之后,可能呢,我后面呢还要做一些处理啊,首先是发出消息,对吧?就是剩的出一条消息,那么我后面呢可能还要做一些啊,一些逻辑处理, 那么可能我这整个的呢,我需要在一个事物里面啊,也就是说后这是这条消息啊,发送成功与否,那么跟下面的这个极其相关,对吧?如果我下面执行失败了,那么我可能这条消息呢,我就,呃相当于呢我就不发送了,那么这个时候怎么办呢?你已经发出去了,怎么办?呃,对不对啊? 那么也就是说这个 raby mq 呢,实际上呢,他也提供了一种回滚机制啊,就是说如果说你下面的这个逻辑执行错误,也可以了,让这条消息了,把它回滚回来啊,那么这个是啊, raby mq 的这个事务消息,当然呢,这个事务消息的话啊,我们通过就是之前讲的这个 raby mq 里面的另外一道面试题啊,就是这个,呃, 叫做一种什么事物的一个确认机制啊?确认机制就是这个 comform, 那么这个 comform 呢,也是其实也是可以保证这个消息的一个可靠性嘛,对吧? 但是这个坑缝的机制啊,他呢是一一种异步机制,特别是在发送方啊,在发送方呢是一种异步机制嘛,那么发送 把这个消息发出去之后啊,那么呢还可以接着发送消息,只不过是说了这条消息了发送之后呢,如果成功了的话,如果成功投递到这个服务端 啊,这,那么这个服务端呢,会来回掉这个客户端的一个接口吗?然后来告诉你这条消息呢已经发送成功了,当然这种呢可以确保这个消息呢一定会被投递出去, 但是对于我们这种事物场景来说啊,这种就是严格要求,这个是呃数据一致的,对吧?就说比如说我下面这些要是处理失败了,我这条消息呢,我就不能够被啊消费消费端的消费到啊, 那么通过前面这种确认机制其实是做不到的,对不对?因为这个消息发送出去啊,那么你极有可能生产端还没收到这个东西了,消费端呢就已经把这个消息给消费了。而这边呢 如果是在我们这种场景下面,那绝对是啊不允许这种情况发生的啊,啊,特别是还还有的一种场景,就是这个我们这个生产端呢,把这个消息发送出去之后,可能呢这个消费端呢可能还要来调这个生产端去查一些东西,对不对?比如说我们还可以,还可以通过这个接口去进行这个呃交互啊, 不仅通过 mq 交互,可能还有接口进行交互,那我这条消息一发送出去,我后面的事情还没做完呢,如果这个时候消费端就来查这个数据的话,那么极有可能此时查到的数据呢,也是不对的数据。所以说呢,这个事物消息呢,主要是保证啊,这个消息的这个发送,跟我生长端的这个逻辑呢,保持在一个事物里面, 那么这个逻辑回滚的话,那么我这个消息呢也要能够撤回来。那么这个 raby 的 mq, 他这个事物消息是怎么实现的了?实际上他的原理呢,很简单啊,那么我们简单来看一下这个,现在来 看一下他的一个简单的一个用法啊,用法呢很简单,我们在这个信道上面去设置一个就是开启事物啊,那么你当你调完这个 api 之后,实际上呢,我们这个客户端呢,就会去啊, 访问这个服务端啊,通知这个服务端开启一个事物,那么此时呢,我们就可以发消息啊,可以发多条,还可以发多条消息。然后呢发完之后呢,你可以去进行提交事物,但在这中间呢,你还可以做其他的一些操作啊,然后提交事物,或者是回滚事物。好,那么他这个原理呢?其实是什么呢?就是 我们在开启了一个事物之后啊,那么你此时发送的这个消息啊,其实并不是真正的发到了这个 q 里面,我们说这个消息呢,他是会发到这个 q 里面,对不对?这个交换记忆啊?对应的这个 q, 然后呢消费当中从这个 q 里面去订阅消息啊,但是如果你开启事务了的话,他此时呢并不是直接发到了这个 q 里面,而 是发到了一个专门的一个队列啊,应该是叫做 rp, 呃,一个什么什么啊?一个,一个比较长的一个队列名字啊,他会发到这么一个临时队列中,把这个事物消息啊发到这里面去。那么 只有当你真正提交事物了啊,你做了事物提交,那么呢他会就将了这个消息从这个对列中呢移到这个真正的这个 q 里面,那么此时消费端呢才能够消费得到。这其实就是这个 raby 的 mq 实现这个事物消息的这么一种机制啊,就是维护了,相当于维护了一个另外的一个队列啊,好, 那么这个事物消息他如果是跟我们的那个,呃, 之前讲的这个,呃, raby mq 中的另外一种机制,就是这个 conform 机制,就是我们这个啊发送端的这个确认机制,对吧?那么通过这种机制呢,实际上是 这种机制呢,他的效率会更高,因为这种机制呢,他是一步的消息发出去之后,他就不管了,对不对?可以接着再去发消息,然后呢 这个服务端呢会接着再来回掉他,对不对?然后告诉你这条消息成功了,但是呢这个事物的话,他是一定要这个提交,一定要提交完成,那么呢才才这个消息才是真正的进入了这个 q, 同时呢你这个提交呢,也会去连这个服务器啊,也会去连 连服务器,那么中间的这个消息发送啊,包括这个开启师傅啊,都会去连服务器,所以说呢,他这个连接次数呢,会比了 这种坑粪模式会更多啊,这个连接次数会更多,所以说这种事物消息他的这个性能呢,会远不如这种坑粪模式,但是这个坑粪模式呢,当然他也有呃做不到的一些场景,对吧?所以呢我们要去区分一下啊,那么你明白了这两种功能的一个啊,一个实现的话,明白了他的一个逻辑啊,那么什么样的场景该使用哪种机制了? 应该要就可以做出这个选择了,对不对?那么呢但是要明白的是,如果两种都可以选的话,那么肯定优先呢选这个 通风,因为他的性能更高啊,当然这个是在发送端了啊,如果是在消费端的话,那么我们此时啊也可以是消费端的消息呢,提交这个 ack, 我们讲这个消费端呢也有这种消息确认机制吗?对吧?就是消费端呢,我设置这个手动提交,就是将这个奥特 ack 啊设置为 phose, 也就是说我消费端的手动的去提交这个 a c k, 那么你提交完这个 a c k 啊,这个呃 rap m q, 这个服务端呢才会把这条消息删除啊,那么如果你要是不提交这个 a c k 的话,他可能就不会删啊,他会一直等你处理完返回这个 a c k, 那么 这个如果说我们要是把这个返回这个 ack 啊,如果是放到这个事物中去做的话啊,就是说我如果嗨起了一个事物,然后呢去处理这个 ack, 最后呢去提交这个事物,哎,那么此时的话就以了事物提交为准啊。就是说,如果说你既开启了手动提交,也开启了事务,那么最终这个啊, raby mq 服务端的这条消息,他的这个删除,以,他是以你提交的 a a c k 为准呢?还是以事物提交为准呢?其实是以事物提交为准啊,那么只有当你事物真正提交之后,这个 a c k 呢,才算是返回了啊。如果说你此时要是回滚的话,那么呢这条消息呢,还是会回到这个对列中,他并不会把这条消息删除啊, 哪怕你返回了这个 a c k, 那么你最后回管他的话,这条消息呢,也是不会被删除的,他还是会在对列之中啊。好,那么这个是手动提交,那么如果是自动提交的话,如果是自动提交呢?他就不支持事务啊。如果你设置的是这个奥特 a c k 等于处的话,那么呢你开启 事物也是没有用的,那么呢 ack 一返回,事物马上就删除了,那么你后边的事物回滚也就没有,呃,也就回滚不了了啊。好,那么在这个, 在这整个事物的这个逻辑中啊,如果其中的任意一个环节出了问题的话,那么他呢会抛出一个 l 异常,就是我们在这个提交这个事物之前,对吧?他会抛出一个 l 异常啊,那么用户呢,可以去拦截这个异常进行的这个事物的一个回滚,或者是决定了要不要啊进行这个 呃消息重新的发送啊,那么这个需要知道,就是我们什么时候就进行这个事务回管,可以去啊踹开取一个 l 异常啊, 然后呢这个事物消息呢,会降低这个 raby 的 mq 的性能可能会降低好几倍啊,因为呢你每一条消息都意味着好几次连接啊,好,那么这个是 raby 的 mq 中的这个事物消息,那么这个事物消息呢?其实 我们之前的那个呃消息确认机制啊,有那么一点相像,但是呢他就是所能够保证的是这个事物的这个 啊,保证了事物的这个 acid 特性呢,他会做的更加的好。而我们之前讲的那种确认机制呢,实际上是一种可以认为,呃,他是一种补偿 机制啊,但是,呃还不算是真正的补偿机制,他是事后才来通知你的啊,他保证不了你本地的这个啊,逻辑跟这个消息发送的这个原则性,对吧?但是如果是你开启这种事物的话,他就可以保证呢你这整个事物,对吧?这个消息的啊发送跟你这个本地 处理的这个逻辑之间啊,它是一个原子操作,那么这个就是这个 rabbit mq 中的这个事物消息机制。

rapid m q 支持哪些消息模式? rap m q 支持多种消息传递模式,这些模式允许应用程序在不同的场景下进行灵活的消息交流。以下呢,是几种最常见的消息分发机制。第一, work q 工作序列机制, 不是 user 将消息呢,发送到 q, 多个 consumer 同时消费 q 上的消息,消息会均匀地分配给多个 consumer 处理。 第二,订阅发布机制。 producer 只负责将消息发送到 exchange 交换机上, exchange 呢,将消息转发到所有订阅的 q, 并由对应的 consumer 进行消费。 第三,基于内容录有机制。在电源发布机制的基础上呢,增加了一个 routing key, 并根据 routing key 判断一个是陷阱,将消息转发到 哪些特定的 q 上。第四,基于话题路由机制。在基于内容路由的基础上呢,对柔情 key 增加了模糊匹配的功能。另外呢, redmium q 还支持双向同步的 rpc 机制, 不过一般用的呢,是比较少的。这些消息模式呢,允许开发者呢,根据用程序的需求选择合适的消息通信方式,以满足不同的业务场景和可靠性要求。不同的模式可以用于构建各种类型的分布式系统和业务程序。