目次
媒介:
生产者重连机制:
生产者确认机制:
Publisher Confirm(生产者者确认)
Publish Return(发布返回)
总结:
媒介:
在现代的分布式系统中,消息队列扮演着至关重要的角色,它不仅为应用程序提供了异步处理的能力,还帮助实现了服务之间的解耦。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.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将被触发,允许生产者对这种环境作出响应,比如进行重试或记录日志。
如果我的内容对你有帮助,请点赞,批评,收藏。创作不易,各人的支持就是我坚持下去的动力!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |