RabbitMQ可靠消息投递及消费消息确认、拒绝消费、预读消费

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

生产者消息

可靠消息投递

rabbitmq支持在生产者处的confirm模式,用来确保在生产者投递消息时,消息被准确投递至匹配队列

如果未成功,那么将可能抛出如下异常

  • UnroutableError: 无法路由投递
  • NackError: 自身内部错误导致消息丢失
channel.confirm_delivery()

官方给出的示例,可以直接对test,这是一个不存在的队列进行消息投递

channel.confirm_delivery()
try:
    channel.basic_publish(
        exchange='',	
        routing_key='test',
        body='Hello World!',
        mandatory=True
    )
    print('Message was published')
except pika.exceptions.UnroutableError:
    print('Message was returned')

注意: 在最新版sdk中,还需要对basic_publish方法传入mandatory=True可生效确保消息可靠发送

"""
mandatory: 当mandatory参数设置为True时,如果此时交换机无法根据自身的路由键找到一个符合的队列,会调用Basic.Return命令将消息返回给生产者,此时可搭配confirm_delivery进行消息结果的投递确认,confirm_delivery将抛出UnroutableError异常
"""

消费者消息

消息确认

消费者接收到或处理完消息后,可以对消息进行确认

这个值可以在消费者中的接口进行自动ack设置,或者关闭,在消费业务成功后手动进行ack

basic_consume(self, ..., auto_ack=False...)
"""
auto_ack: 是否开启自动确认
"""
def callback(self, ch, method, properties, body):
    print(body.decode())
    print(method.delivery_tag)
    ch.basic_ack(delivery_tag=method.delivery_tag)

注意: 未被ack确认的消息,日后还会回到队列中,要注意避免重复消费

拒绝消息

如果当消费业务出现了异常或消费数据此时不可抗出错,那么可以通过如下两款api进行消息的取消确认

basic_nack(delivery_tag=0, multiple=False, requeue=True)
"""
delivery_tag: 消息交付id
multiple: up to and including 是否拒绝截止到目前delivery_tag之前所有的消息
requeue: 是否重放队列
"""
basic_reject(delivery_tag=0, requeue=True)
"""
delivery_tag: 消息交付id
requeue: 是否重放队列
"""

注意: 单个消费者操作时,无穷进行消息重放拒绝而导致消息业务成为死循环

预读消息

每次消费者的consumer的队列消息读取,并不是一次只取一个任务

在连接通道处,有一定大小基于滑动窗口的消息量大小获取,这个值可以通过如下api进行设置

channel.basic_qos(prefetch_count=10)

注意是基于信道channle的,不是连接connection

RabbitMQ 是一个开源的消息队列,它采用了 AMQP 协议来实现消息的可靠传输。AMQP 协议提供了消息确认机制,保证消息在发送到队列之后得到确认,以避免消息的丢失。 RabbitMQ 实现消息的可靠投递主要有以下几个方面: 1. 消息确认机制:RabbitMQ 支持消息确认机制,当消息被成功接收并处理后,消费者可以给 RabbitMQ 发送一个确认消息,告诉 RabbitMQ 这个消息已经被成功处理了。如果 RabbitMQ 没有收到消费者的确认消息,那么它会将消息重新发送给另一个消费者进行处理。 2. 持久化机制:RabbitMQ 支持将消息持久化到磁盘上,以防止消息RabbitMQ 重启时丢失。如果消息需要被持久化,生产者需要将消息的 delivery mode 设置为 2。 3. 生产者确认机制:RabbitMQ 支持生产者确认机制,当生产者发送消息RabbitMQ 后,可以等待 RabbitMQ 发送确认消息给生产者,告诉生产者消息已经被成功接收并保存。如果 RabbitMQ 无法接收消息,则会返回一个 Nack 消息给生产者,告诉它消息发送失败。 4. 重试机制:RabbitMQ 支持消息的重试机制,如果消息没有被成功处理,RabbitMQ 会将消息重新发送给另一个消费者进行处理,直到消息被成功处理为止。 综上所述,RabbitMQ 提供了多种机制来保证消息的可靠投递,可以根据实际情况选择合适的机制来保证消息的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值