前言
这几年一直在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
的