python - rabbitmq 是如何同步消息的?
问题描述
我使用这个简单的代码pika
:
conn = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = conn.channel()
def on_message(ch, method, properties, message):
print("Received message: %r" % message)
channel.basic_ack(delivery_tag=method.delivery_tag)
channel.queue_declare(queue='my_queue', durable=True)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(on_message, queue='my_queue')
channel.start_consuming()
问题:
一旦我收到一条消息,并且我的on_message
回调正在运行,rabbitmq 如何确保在我调用之前不向其他工作人员发送相同的消息basic_ack
?basic_ack
因为在我的测试中,如果我多次运行代码,如果我不调用该消息将再次发送。从发送消息的那一刻起,rabbitmq 是否有一些超时,直到它得到一个ack
?
解决方案
在我调用 basic_ack 之前,rabbitmq 如何确保不向其他工作人员发送相同的消息?
只向一个消费者传递消息是 RabbitMQ 的核心特性。消息将保持未确认状态,直到它被传递到的消费者确认它,或者它被传递到的通道关闭。
在我的测试中,如果我不调用 basic_ack,如果我多次运行代码,消息将再次发送。
当您多次运行代码时,会发生以下情况:
- RabbitMQ 将消息传递给您的消费者,将其移至未确认状态。
- 您在没有调用的情况下停止您的消费者应用程序
basic_ack
,这会在不确认消息的情况下关闭通道和连接。 - RabbitMQ 检测到这一点并将消息重新排入队列。
- 您重新启动您的消费者,它会重新传递消息。
- 起泡,冲洗,重复。
RabbitMQ 文档中涵盖了所有这些以及更多内容。
注意: RabbitMQ 团队会监控rabbitmq-users
邮件列表,有时只会在 StackOverflow 上回答问题。
推荐阅读
- javascript - 如何在鼠标位置跟踪的父元素内移动子元素
- git - 如何更新 Github 克隆存储库?
- ruby-on-rails - 调用切片!使用 map / symbol_to_proc 语法
- react-admin - 在 React-admin 转换方法中,为什么无法获取当前状态?
- filter - 在 Dataweave 2.0 中使用两个或更多列值比较两个 JSON 数组
- python - Pandas groupby 并添加带有随机数据的新行
- sql - SQL GROUP BY 奇怪的行为
- mern - 如何使用 node、express 和 mongoose 制作简单的 RESTful 应用程序
- powershell - 使用 powershell 显示来自日志文件的完整错误消息
- powerbi - Power Query PREVIOUSDAY 周末、节假日