rabbitmq 消费消息的时候如何保持心跳?

rabbitmq 消费消息的时候如何保持心跳?

我有几个疑问:

疑问一:

  • rabbitmq 采用的是 push 模式,由 mq 主动给 consumer 发消息
  • 但是 rabbitmq 可以使用 pull 模式的吗?由 consumer 来主动拉取消息!
  • rabbitmq 是两者都支持,还是只支持前者?

疑问二:

  • rabbitmq 的消费者消费消息的时候,需要有心跳机制的存在。为的是让 mq 知道 consumer 正在努力的消费消息,而不是宕机了!那这个心跳是谁发向谁?
  • mq 主动发消息给 consumer,并且需要 consumer 回复 mq
  • 还是 consumer 主动发消息给 mqmq 不需要回应?
  • 还是 rabbitmq 两者都可以支持?

不管是前者还是后者,都是 consumer 专门开一个线程来做心跳事情吗?

不然的话,consumer 忙着干活(假设是一个需要耗时很久很久的任务),根本没有空发出心跳呀!!!

我用的还是 Python,主要有两个 rabbitmq 的库:pikakombu,请问这两个库是如何解决这个问题的?

比如从 pika 的教程中,根本看不到关于心跳的操作:

import pika


def on_message(channel, method_frame, header_frame, body):
    print(method_frame.delivery_tag)
    print(body)
    print()
    channel.basic_ack(delivery_tag=method_frame.delivery_tag)


connection = pika.BlockingConnection()
channel = connection.channel()
channel.basic_consume('test', on_message)
try:
    channel.start_consuming()
except KeyboardInterrupt:
    channel.stop_consuming()
connection.close()
阅读 2.2k
1 个回答

Q:rabbitmq 可以使用 pull 模式的吗?由 consumer 来主动拉取消息!
A:rabbitmq server 支持多协议,比如 5672 端口是 amqp 协议,amqp 协议的消费者用的是 push 模型,也就是 rabbitmq server 主动给 client push message。不能实现 pull,也就是使用 amqp 协议的情况下,client 是不能从 rabbitmq sever pull message 的。

Q:rabbitmq 是两者都支持,还是只支持前者?
A:rabbitmq server 还有一个 http 端口,15672,用 http 接口,可以实现 pull 模型

图片.png

Q:rabbitmq 的消费者消费消息的时候,需要有心跳机制的存在。为的是让 mq 知道 consumer 正在努力的消费消息,而不是宕机了!那这个心跳是谁发向谁?
A:心跳检查:rabbitmq server 发送 heartbeat 给 client,然后 client 回复一个 heartbeat 给 rabbitmq server

Q:都是 consumer 专门开一个线程来做心跳事情吗?
A:取决了 client sdk 具体实现,比如 nameko 实现心跳是通过 eventlet 协程实现后台处理心跳

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