RabbitMQ:消息一致性之生产者确认

【原创】 Java低级攻城猿 2019-06-27 15:11:42

RabbitMQ:消息一致性之生产者确认

 

对于消息中间件的使用,确保业务流程正确的进行下去的前提,就是要保证消息的一致性,也就是确保消息不会丢失。引入消息中间件的目的,无非就是异步、解耦和削峰,到达这样的目的,系统之间传递的消息就负有不可推卸的责任,假如消息跑丢了,轻则影响数据的完整性,重则影响整个系统的使用,所以保证消息的一致性是使用消息中间件至关重要的前提。

RabbitMQ:消息一致性之生产者确认

 

保证消息的一致性,大致可从三个方面入手:一是生产者发送消息的正确性,一是消费者消费消息的无误性,还有就是消息中间件broker角色要保证消息的持久性。这篇先来谈一谈生产者方面,就以RabbitMQ为例,看RabbitMQ自身提供了哪些机制,来保证生产者发送消息的正确性。

RabbitMQ:消息一致性之生产者确认

 

RabbitMQ针对生产者发送消息正确性的保障,提供了两种解决方式:

一是通过事务机制实现;

一种是通过生产者确认机制来实现。

一、事务机制实现

RabbitMQ客户端中与事务机制相关的方法有三个: channel.txSelect、channel.txCommit和channel.txRollback。

RabbitMQ:消息一致性之生产者确认

 

channel.txSelect用于将当前的信道设置成事务模式,

channel.txCommit用于提交事务,

channel.txRollback用于事务回滚。

在通过channel.txSelect 方法开启事务之后,我们便可以发布消息给RabbitMQ了, 如果事务提交成功,则消息一定到达了RabbitMQ中,如果在事务提交执行之前由于RabbitMQ异常崩溃或者其他原因抛出异常,这个时候我们便可以将其捕获,进而通过执行channel.txRollback方法来实现事务回滚。示例代码如下:

RabbitMQ:消息一致性之生产者确认

 

二、生产者确认机制实现

对于生产者确认机制,首先要将生产者信道设置成confirm(确认)模式,一旦信道进入confirm模式,所有在该信道上发布的消息都会被指派一个唯一的ID,当消息被成功投递之后,RabbitMQ就会发送一个确认给生产者,这个确认也包括消息的唯一ID,这就使得生产者知道消息已经被正确的投递了。如果设置的队列和消息是持久化的,那么这个确认会在消息写入磁盘之后发出给生产者。信道开启确认模式,客户端可以通过调用channel.confirmSelect()方法,示例代码如下:

RabbitMQ:消息一致性之生产者确认

 

那么这两种实现生产者正确发送消息的机制有什么区别呢?相比于确认机制,事务机制是重量级的,对于发送的每一条消息,都要开启事务来进行,这就大大降低了消息的吞吐量,事务机制在一条消息发送之后会使发送端阻塞,以等待RabbitMQ的回应,之后才能继续发送下一条消息。相比之下 , 生产者确认机制最大的好处在于它是异步的,一旦发布一条消息, 生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,当消息最终得到确认之 后,生产者应用程序便可以通过回调方法来处理该确认消息。还有要注意的是这两种机制是互斥的,不能共存,所以不要把事务机制和确认机制同时使用,否则会给你抛个异常尝尝。

选择两种机制当中的一种,就能保证消息能被正确的发送了吗?RabbitMQ说:“我已经尽力了!”,那么还有哪些情况能导致生产者发送的消息丢失呢?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值