首页 > 其他分享 >RabbitMq

RabbitMq

时间:2023-09-14 19:58:05浏览次数:29  
标签:队列 rabbitmq 签收 RabbitMQ RabbitMq true 消息

 

如何保证消息的可靠性

Rabbit 消息传输路径是生产者到路由 到 队列 到消费者消费。

而Rabbit mq丢消息有以下几种情况

1生产者发送消息到RabbitMQ服务器过程中,RabbitMQ服务器如果宕机停止服务,消息会丢失。

RabbitMQ是支持消息持久化的,消息持久化需要设置:Exchange为持久化和Queue持久化,这样当消息发送到RabbitMQ服务器时,消息就会持久化。 消息持久化可以解决服务器突然宕机而产生的重启丢失。

但是生成者发送给路由的时候可能因为网络波动的原因导致没有发送到路由中这种时候我们就可以开启 confirm机制 在生产者发送到rabbitmq Servicer的时候通过两个回调函数

成功发送到exchange中返回confirm

img

成功分配到队列中返回returnedMessage

配置yml

spring:
rabbitmq:
  publisher-confirms: true
#   publisher-returns: true
  template:
    mandatory: true
# publisher-confirms:设置为true时。当消息投递到Exchange后,会回调confirm()方法进行通知生产者
# publisher-returns:设置为true时。当消息匹配到Queue并且失败时,会通过回调returnedMessage()方法返回消息
# spring.rabbitmq.template.mandatory: 设置为true时。指定消息在没有被队列接收时会通过回调returnedMessage()方法退回。

定义回调方法 把返回的消息存储到日志当中使用定时任务做进一步处理

confirm模式。它的作用是为了保障生产者投递消息到RabbitMQ不会出现消息丢失

解决方法是让交换机给生成这返回ack 如果没有正确投递到路由器则返回nack则调用重发服务

4、消费者从RabbitMQ服务器获取队列中存储的数据消费,但是消费者程序出错或者宕机而没有正确消费,导致数据丢失

rabbitmq默认是开启自动签收机制的这样会导致消息到了目标消费者就会被签收这时候如果出现了异常或者服务器囧机消费没有被正确消费便会丢失消息。

这种时候我们可以开启事务ack机制

首先把签收方法设置成手动模式如何在程序完成消费之后调用basicAck手动确认签收

如果出现一场在catch里面拒绝签收消息则会自动返回队列 手动ack的话和自动签收性能是有差距的启用手动ack模式,如果没有及时回复,会造成队列异常

标签:队列,rabbitmq,签收,RabbitMQ,RabbitMq,true,消息
From: https://www.cnblogs.com/zhangseekchu/p/17703287.html

相关文章

  • RabbitMQ、RocketMQ和Kafka的不同之处
    RabbitMQ、RocketMQ和Kafka是三种常见的消息队列系统,它们在设计和使用方面有一些不同之处:架构设计:RabbitMQ:RabbitMQ是一个基于AMQP(高级消息队列协议)的开源消息队列系统,采用的是传统的Broker架构模式,其中包括生产者、消费者和中间件(Broker)。RocketMQ:RocketMQ是一个基于分布式......
  • 消息队列 RabbitMQ
    发布者:生产者,消息的发送方。连接:网络连接。Channel:信道,多路复用连接中的一条独立的双向数据流通道。Exchange:交换器(路由器),负责消息的路由到相应队列。类型:direct、fanout、topicBinding:队列与交换器间的关联绑定。消费者将关注的队列绑定到指定交换器上,以便Exchange能准确分发消息......
  • RabbitMQ - Exception (504) Reason: "channel id space exhausted"
    使用go的第三方包:github.com/rabbitmq/amqp091-go出现报错:getmqchannelerror{"error":"Exception(504)Reason:channelidspaceexhausted"}ctx:=context.Background()results,err:=global.Redis.LRange(ctx,abListName,0,-1).Result()......
  • rabbitmq详细实例
    1.概述RabbitMQ是由LShift提供的一个AdvancedMessageQueuingProtocol(AMQP)的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成,因此也是继承了这些优点。FROM《维基百科——RabbitMQ》Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。起初,Rabbit......
  • 【7.0】基于RabbitMQ实现RPC
    【一】RPC介绍【1】介绍RPC(RemoteProcedureCall)是一种远程过程调用的协议,它允许一个计算机程序通过网络请求调用远程服务器上的一个子程序或函数。基于RabbitMQ实现的RPC可以更加可靠地实现远程过程调用。【2】分布式的系统中使用微服务之间的调用resful的接口rpc调......
  • 【RabbitMQ总结】
    【RabbitMQ总结】【一】消息队列引入什么是消息队列消息队列解决的问题常见的消息队列比较【二】RabbitMQ安装什么是RabbitMQ服务器原生安装RabbitMQ客户端安装RabbitMQWindows安装RabbitMQRabbitMQ设置用户名和密码RabbitMQ界面说明【三】Ra......
  • 【6.0】RabbitMQ使用之发布订阅
    【一】发布订阅【1】发布者importpika#【1】创建连接并设置认证信息credentials=pika.PlainCredentials("admin","admin")connection=pika.BlockingConnection(pika.ConnectionParameters('101.133.225.166',credentials=credentials))#【2】创建通道channel......
  • 【RabbitMQ】服务启动成功,无法访问localhost_15672(RabbitMQ Management)
    问题描述RabbitMQ服务已经启动成功,已经安装rabbitmq_management插件,无法访问RabbitMQManagement(http://localhost:15672/)。原因分析15672端口被MicrosoftEdge占用。解决方案打开cmd终端,输入指令:netstat-ano|findstr15672TCP127.0.0.1:8323127.0.0.1:15672......
  • php 安装rabbit如何使用 PHP 安装 RabbitMQ?
    示例示例安装Erlang要在PHP环境中使用,需要先安装Erlang,它是的运行环境。1、安装Erlang首先,要在PHP环境中使用RabbitMQ,需要先安装Erlang,它是RabbitMQ的运行环境。可以使用下面的命令来安装Erlang:sudoapt-getinstallerlang2、安装RabbitMQ接下来,可以使用下面的命令来安装RabbitMQ:s......
  • RabbitMQ 笔记一
    1.RabbitMQ-如何保证消息不丢失1.生产者确认机制RabbitMQ提供了publisherconfirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功消息失败之后如何处理:1回调方法即时重发2记录日志3保存到数据库然后定时重发,成功发送后即刻删除......