rabbitmq
文章平均质量分 67
Ken_1115
这个作者很懒,什么都没留下…
展开
-
RabbitMQ系列(29)--RabbitMQ搭建Shovel
Federation具备的数据转发功能类似,Shovel能够可靠、持续地从一个Broker中的队列(作为源端,即source)拉取数据并转发至另一个Broker中的交换器(作为目的端,即destination)。(7)点击Shovel Status菜单查看Shovel的运行状态,若状态显示running,则证明Shovel正在正常运行,若这时候往Q1队列发送消息,消息会自动同步到Q2。分别往Q1和Q2各自发送一条消息,Q1的消息也会通过Shovel发送给Q2,所以Q1收到1条消息,Q2收到2条消息。原创 2023-07-08 23:16:39 · 1211 阅读 · 0 评论 -
RabbitMQ系列(28)--RabbitMQ使用Federation Queue(联邦队列)解决异地访问延迟问题
联邦队列可以在多个Broker节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以连接一个或者多个上游队列(upstream queue),并从这些上游队列中获取消息以满足本地消费者消费消息的需求。(3)给策略加上匹配规则,通过正则表达式匹配队列,若交换机或者队列的名字满足以fed开头后面任意这个条件,则那条队列使用该策略。(5)选择上游策略federation-upstream,点击Federation upstream即可。(2)给策略取一个名字,我这里取queue-policy。原创 2023-07-08 23:15:56 · 556 阅读 · 0 评论 -
RabbitMQ系列(27)--RabbitMQ使用Federation Exchange(联邦交换机)解决异地访问延迟问题
此时又有个在深圳的业务(Client深圳)需要向exchangeA发送消息,那么(Client 深圳)(broker北京)之间有很大的网络延迟,(Client 深圳)发送消息至exchangeA会经历一定的延迟,尤其是在开启了publisherconfirm机制或者事务机制的情况下,(Client深圳)会等待很长的延迟时间来接收(broker北京)的确认信息,进而必然造成这条发送线程的性能降低,甚至造成一定程度上的阻塞。4、在downstream(node2)上配置upstream(node1)原创 2023-07-08 23:13:31 · 1292 阅读 · 0 评论 -
RabbitMQ系列(26)--RabbitMQ实现高可用负载均衡
平时客户端的请求走主机的Haproxy,然后主机的Haproxy转发请求到多台部署了RabbitMQ的服务器上,如果主机的Haproxy宕机了,keepalive会识别到并且把客户端的请求转移到备机上,然后备机再转发请求到多台部署了RabbitMQ的服务器上,这种方案可以通过Haproxy转发多台RabbitMQ来解决负载均衡和高并发问题,并且因为有备机,所以也具备高可用。HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的井发连接数。1、HAProxy的概念。原创 2023-07-08 23:12:07 · 1378 阅读 · 0 评论 -
RabbitMQ系列(25)--RabbitMQ搭建镜像队列
从Queues进入mirror_queue队列查看详情,可以发现当node1节点停掉后node2自动替代了node1节点的位置,node3作为镜像队列的节点,由此可见我们策略里写的ha-params:2这一参数是生效的,使得节点的个数总是保持2个,这样就算我们整个集群只剩下一台机器,在节点不断替代的情况下,消费者始终能消费队列里面的消息。(8)为ha-params指定策略作用的节点的数量为2(包含被镜像的队列,镜像和被镜像的队列数总共为2)(6)执行以下代码,在node2节点里生成消费者,尝试消费消息。原创 2023-07-08 23:11:18 · 2318 阅读 · 0 评论 -
RabbitMQ系列(24)--RabbitMQ集群搭建
3]将当前节点加入到node2节点当中(因为node2已经加入到了node1,node2处在集群中,所以把node3加入node2也能把node3加入到集群中)在node1节点执行以下2条命令,用以把node1节点的cookie复制到node2、node3节点上去,保证3个节点的cookie都一致。使用以下命令编辑每个节点的hosts文件,并给各个节点的ip映射成对应的节点名称,然后保存并退出hosts文件。6、以node1节点为集群,分别将node2和node3节点加入集群。原创 2023-07-08 23:09:02 · 412 阅读 · 0 评论 -
RabbitMQ系列(23)--RabbitMQ惰性队列
默认的为default模式,在3.6.0之前的版本无需做任何变更,lazy模式即为惰性队列的模式,可以通过调用channel.queueDeclare方法的时候在参数中设置,也可以通过Policy的方式设置,如果一个队列同时使用这两种方式设置的话,那么Policy的方式具备更高的优先级。惰性队列会尽可能的将消息存入磁盘中(持久化队列若想持久化消息还需要看消息设置了持久化没),而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。原创 2023-07-08 23:07:50 · 587 阅读 · 0 评论 -
RabbitMQ系列(21)--RabbitMQ幂等性
幂等性是指用户对同一操作发起的一次或多次请求的结果都是一致的,不会因为多次点击而产生副作用。举个例子,例如用户购买商品后会进行支付,支付时扣费成功了,在返回支付成功的结果的时候网络异常了,本来应该显示已付款的,但现在显示了未付款,用户再次支付后第二次扣款成功了,返回支付成功,但这时查看流水记录会发现有两条,用户买同一件商品花费了两份的钱,这是不允许的,无论是交易系统自身的bug还是交易系统的网络问题导致重复发送,必须只能扣用户一次钱,多次发送付款请求,扣费还只是扣一次,这就是幂等性。原创 2023-07-06 23:17:06 · 315 阅读 · 0 评论 -
RabbitMQ系列(20)--RabbitMQ备份交换机
前言:上一篇文章我们提到当交换机确认消息失败或者交换机发送消息到队列失败,都可以通过回调方法让生产者重新发送消息,除此之外另一种方法就是通过备份交换机的方式保证消息的不丢失,当生产者无法把消息投递给交换机,就通过交换机把消息发送到备份交换机,再让备份交换机通过自己的路由以及自己的队列发送消息给消费者,从而把发送失败的消息保存下来。发现不可路由的消息“的日志,而不是走交换机的退回重发打印”被交换机退回“的日志,这证明备份交换机的优先级高于mandatory参数。也编写了和注入了消息回退的代码。原创 2023-07-06 23:16:22 · 1335 阅读 · 1 评论 -
RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理
12、重新启动项目,在浏览器地址栏调用发送消息的接口,可以看到生产者发送消息成功,交换机调用了回调接口并打印出交换机接收消息成功,但消费者没有消费成功的日志输出,因为RoutingKey错了,交换机没有把消息发送到队列里,队列里没消息,自然消费者也就没有消费到消息了,但这个结果不符合我们的预期,因为这次丢失了消息,丢失消息却没有回馈消息丢失,实际上应该调用回调接口反馈消息丢失,所以我们需要继续往下改进代码。4、启动项目,在浏览器地址栏调用发送消息的接口,查看生产者是否运行成功并能发送消息。原创 2023-07-06 23:15:16 · 1501 阅读 · 0 评论 -
RabbitMQ系列(18)--RabbitMQ基于插件实现延迟队列
2、下载rabbitmq_delayer_message_exchange插件(注:RabbitMQ是什么版本的,下载的插件就得是什么版本的,得对应上,以下截图为官方文档的对插件版本的要求说明)但我们下载插件后就能通过交换机延迟消息的方式来实现消息的延迟了(由步骤8可见,我们验证插件是否安装成功是从Exchange进去的,而不是从Queues进去的)结论:基于测试发现在使用延迟插件的情况下,延迟时间短的消息会被先消费,这证明基于插件的延迟消息达到预期效果。10、基于插件延迟队列的代码实现。原创 2023-07-06 23:14:14 · 7259 阅读 · 1 评论 -
RabbitMQ系列(17)--延迟队列的简介与实现
以上场景都有一个特点,那就是都需要在某个事件发生前或发生后执行一项任务,如生成订单后,在十分钟后检查订单状态,未支付的订单将关闭,这种场景也可以用定时任务来处理,但数据量比价少的话确实可以用定时任务来处理,但在活动期间,订单的数据量可能会变得很庞大,对于庞大的数据,定时任务很难在1秒内检查完订单,从而不能及时的关闭未支付的订单,而且用定时任务来检查订单会给数据库带来很大的压力,所以在数据量大的情况下,定时任务无法满足业务需求且性能低下。(1)新建一个名为config的包,用于装实现特定配置的代码。原创 2023-07-06 23:10:23 · 3032 阅读 · 2 评论 -
RabbitMQ系列(16)--用SpringBoot整合RabbitMQ
6、右击项目,然后找到Maven,点击重新加载项目从而从远程仓库下载依赖包(注:网络不好或Maven的setting.xml配置文件没配置好可能会导致依赖下载失败)3、选择合适的SpringBoot版本,依赖在这里可以先不选,可以在项目生成后在pom.xml文件里批量的导入依赖。(2)在搜索框里输入Maven搜索Maven设置,然后根据自己的实际情况设置Maven的路径、配置文件和仓库。5、打开项目的pom.xml文件,导入与RabbitMQ相关的依赖。4、设置项目的Maven。pom.xml的内容如下。原创 2023-07-06 23:11:54 · 1048 阅读 · 0 评论 -
RabbitMQ系列(15)--死信队列的简介与死信队列和死信消费者的实现
(21)查看Consumer01控制台的输出,观察dead_queue队列消息数量的变化,因为没有开启Consumer02消费dead_queue队列,可以看到dead_queue队列堆积了1条消息,查看这条消息,可以看出就是我们拒绝掉的info5,这证明消费者拒绝消费消息info5后,消息info5从normal_queue队列移到了dead_queue队列里,由此可见当消息被拒绝消费后,死信队列成功运行。(18)修改Consumer01的代码,注释掉限制队列长度的代码,修改消息应答的部分代码。原创 2023-07-06 23:08:33 · 2823 阅读 · 2 评论 -
RabbitMQ系列(14)--Topics交换机的简介与实现
Topics交换机的routingkey不能随意写,必须是一个单词列表,并以点号分隔开,例如“one.two.three”,除此外还有两个替换符,*(星号)能代替一个单词,#(井号)可以代替零个或多个单词,例如“*.one.*”是中间是one的3个单词,“*.*.one”是最后一个是one的3个单词,“one.#”是第一个单词是one的多个单词,若队列绑定键是#,这个队列将接收所有数据,这时候类似fanout交换机,若队列绑定键中没有#和*出现,这时候就类似direct交换机。原创 2023-07-06 23:09:36 · 1436 阅读 · 0 评论 -
RabbitMQ系列(13)--Direct交换机的简介与实现
(11)在Direct里输入消息,然后查看Receive01和Receive02接收消息的情况,能看出Receive01没有接收到消息,而Receive02接收到了消息。(7)在Direct里输入消息,然后查看Receive01和Receive02接收消息的情况,能看出Receive01接收到消息,而Receive02没有接收到消息。(9)在Direct里输入消息,然后查看Receive01和Receive02接收消息的情况,能看出Receive01接收到消息,而Receive02没有接收到消息。原创 2023-07-06 23:06:21 · 273 阅读 · 0 评论 -
RabbitMQ系列(12)--Fanout交换机的简介与实现
接收所有的消息广播到它知道的队列中,类似于发布订阅模式,只要Fanout禁用RoutingKey,绑定同一交换机的队列都可同时收到消息;(6)在Emit里输入消息,然后查看Receive01和Receive02接收消息的情况,若两个消费者都分别消费了一样的消息,证明我们成功实现了Fanout交换机。注:RabbitMqUtils工具类的实现在我的另一篇文章里,有需要的同学可以查看参考。(2)新建一个名为Receive01的类用于编写消费者的代码。(1)新建一个名为fanout的包,用于装发布确认的代码。原创 2023-07-06 23:04:47 · 458 阅读 · 0 评论 -
RabbitMQ系列(11)--RabbitMQ交换机(Exchange)简介
以上步骤就是用temp_exchange交换机绑定了temp_queue队列,temp_exchange交换机通过a这个routingkey来绑定了temp_queue队列,当我们发消息到temp_exchange交换机,然后temp_exchange交换机会通过路由规则来把消息发送到指定的队列里,往后我们只需要用不同的routingkey绑定不同的队列,然后我们就能根据指定的routingkey来往指定的队列发消息了。交换机能把一个消息分别发送到多个个队列里,从而实现多个消费者对一个消息进行多次消费。原创 2023-07-05 23:26:25 · 249 阅读 · 0 评论 -
RabbitMQ系列(10)--RabbitMQ发布确认模式的概念及实现
已确认的消息没必要处理,而未确认的消息需要进行重新入队的处理,但由上述步骤(2)的效果图可看出程序在执行完后监听器还在监听消息是否确认成功,而要怎么做才能在程序执行完后再处理监听器监听出来未确认的消息呢?异步确认发布实现逻辑比上面两种要复杂,但性价比高,无论是可靠性还是效率都非常突出,异步确认发布通过回调函数来达到消息可靠性传递,消息的结构类似于map,都是key-value的结构,当相应的消息被消费了或消费失败了,都可以通过对应的key值来确认消费或消费失败的是哪一条消息,所以可靠性很高。原创 2023-07-05 23:26:48 · 1313 阅读 · 1 评论 -
RabbitMQ系列(9)--RabbitMQ预取值及利用预取值实现不公平分发
如果设置预取值为1,则表示每个消费者允许未确认的消息最大值为1条,在消费者未完全处理完这1条消息并应答时,由于设置的预取值为1,队列不会再分配新的消息给它处理,那处理快的消费者很快就处理完消息,然后队列根据预取值为1,立马就给快的消费者分配新的1条消息,然后快的消费者可以继续处理下一条,慢的消费者还得继续处理原来未完成的消息,利用这个思路就能实现不公平分发,实现不公平分发需要在消费者端设置basicQos方法的参数为1,即channel.basicQos(1);(不设置时默认为0,即是轮询分发),原创 2023-07-05 23:23:01 · 316 阅读 · 0 评论 -
RabbitMQ系列(8)--实现RabbitMQ队列持久化及消息持久化
只需要往basicPublish方法的第三个参数传MessageProperties.PERSISTENT_TEXT_PLAIN,即可对消息进行持久化这个参数能告诉RabbitMQ将消息保存到磁盘里进行持久化处理,但值得注意的是将消息标记为持久化不能完全保证消息不会丢失,因为存在消息刚准备存储到磁盘里,但未完全存储完的时间间隔,这时候如果宕机了就不能保证消息真正的写入磁盘重从而实现持久化,但对于简单任务队列而言,这种持久化策略已经够用了。当前队列是未持久化的,需要删除队列然后改成持久化才能重新生效。原创 2023-07-05 23:21:27 · 1916 阅读 · 0 评论 -
RabbitMQ系列(7)--RabbitMQ消息应答及消息未应答后重新入队
RabbitMQ一旦向消费者传递一条消息,该消息就会被标记为删除,这种情况下消费者挂掉了正在处理的消息就会丢失,为了保证消息在发送的过程中不会丢失,RabbitMQ引入了应答机制,(1)true表示批量应答channel上未应答的消息,比如channel上有传送tag为5,6,7,8的消息,当前tag是8,那么此时5-8还未应答的消息就会被确认收到消息应答,但如果处理6或7消息失败了,5也会被应答,导致5消息丢失,所以一般情况下multiple为false。原创 2023-07-05 23:19:40 · 2157 阅读 · 1 评论 -
RabbitMQ系列(22)--RabbitMQ优先级队列
在购物系统中有一个订单催付的场景,如果客户在购物系统下单后在设定的时间内未付款那么就会给客户推送一条短信提醒,这是一个比较简单的功能,但是,商家对我们来说,肯定是要区分大客户和小客户的,比如像苹果、华为、小米这样的大商家一年能给我们创造很大的利润,在业务高峰时期,订单堆积,来不及处理,而为了创造最大的利润,他们的订单必须得到优先处理,而曾经的后端系统是使用redis来存放短信提醒的,并通过定时轮询实现短信发送,但大家都知道redis只能用List做一个简简单单的消息队列,并不能实现一个优先级的场景,所以后来原创 2023-07-08 23:09:43 · 581 阅读 · 0 评论 -
RabbitMQ系列(4)--使用Java实现RabbitMQ的生产者发送消息
其中Ready是指准备被消费的消息,这里有1条消息准备被消费,Total是指消息总条数。运行代码后如果有输出”消息发送成功”的信息,则证明生产者发送消息成功。前言:先简单了解RabbitMQ的工作过程,方便后续开发理清思路。4、在web页面上查看生成的队列。2、编写生产者发送消息的代码。3、查看代码运行结果。原创 2023-04-08 16:10:33 · 954 阅读 · 0 评论 -
RabbitMQ系列(3)--创建RabbitMQ的Java项目
(3)选择适当版本的RabbitMQ依赖(我这里相对新的,然后较多人使用的依赖,有时候不是越新越好,新版的有时候可能没有旧版的稳定)9、查看是否下载依赖成功,若依赖项里有依赖,则证明依赖包下载成功。(2)搜索Maven,然后分别根据自己的情况配置Maven。(3)复制Maven依赖到pom.xml文件里。5、为项目设置Maven依赖和Maven仓库。(2)把项目的JDK版本设置为JDK1.8。(3)把模块的JDK版本设置为JDK1.8。(2)选择适当版本的IO依赖。(2)选择Maven模块。原创 2023-04-08 16:06:47 · 552 阅读 · 0 评论 -
RabbitMQ系列(2)--Linux安装RabbitMQ
(1)找到适合自己Linux系统和对应的Erlang安装包,需要先进入RabbitMQ的官网,确定RabbitMQ与Erlang版本之间的依赖关系,得知RabbitMQ3.10.0版本支持的Erlang版本为23.2~24.3。可以使用uname -a命令查看自己Linux的内核版本,我这里使用的是Centos7,内核是Linux7(Centos8停止维护了,所以本次下载使用Centos7),所以下载的RabbitMQ的版本是支持Centos7的。(1)停止RabbitMQ的服务。原创 2023-04-08 16:14:15 · 594 阅读 · 0 评论 -
RabbitMQ系列(1)--RabbitMQ简介
Channel是在connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。:出于多租户和安全因素设计的,把 AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。交换机是RabbitMQ中一个非常重要的部件,接收来着生产者的消息并把消息推送到队列中。3、RabbitMQ模式。原创 2023-03-11 16:54:36 · 522 阅读 · 0 评论 -
RabbitMQ系列(6)--RabbitMQ模式之工作队列(Work queues)的简介及实现
2、在写实现工作队列前先新建一个名为utils用于放工具类的包,然后在包里新建一个RabbitMqUtils工具类,抽取重复性的代码放入其中,这样就不用每次都写重复的代码了。当有多个工作线程(消费者)时,这些工作线程(消费者)将一起处理这些任务。值得注意的是一个消息只能被处理一次,不可以处理多次,三个工作线程之间是竞争关系。由图可看出两个工作线程(消费者)轮询的消费掉生产者发送的信息,由此可以证明工作队列运行成功!3、新建一个名为workqueues的包,用于装工作队列的代码。原创 2023-04-08 16:12:31 · 674 阅读 · 0 评论 -
RabbitMQ系列(5)--使用Java实现RabbitMQ的消费者接收消息
运行代码后如果有输出生产者发送的”Hello World”信息,则证明消费者消费消息成功。前言:先简单了解RabbitMQ的工作过程,方便后续开发理清思路。可以看到队列里的消息条数为0条,这也证明了消费者消费消息成功了。4、在web页面上查看队列的消息。2、编写消费者消费消息的代码。3、查看代码运行结果。原创 2023-04-08 16:11:24 · 1742 阅读 · 0 评论 -
MQ的简介
MQ的简介原创 2023-02-26 17:15:21 · 541 阅读 · 0 评论