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()


回答:

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 模型

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

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

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

以上是 rabbitmq 消费消息的时候如何保持心跳? 的全部内容, 来源链接: utcz.com/p/938340.html

回到顶部