10.消息生产者和消费者的事务(消息可靠性)

目录

生产者事务:

消费者事务:


       在通过Connection创建Session的时候我们可以通过传参的方式指明这个Session下的消息生产者和消息消费者是否以事务的方式发送和消费消息: 

//第一个参数控制事务:true-以事务的方式发送消息 false-以非事务的方式发送消息 
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

这里说的事务其实和JDBC中的事务是一个概念,都是将事务中的操作作为一个原子的整体,要么一次性全部提交,要么全部回滚。

以事务的方式和以非事务的方式发送和消费消息的不同之处在于:

  1. 以事务的方式发送和消费消息,需要显示的提交(session.commit())和回滚事务(session.callback()),在事务未提交完成之前mq里是不会出现消息的。
  2. 以非事务的方式发送和消费消息则不需要显示提交事务(此时不存在回滚),此时所做的每一步操作都是直接提交生效的(因此不存在回滚)。
  • 举例来说:
  1. 对于生产者而言,若以事务的方式发送消息到MQ服务器,则在未执行事务提交操作之前在MQ服务器中是看不到消息的,要等到执行提交动作时将整个事务中的操作作为一个原子操作一次性提交后才能看到消息,也就是说事务不提交生产的消息不会发送;
  2. 对于消费者而言,若以事务的方式消费消息,则在未提交事务之前相当于消息未消费,只有事务提交了才认为消息被消费了,因此在消费者端若以事务的方式消费消息而未将事务提交时(比如事务提交之前出现了异常)就会存在消息的重复消费问题。

生产者事务:

消费者事务:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ的消息可靠性是指确保消息可以安全、可靠地传递到消费者。为了实现消息可靠性,RabbitMQ提供了以下机制: 1. 持久化队列:通过将队列设置为持久化,即使RabbitMQ服务器重启,队列中的消息也不会丢失。 2. 持久化消息:将消息设置为持久化,使得即使在RabbitMQ服务器重启前,消息也会被存储在磁盘上。 3. 消息确认机制:生产者可以通过消息确认机制来确保消息已经被成功发送到RabbitMQ中。当消息成功地被RabbitMQ接收到后,生产者会收到一个确认信号。如果RabbitMQ在处理消息时发生错误,生产者可以根据确认信号来重新发送消息。 尽管RabbitMQ提供了上述机制,但仍然存在一些情况下消息可能丢失的风险。例如,如果消息在RabbitMQ服务器接收到但尚持久化到磁盘上时,RabbitMQ服务器崩溃,这可能导致部分消息的丢失。 为了进一步提高消息可靠性,可以采取以下措施: 1. 使用事务:使用事务可以确保消息的原子性提交,即要么全部成功发送,要么全部失败回滚。但是,使用事务会降低RabbitMQ的性能。 2. 设置消息确认模式:可以将消息确认模式设置为"confirm",使得RabbitMQ在收到消息后立即发送确认信号给生产者。 3. 设置备份队列:备份队列可以在主队列发生故障时,将消息转发到备份队列,从而避免消息的丢失。 4. 通过持久化到数据库或其他存储系统来保存重要的消息数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值