前言:
在现代的分布式系统中,消息队列扮演着至关重要的角色,它不仅为应用程序提供了**异步处理**的能力,还帮助实现了服务之间的**解耦**。RabbitMQ作为业界广泛使用的消息队列之一,以其高可靠性、易用性和灵活性而受到开发者的青睐。然而,即便拥有如此强大的工具,确保生产者在发送消息时的可靠性仍然是一个挑战。
要确保生产者的可靠性,主要有两种方式:
- 生产者重连
- 生产者确认
生产者重连机制:
**生产者重连机制主要是为了保证生产者能够成功连接上MQ **
当生产者尝试向MQ发送消息的时候,结果由于网络出现波动,导致连接MQ失败,在这种情况下,我们可以通过配置开启生产者重连机制:
spring:
rabbitmq:
connection-timeout: 1s #设置超时时间
template:
retry:
enabled: true #开启超时重试机制
initial-interval: 1000ms #失败后的初始等待时间
multiplier: 1 #失败后下次等待时长倍数,下次等待时长= Initial - interval * multiplier
max-attempts: 3 #最大重试次数
解释一下这段配置:
- 客户端将尝试在1秒内连接到RabbitMQ服务器。
- 如果消息发送失败,将启用重试机制。
- 初次重试将在失败后1秒进行。
- 后续每次重试的等待时间都将是1秒(因为
multiplier
为1)。 - 总共将尝试最多3次重发消息。
但需要注意的是:这种重试是阻塞式重试,也就是说:他会把当前线程阻塞。所以如果对业务的性能有要求,建议禁用重试机制。
生产者确认机制:
生产者确认机制主要是为了确保生产者能够成功向MQ发送消息
RabbitMQ一共有两种确认机制,分别是Publisher Confirm 和 Publish Return
Publisher Confirm(生产者确认)
发布者确认机制允许生产者请求一个确认从RabbitMQ服务器返回,以确保消息已经被服务器接收。当生产者启用此机制时,每发送一条消息,它都会等待一个来自服务器的确认。如果消息被成功接收,服务器会发送一个确认响应;如果消息发送失败,服务器会发送一个否定响应。
在Java的RabbitMQ客户端中,可以通过以下方式启用生产者确认:
channel.confirmSelect();
然后,生产者可以设置一个回调,用于处理确认或否定响应:
channel.addConfirmListener(new ConfirmListener() {
@Override
public void handleAck(long deliveryTag, boolean multiple) {
// 消息发送成功
}
@Override
public void handleNack(long deliveryTag, boolean multiple) {
// 消息发送失败
}
});
Publish Return(发布返回)
发布返回机制是指当生产者发送消息到RabbitMQ时,如果消息无法被路由到任何队列(例如,因为没有匹配的路由键或所有相关的队列都被绑定到了一个空交换器),RabbitMQ会将这个消息返回给生产者。
发布返回不是用于确认消息是否已经被服务器接收,而是用于通知生产者消息因为某些原因没有被队列接收。生产者可以设置一个
ReturnListener
来接收这些返回的消息:
channel.addReturnListener(new ReturnListener() {
@Override
public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, BasicProperties properties, byte[] body) {
// 处理返回的消息
}
});
我们可以用一句话来总结:Publisher Confirm 用来确认消息是否发送到MQ,而Publish Return 用来通知生产者哪些消息由于路由失败没有被接收。
总结:
在构建分布式系统时,消息队列扮演着至关重要的角色,尤其是在确保不同服务间可靠通信方面。RabbitMQ作为业界广泛采用的消息队列中间件,提供了一系列的机制来确保生产者的可靠性,从而帮助开发者构建更加健壮和可扩展的系统。
RabbitMQ通过其生产者确认机制(Publisher Confirms)确保消息能够成功发送到服务器。通过设置
mandatory
标志,生产者可以要求RabbitMQ确认每条消息是否已经被交换机正确接收。如果消息无法路由到任何队列,
ReturnCallback
将被触发,允许生产者对这种情况作出响应,比如进行重试或记录日志。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
版权归原作者 我是一盘牛肉 所有, 如有侵权,请联系我们删除。