rabbitmq
消费消息的时候如何保持心跳?
我有几个疑问:
疑问一:
rabbitmq
采用的是push
模式,由mq
主动给consumer
发消息- 但是
rabbitmq
可以使用pull
模式的吗?由consumer
来主动拉取消息! rabbitmq
是两者都支持,还是只支持前者?
疑问二:
rabbitmq
的消费者消费消息的时候,需要有心跳机制的存在。为的是让 mq 知道consumer
正在努力的消费消息,而不是宕机了!那这个心跳是谁发向谁?- 是
mq
主动发消息给consumer
,并且需要consumer
回复mq
- 还是
consumer
主动发消息给mq
,mq
不需要回应? - 还是 rabbitmq 两者都可以支持?
不管是前者还是后者,都是 consumer
专门开一个线程来做心跳事情吗?
不然的话,consumer
忙着干活(假设是一个需要耗时很久很久的任务),根本没有空发出心跳呀!!!
我用的还是 Python
,主要有两个 rabbitmq
的库:pika
和 kombu
,请问这两个库是如何解决这个问题的?
比如从 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 模型
Q:rabbitmq 的消费者消费消息的时候,需要有心跳机制的存在。为的是让 mq 知道 consumer 正在努力的消费消息,而不是宕机了!那这个心跳是谁发向谁?
A:心跳检查:rabbitmq server 发送 heartbeat 给 client,然后 client 回复一个 heartbeat 给 rabbitmq server
Q:都是 consumer 专门开一个线程来做心跳事情吗?
A:取决了 client sdk 具体实现,比如 nameko 实现心跳是通过 eventlet 协程实现后台处理心跳