可靠性投递: 首先需要明确,效率与可靠性是无法兼得的,如果要保证每一个环节都成功,势必会对消息的收发效率造成影响.如果是一些业务实时一致性要求不是特别高的场合,可以牺牲一些可靠性来换取效率. 要保证消息的可靠性投递,首先需要从以下几方面来确保,其次考虑其他的原因: 1.确保消息发送到RabbitMQ服务器(发送). 可能因为网络或者Broker的问题导致①失败,而生产者是无法知道消息是否正确发送到Broker的.有两种解决方案,第一种是Transaction(事务)模式,第二种Confirm(确…
本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc.com/learn/1042 RabbitMQ消息中间件极速入门与实战 项目源码:https://github.com/ZbLeaning/Boot-RabbitMQ 设计一个消息可靠性投递方案,服务结构如下: 组成: Sender+Confirm Listener :组成消息的生产者 MQ Bro…
#手动应答#spring.rabbitmq.listener.simple.acknowledge-mode=manual#spring.rabbitmq.listener.simple.acknowledge-mode=none#不发生异常才应答#spring.rabbitmq.listener.simple.acknowledge-mode=auto @Component @RabbitListener(queues="first",containerFactory="r…
@Bean public RabbitTemplate rabbitTemplate(CachingConnectionFactory factory) { //若使用confirm-callback ,必须要配置publisherConfirms 为true factory.setPublisherReturns(true); //若使用return-callback,必须要配置publisherReturns为true factory.setPublisherReturns(true); R…
前言 RabbitMQ虽然有对队列及消息等的一些持久化设置,但其实光光只是这一个是不能够保障数据的可靠性的,下面我们提出这样的质疑: (1)RabbitMQ生产者是不知道自己发布的消息是否已经正确达到服务器呢,如果中间发生网络异常等情况呢?消息必然会丢失! (2)RabbitMQ如果没有设置队列持久化,RabbitMQ服务器重后队列的元数据会丢失,消息自然也会丢失! (3)RabbitMQ如果消费者设置自动确认,即autoAck为true,那么不管消费者发生什么情况,该消息会自动从队列中移除,实…
说明 前几天,突然发生线上报警,钉钉连发了好几条消息,一看是RabbitMQ相关的消息,心头一紧,难道翻车了? [橙色报警] 应用[xxx]在[08-15 16:36:04]发生[错误日志异常],alertId=[xxx].由[org.springframework.amqp.rabbit.listener.BlockingQueueConsumer:start:620]触发. 应用xxx 可能原因如下 服务名为:  异常为:org.springframework.amqp.rabbit.lis…
RabbitMQ和Kafka都提供持久的消息保证.两者都提供至少一次和至多一次的保证,另外,Kafka在某些限定情况下可以提供精确的一次(exactly-once)保证. 让我们首先理解一下上述术语的含义: 至多一次投递:消息绝对不会被重复投递,但是消息可能丢失 至少一次投递:消息绝对不会被丢失,但是有可能重复被消费 精确的一次投递:消息系统的圣杯.所有的消息精确的被投递一次. “投递”貌似不是准确的语言描述,“处理”才是.无论怎么描述,我们关心的是,消费者能否处理消息,以及处理的次数.但是使用…
之前介绍过关于消息发送和接收的可靠性:RabbitMQ学习之消息可靠性及特性 下面主要介绍一下集群环境下,rabbitmq实例宕机的情况下,消息的可靠性.验证rabbitmq版本[3.4.1]. 集群环境要求: 1.集群中至少有一台硬盘节点 2.加入集群中有一台内存节点,一台硬盘节点,需要先启动硬盘节点.单节点不能设置为内存节点 集群环境: 节点名称 节点类型 vm-129 硬盘 vm-130 内存  验证结论: 1.vm-129.vm-130节点都可以创建持久化队列及发送持久化消息 2.当vm…
说明 上一篇文章里,我们了解了如何保证消息被可靠投递到RabbitMQ的交换机中,但还有一些不完美的地方,试想一下,如果向RabbitMQ服务器发送一条消息,服务器确实也接收到了这条消息,于是给你返回了ACK确认消息,但服务器拿到这条消息一看,找不到路由它的队列,于是就把它丢进了垃圾桶,emmm,我猜应该属于可回收垃圾. 如何让消息可靠投递到队列 如果你对上面的描述还不是很清楚,那我再用代码来说明一次. 在仅开启了生产者确认机制的情况下,交换机接收到消息后,会直接给消息生产者发送确认消息,如果发…
前言 上一篇四种途径提高RabbitMQ传输消息数据的可靠性(一)已经介绍了两种方式提高数据可靠性传输的方法,本篇针对上一篇中提出的问题(1)与问题(2)提出解决常用的方法. 本文其实也就是结合以上四个方面进行讲解的,主要参考<RabbitMQ实战指南>(有需要PDF电子书的可以评论或者私信我),本文截图也来自其中,另外可以对一些RabbitMQ的概念的认识可以参考我的另外两篇博文认识RabbitMQ交换机模型.RabbitMQ是如何运转的? 三.生产者确认机制 针对问题(1),我们可以通过生…