rabbitmq取消自动重连_掌握Rabbitmq几个重要概念,从一条消息说起

news/2024/11/9 20:30:11

RabbitMQ 是功能强大的开源消息代理。根据官网称:也是使用量最广泛的消息队列。就像他的口号“Messaging that just works”,开箱即用使用简单,支持多种消息传输协议(AMQP、STOMP、MQTT)。

一个应用程序或者服务如何使用RabbitMq呢?

首先会有生产者和消费者两个角色;生产者连接到rabbit代理服务,创建一条AMQP信道,然后把生成的消息,通过信道发布到交换器上,交换器根据路由规则(路由key)进行绑定到或者路由到队列上面。最后消息到达队列上中。消费者跟生产者一样需要先和rabbit代理服务器创建连接,同时创建一个消息管道,并订阅到队列上,进而从队列中获取消息,进行处理。这里面涉及到消息、交换器、绑定、队列几个重要的概念,下面会一一讲解。整个过程如图所示

1b039447eae09c5d57853c3df7c754ed.png

消息

生产者创建消息,这里的消息是指?消息包含两个部分内容:有效载荷(payload)、标签(label)。有效载荷就是你想要传输的数据。而标签是描述了有效载荷,并且RabbitMQ用它来决定谁将获得消息的拷贝。其实通过上图你也会发现,不同于tcp协议,因为AMQP没有明确的接收方,只会用标签表述这条消息,然后把消息交给Rabbit。rabbit会根据标签把消息发送给感兴趣的接收方。

队列

消息最终到达队列中并等待消费。消费者通过AMQP的Basic.Consume命令订阅。这样做会将信道设置为接受模式,直到取消对队列的订阅为止。订阅之后,消费者在消费(或者拒绝)最近的接收的那条消息之后,就能从队列中自动的接收下一条消息。
注意:什么时候消息才会从队列中删除呢?这里涉及到一个消息确认的动作。消费者接收到的每一条消息都必须进行确认。才会从队列中删除。消费者可以通过AMQP的Basic.Ack命令显式地向rabbtmq发送一个确认,或者在订阅到队列的时候就将autoAck属性设置为true;如:autoAck: true,一旦消费者接收消息,rabbitmq会自动视其确认了消息。

fcbb810ae39c04366c0ddfeb12c83010.png

如果消费者接收到消费1,然后在确认之前从rabbit断开连接,rabbitmq会认为这条消息没有分发,然后重新分发下一个订阅的消费者。这样做的好处,即使你的应用程序奔溃了,也可以确保消息会被发送给另一个消费者进行处理,或者等待你的程序恢复正常连接,继续消费。假设消费者A程序与rabbit断开了连接,消息进而会被消费者B进行消费处理。如下图

1281a2bb8e79dc6ba484be2255ceadca.png

只要消费者不进行确认,rabbit将不会给该消费者发送消息,因为在上一条消息被确认之前,rabbit会认为这个消费者并没有准备好接收下一条消息的能力。
在没有办法正常确认消息,不能一直堵塞呀,比如消费者有bug。那就使用AMPQ的Basic.Reject命令;明确的拒绝这条消息,其中一个参数requeue如果设置了ture的话,Rabbit会把消息重新发给下一个订阅的消费者。
如果你检测到一条消息本身有错误而任何一个消费者都无法处理的时候,就可以把requeue设置为false,rabbitmq会把消息从队里中移除,而不会把他发送给新的消费者。

注意:这里你可以使用对拒绝的消息进行特殊处理,比如发送到死信队列或者专门收集的erro队里中。

小结:队列是amqp消息通信的基础模块

1.为消息提供的处所,消息在此等待消费
2.对负载均衡来说,队列是绝佳方案。只需附加一堆消费者,并让rabbitmq以循环的方式均匀地分配发来的消息。
3.队列是rabbit中消息的最后的终点。

交换器、绑定

我们知道消费者如何获取消息,那么现在的问题是,消息是如何到达队列的呢?消息发送到交换器,会根据确定的规则,RabbitMQ将会决定消息该投递到哪个队列。这些规则称为路由键(routing key)。队列通过路由键绑定到交换器。当你发送消息到代理服务器时,消息将拥有一个路由键。如:AMPQ的Basic.Publish方法,有个参数routingKey通过他指定。即便是空的,RabbitMQ也会将其和绑定使用的路由键进行匹配。
交换器有四种类型:direct、fanout、topic和headers;每种类型实现了不同的路由算法,前三个比较常用。

1.direct

这种模式非常简单:路由键匹配的话,消息就被投递到对应的队列。路由算法-使用路由键和队列名称同名进行路由消息。使用场景-直接把消息发送到指定队列时使用。

