6.RabbitMQ--事物

RabbitMQ之消息确认机制

如何防止消息丢失?

如何防止消息是否正确送达?

有些业务场景须要咱们对于消息的幂等性要求是比较高的,须要消息不能丢失,在使用RabbitMQ的时候,咱们能够经过消息持久化操做来解决由于服务器的异常奔溃致使的消息丢失,除此以外咱们还会遇到一个问题,当消息的发布者在将消息发送出去以后,消息到底有没有正确到达broker代理服务器呢?若是不进行特殊配置的话,默认状况下发布操做是不会返回任何信息给生产者的,也就是默认状况下咱们的生产者是不知道消息有没有正确到达broker的,若是在消息到达broker以前已经丢失的话,持久化操做也解决不了这个问题,由于消息根本就没到达代理服务器,你怎么进行持久化,那么这个问题该怎么解决呢?服务器

RabbitMQ为咱们提供了两种方式:性能

  • 经过AMQP事务机制实现,这也是AMQP协议层面提供的解决方案;
  • 经过将channel设置成confirm模式来实现;


事务机制
这里首先探讨下RabbitMQ事务机制。spa

  RabbitMQ中与事务机制有关的方法有三个:代理

  • txSelect();txSelect用于将当前channel设置成transaction模式,
  • txCommit();txCommit用于提交事务,
  • txRollback(); txRollback用于回滚事务, 

在经过txSelect开启事务以后,咱们即可以发布消息给broker代理服务器了,若是txCommit提交成功了,则消息必定到达了broker了,若是在txCommit执行以前broker异常崩溃或者因为其余缘由抛出异常,这个时候咱们即可以捕获异常经过txRollback回滚事务了code

1 channel.txSelect();
2 channel.basicPublish(ConfirmConfig.exchangeName, ConfirmConfig.routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, ConfirmConfig.msg_10B.getBytes());
3 channel.txCommit();

 

  • 事务确实可以解决producer与broker之间消息确认的问题,只有消息成功被broker接受,事务提交才能成功,不然咱们即可以在捕获异常进行事务回滚操做同时进行消息重发;
  • 可是使用事务机制的话会下降RabbitMQ的性能,那么有没有更好的方法既能保障producer知道消息已经正确送到,又能基本上不带来性能上的损失呢?从AMQP协议的层面看是没有更好的方法,可是RabbitMQ提供了一个更好的方案,即将channel信道设置成confirm模式(关于confirm模式,亲参照下一节内容)。
相关文章
相关标签/搜索