在使用 RabbitMQ 的时候,可以通过消息持久化操作来解决因为服务器的异常崩溃而导致的消息丢失,除此之外,我们还会遇到一个问题,当消息的生产者将消息发送出去之后,消息到底有没有正确地到达服务器呢?如果不进行特殊配置,默认情况下发送消息的操作是不会返回任何信息给生产者的,也就是默认情况下生产者是不知道消息有没有正确地到达服务器。如果在消息到达服务器之前已经丢失,持久化操作也解决不了这个问题,因为消息根本没有到达服务器,何谈持久化?
RabbitMQ针对这个问题,提供了两种解决方式∶
1.通过事务机制实现;
2.通过发送方确认机制实现。
事务机制
事务相关的方法:channel.txSelect channel.txCommit channel.txRollback
channel.txSelect 是将信道设置成事务模式,
channel.txCommit 用来提交事务
channel.txRollback 用来回滚事务
事务正常提交
channel.txSelect();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, false, MessageProperties.PERSISTENT_TEXT_PLAIN,"message".getBytes());
channel.txCommit();
image.png
事务回滚
try {
channel.txSelect();
channel.basicPublish(exchange,routingKey,MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes());
int result = 1 / 0;
channel.txCommit();
} catch (Exception e) {
e.printStackTrace();
channel.txRollback();
}
image.png
使用事务机制会大幅降低RabbitMQ的性能,通过上图可以看到使用事务会比不用事务多一些发送请求和恢复OK的操作。
网友评论