rabbitmq中定时任务和延迟队列的区 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/18 09:56:39 2023/08/18
【摘要】 在RabbitMQ中,定时任务和延迟队列是两种不同的机制。 定时任务是指在指定的时间触发某个任务的执行。在RabbitMQ中,可以通过使用延迟插件(rabbitmq_delayed_message_exchange)来实现定时任务。使用延迟插件,可以将消息发送到一个特定的交换机,并指定消息的过期时间。当消息过期时,会被发送到绑定到该交换机上的队列中,从而触发任务的执行。 延迟队列是指将消息暂...

在RabbitMQ中,定时任务和延迟队列是两种不同的机制。 定时任务是指在指定的时间触发某个任务的执行。在RabbitMQ中,可以通过使用延迟插件(rabbitmq_delayed_message_exchange)来实现定时任务。使用延迟插件,可以将消息发送到一个特定的交换机,并指定消息的过期时间。当消息过期时,会被发送到绑定到该交换机上的队列中,从而触发任务的执行。 延迟队列是指将消息暂时存储在队列中,然后在一定的时间后才被消费。在RabbitMQ中,可以通过设置消息的过期时间来实现延迟队列。当消息被发送到队列中后,会根据设置的过期时间进行存储。在过期时间到达之前,消息不会被消费者接收到。当过期时间到达时,消息会被发送给消费者进行处理。 总结来说,定时任务是指在指定的时间触发任务的执行,而延迟队列是指将消息暂时存储在队列中,在一定的时间后才被消费。定时任务是通过设置消息的过期时间和交换机来实现的,而延迟队列是通过设置消息的过期时间来实现的。

以下是使用RabbitMQ延迟队列和定时任务的示例代码:

使用延迟队列实现延迟消费

pythonCopy codeimport pika
import datetime
def callback(ch, method, properties, body):
    print("Received message:", body.decode())
def main():
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    # 声明一个延迟交换机
    channel.exchange_declare(exchange='delayed_exchange', exchange_type='x-delayed-message', arguments={'x-delayed-type': 'direct'})
    # 声明一个队列
    channel.queue_declare(queue='delayed_queue')
    # 绑定队列到延迟交换机
    channel.queue_bind(queue='delayed_queue', exchange='delayed_exchange', routing_key='delayed_routing_key')
    # 发送消息到延迟交换机,并设置消息的过期时间为10秒
    channel.basic_publish(exchange='delayed_exchange', routing_key='delayed_routing_key', body='Hello, delayed message!', properties=pika.BasicProperties(expiration='10000'))
    print("Message sent")
    channel.basic_consume(queue='delayed_queue', on_message_callback=callback, auto_ack=True)
    print("Waiting for messages...")
    channel.start_consuming()
if __name__ == '__main__':
    main()

使用定时任务实现任务调度

pythonCopy codeimport pika
import datetime
import time
def callback(ch, method, properties, body):
    print("Received scheduled task:", body.decode())
def main():
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    # 声明一个延迟交换机
    channel.exchange_declare(exchange='scheduled_exchange', exchange_type='direct')
    # 声明一个队列
    channel.queue_declare(queue='scheduled_queue')
    # 绑定队列到延迟交换机
    channel.queue_bind(queue='scheduled_queue', exchange='scheduled_exchange', routing_key='scheduled_routing_key')
    # 设置任务的执行时间为当前时间加上10秒
    scheduled_time = datetime.datetime.now() + datetime.timedelta(seconds=10)
    # 发送消息到延迟交换机,并设置消息的过期时间为任务的执行时间
    channel.basic_publish(exchange='scheduled_exchange', routing_key='scheduled_routing_key', body='Hello, scheduled task!', properties=pika.BasicProperties(expiration=str(int(time.mktime(scheduled_time.timetuple())))))
    print("Task scheduled for:", scheduled_time)
    channel.basic_consume(queue='scheduled_queue', on_message_callback=callback, auto_ack=True)
    print("Waiting for scheduled tasks...")
    channel.start_consuming()
if __name__ == '__main__':
    main()

以上代码示例是使用Python的pika库来操作RabbitMQ。在代码中,我们首先通过声明交换机和队列来设置延迟队列或定时任务的基础结构。然后,通过设置消息的过期时间来实现延迟队列或定时任务的触发。最后,通过消费者来监听队列并处理消息。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。