首页 > 其他分享 >RabbitMQ的消息确认ACK机制

RabbitMQ的消息确认ACK机制

时间:2022-11-08 18:39:05浏览次数:34  
标签:seq ACK 确认 RabbitMQ 发送 队列 消息


ACK机制

由于通信过程的不可靠性,传输的数据不可避免的会出现丢失、延迟、错误、重复等各种状况,TCP协议为解决这些问题设计了一系列机制。这个机制的核心,就是发送方向接收方发送数据后,接收方要向发送方发送ACK(回执)。如果发送方没接收到正确的ACK,就会重新发送数据直到接收到ACK为止。比如:发送方发送的数据序号是seq,那么接收方会发送seq + 1作为ACK,这样发送方就知道接下来要发送序号为seq + 1的数据给接收方了。

RabbitMQ的消息确认ACK机制_消息队列

  • 数据丢失或延迟。发送方发送数据seq时会起一个定时器,如果在指定时间内没有接收到ACK seq + 1,就把数据seq再发一次。
  • 数据乱序。接收方上一个收到的正确数据是seq + 4,它返回seq + 5作为ACK。这时候它收到了seq + 7,因为顺序错了,所以接收方会再次返回seq + 5给发送方。
  • 数据错误。每一个TCP数据都会带着数据的校验和。接收方收到数据seq + 3以后会先对校验和进行验证。如果结果不对,则发送ACK seq + 3,让发送方重新发送数据。
  • 数据重复。接收方直接丢弃重复的数据即可。

什么是消息确认ACK。

  答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失。为了确保数据不会丢失,RabbitMQ支持消息确定-ACK。


ACK的消息确认机制。

  答:ACK机制是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除。

  如果一个消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中。
  如果在集群的情况下,RabbitMQ会立即将这个消息推送给这个在线的其他消费者。这种机制保证了在消费者服务端故障的时候,不丢失任何消息和任务。
  消息永远不会从RabbitMQ中删除,只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。
  消息的ACK确认机制默认是打开的。


ACK机制的开发注意事项。

  答:如果忘记了ACK,那么后果很严重。当Consumer退出时候,Message会一直重新分发。然后RabbitMQ会占用越来越多的内容,由于RabbitMQ会长时间运行,因此这个"内存泄漏"是致命的。


RabbitMQ

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在不同的应用之间共享数据(跨平台跨语言)。RabbitMQ是使用Erlang语言编写,并且基于AMQP协议实现。

RabbitMQ的优势:

  • 可靠性(Reliablity):​使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
  • 灵活的路由(Flexible Routing):​在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
  • 消息集群(Clustering):​多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
  • 高可用(Highly Avaliable Queues):​队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • 多种协议(Multi-protocol):​支持多种消息队列协议,如STOMP、MQTT等。
  • 多种语言客户端(Many Clients):​几乎支持所有常用语言,比如Java、.NET、Ruby等。
  • 管理界面(Management UI):​提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
  • 跟踪机制(Tracing):​如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
  • 插件机制(Plugin System):​提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。


RabbitMQ的整体架构

RabbitMQ的消息确认ACK机制_消息队列_02


RabbitMQ的消息流转

RabbitMQ的消息确认ACK机制_服务器_03

RabbitMQ各组件功能

RabbitMQ的消息确认ACK机制_消息队列_04

  • Broker:​标识消息队列服务器实体.
  • Virtual Host:​虚拟主机。标识一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在链接时指定,RabbitMQ默认的vhost是 /。
  • Exchange:​交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
  • Queue:​消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  • Banding:​绑定,用于消息队列和交换机之间的关联。一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
  • Channel:​信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟链接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。
  • Connection:​网络连接,比如一个TCP连接。
  • Publisher:​消息的生产者,也是一个向交换器发布消息的客户端应用程序。
  • Consumer:​消息的消费者,表示一个从一个消息队列中取得消息的客户端应用程序。
  • Message:​消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(优先级)、delivery-mode(消息可能需要持久性存储[消息的路由模式])等。


关注公众号 soft张三丰 

RabbitMQ的消息确认ACK机制_服务器_05

标签:seq,ACK,确认,RabbitMQ,发送,队列,消息
From: https://blog.51cto.com/u_15501087/5834155

相关文章

  • RabbitMQ3/4---持久化机制、内存磁盘控制
    1.RabbitMQ持久化机制RabbitMQ持久化机制分为队列持久化、消息持久化、交换器持久化。不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。(1)RabbitMQ队列持久化队列......
  • RabbitMQ [java.lang.String] to [java.nio.channels.Channel]解决办法
    记录一下入门RabbitMQ问题问题如下2019-08-2816:51:26.495[SimpleAsyncTaskExecutor-1]WARNo.s.a.r.l.ConditionalRejectingErrorHandler-ExecutionofRabbitmessa......
  • Python程序调试分析大杀器--pystack-debugger
    分析程序异常某个进程100%,分析思路示例代码#-*-coding:utf8-*-importtimedeftest_1():a=1+1time.sleep(100*10)returnaif__name__=="__m......
  • Graphics Stack总结(四) 设置Mesa开发环境
    回顾上篇文章中我们提供了Mesasourcetree的概览,然后简介了几个主要的modules.现在我们将介绍setupmesa开发环境时会用到的几个小tips。DevelopmentenvironmentMesa......
  • Stack Overflow 以18 亿美元已售出!我们还可以继续免费使用它吗?它的未来会怎么?
    英文| https://betterprogramming.pub/what-would-be-stack-overflows-future-after-this-1-8b-acquisition-607f50759699翻译|杨小二StackOverflow已以18亿美元的价......
  • Installing RabbitMQ-3.10.2 on CentOS 7.9
    一、InstallingRabbitMQ-3.10.2onCentOS7.91地址https://www.rabbitmq.comhttps://github.com/rabbitmq/rabbitmq-serverhttps://github.com/rabbitmq/rabb......
  • Webpack最佳实践
    先简单回顾下webpack原理Webpack可以看做是模块打包机,把解析的所有模块变成一个对象,然后通过入口模块去加载我们的东西,然后依次实现递归的依赖关系,通过入口来运行所有......
  • Webpack完整打包流程分析
    前言webpack在前端工程领域起到了中流砥柱的作用,理解它的内部实现机制会对你的工程建设提供很大的帮助(不论是定制功能还是优化打包)。下面我们基于webpack5源码结构,对......
  • Webpack插件核心原理
    引言围绕Webpack打包流程中最核心的机制就是所谓的Plugin机制。所谓插件即是webpack生态中最关键的部分,它为社区用户提供了一种强有力的方式来直接触及webpack......
  • centos确认防火墙
    https://blog.csdn.net/lemon_lrj/article/details/124131221 1、命令行界面输入命令“systemctlstatusfirewalld.service”并按下回车键。2、然后在下方可度以查看......