ab9e08c2adb202f8ae4498541a04e8be.png


默认的direct交换器,不需要进行声明, 队列声明会自动绑定到默认的交换器上,并以队列名称作为路右键。使用以下代码发送消息申明的队列中。

channel.BasicPublish(exchange: "",                               routingKey: "hello",                               basicProperties: null,                               body: body);

2.fanout交换器

这种模式下,可以忽略routing key,唯一需要做的就是为新的消费者写一段代码,然后声明新的队列并将其绑定到fanout交换器上。当你发送一条消息到fanout交换器上,他会把消息投递给所有附加在此交换器的队里上。路由算法-消息会路由到绑定到交换器上的所有队列。使用场景-发布订阅的广播功能

1f08d665b690ba59f90b31dd84e124c5.png

2.topic交换器

这类交换器允许不同源头的消息到达同一个队列。路由算法-根据全部或部分路由键匹配将消息路由绑定的队列上。使用场景-根据某些条件广播到特定的队列上。

ccfc8781cf9a193068888ccb9c39a094.png

小结:

本文主要总结了 AMQP几个主要元素:交换器,绑定,队列。以及一个消息创建到消费者读取消费的过程。


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

相关文章

icmp回复报文_ICMP协议全解析

1、ICMP简介ICMP全名为(INTERNET CONTROL MESSAGE PROTOCOL)网络控制消息协议。ICMP的协议号为1。ICMP报文就像是IP报文的小弟,总顶着IP报文的名头出来混。因为ICMP报文是在IP报文内部的,如图:ICMP属于TCP/IP协议族,工作在网络层(…

maven 打包时缺少文件_jenkins+maven应如何动态打包不同配置文件

概述很多时候我们在用jenkins打包的时候,肯定有很多环境,例如生产环境、测试环境、开发环境等等,那么jenkinsmaven应如何动态打包不同配置文件呢?下面简单介绍下怎么设置和其中的配置是怎么关联起来的。1、pom.xml配置先看下pom.x…

为空 判断_Form表单submit提交时的非空判断

概要使用Form表单提交信息时&#xff0c;可能我们需要对输入的信息进行判断&#xff0c;如果没有输入内容或者全部输入空格则不能进行提交&#xff0c;从而达到简单的信息过滤&#xff0c;这里使用的是JS来进行判断。实例代码&#xff1a;# Form表单 <form class"form-…

tplink连接服务器失败_tplink路由器网络已连接但是上不了网怎么办?

问&#xff1a;本人家里用的tplink路由器&#xff0c;现在问题是电脑和手机都可以连接到tplink路由器网络&#xff0c;但是连接网络后却上不了网。请问大家这是什么原因造成的&#xff0c;我要怎么办&#xff1f;答&#xff1a;能够连接到tplink路由器的网络但上不了网&#xf…

Linux主要的常用命令(玩Linux的人士不得不学哦!)

Linux虽然是免费的&#xff0c;但它的确是一个非常优秀的操作系统&#xff0c;与MS&#xff0d;WINDOWS相比具有可靠、 稳定、速度快等优点,且拥有丰富的根据UNIX版本改进的强大功能。下面&#xff0c;作为Linux爱好者&#xff0c;让我们一起来学习Linux的一些主要命令&#xf…

dubbo service注解用法_被事务代理的spring service 不能使用注解方式发布dubbo服务的问题解决...

问题:使用 com.alibaba.dubbo.config.annotation.Service 发布dubbo服务的时候,当服务类没有加入Transactional的时候没有问题.但是当加入事务后,spring bean 事务代理, dubbo的 AnnotationBean 扫描 类执行下面的代码的时候就获取不到对应的注解,也就发布不了服务:Service ser…

CISCO认证介绍

Cisco认证是互联网界具有极大声望的网络技能认证。其总体认证体系包括路由和交换网络支持&#xff08;售后工程师认证体系&#xff09;&#xff0c;路由和交换网络设计&#xff08;售前工程师认证体系&#xff09;和广域网交换网络设计和支持几大部分。同时&#xff0c;Cisco公…

【一只蒟蒻的刷题历程】 【洛谷】 高精度乘法

洛谷 / 题目列表 / 题目详情 P1303 A*B Problem 题目描述 求两数的积。 输入格式 两行&#xff0c;两个整数。 输出格式 一行一个整数表示乘积。 输入输出样例 输入 #1 1 2 输出 #1 2 说明/提示 每个数字不超过 102000 &#xff0c;需用高精。 思路&#xff1a; …