python rabbitmq 延迟队列

这篇博客介绍了如何在Python中使用RabbitMQ创建延迟队列,包括声明队列和交换机、添加消息到队列以及理解延迟队列的工作原理,强调延迟队列到期后消息会进入死信收容队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

php示例请移步

官方有关于延迟队列的插件,可以更灵活的设置延迟队列

声明队列和交换机

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author=He
import pika

# 连接amqp
credentials = pika.PlainCredentials(username='mq', password='654321')
connection = pika.BlockingConnection(
        pika.ConnectionParameters(
            host='localhost', port=5672, virtual_host='/',
            credentials=credentials
        )
    )

if connection.is_open is False:
    print('connection fail')

channel = connection.channel()

if channel.is_open is False:
    print('connection channel fail')

# 延迟交换机
delay_exchange = 'delay.test.exchange'
# 延迟队列
delay_queue = 'delay_test_queue'

# 是否延迟队列
is_delay = True

# 延迟交换机死信收容交换机
exchange = 'test.exchange'
# 延迟队列死信收容队列
queue = 'test.queue'
# 延迟队列参数设置
arguments = {}

if is_delay is True:
    # 声明收容交换机
    channel.exchange_declare(exchange=exchange, exchange_type='fanout', durable=True)
    # 声明收容队列
    channel.queue_declare(queue=queue, durable=True)
    # 收容队列和收容交换机绑定
    channel.queue_bind(exchange=exchange, queue=queue)
    # 设置延迟队列参数
    arguments = {
        'x-message-ttl': 1000 * 10,  # 延迟时间 (毫秒)
        'x-dead-letter-exchange': exchange,  # 延迟结束后指向交换机(死信收容交换机)
        'x-dead-letter-routing-key': queue,  # 延迟结束后指向队列(死信收容队列)
    }
# 声明队列
channel.exchange_declare(exchange=delay_exchange, exchange_type='fanout', durable=True)
# 声明交换机
channel.queue_declare(queue=delay_queue, durable=True, arguments=arguments)
# 队列和交换机绑定
channel.queue_bind(exchange=delay_exchange, queue=delay_queue)

执行结果

/usr/bin/python3.5 /home/he/dev/rabbit/test.py

Process finished with exit code 0

延迟交换机


延迟队列


收容交换机


收容队列

加入消息到队列

不另开文档了

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author=He
import pika
import time
import json

# 连接amqp
credentials = pika.PlainCredentials(username='mq', password='654321')
connection = pika.BlockingConnection(
        pika.ConnectionParameters(
            host='localhost', port=5672, virtual_host='/',
            credentials=credentials
        )
    )

if connection.is_open is False:
    print('connection fail')

channel = connection.channel()

if channel.is_open is False:
    print('connection channel fail')

# 延迟交换机
delay_exchange = 'delay.test.exchange'
# 延迟队列
delay_queue = 'delay_test_queue'

# 是否延迟队列
is_delay = True

# # 延迟交换机死信收容交换机
exchange = 'test.exchange'
# 延迟队列死信收容队列
queue = 'test.queue'
# 延迟队列参数设置
# arguments = {}
#
# if is_delay is True:
#     # 声明收容交换机
#     channel.exchange_declare(exchange=exchange, exchange_type='fanout', durable=True)
#     # 声明收容队列
#     channel.queue_declare(queue=queue, durable=True)
#     # 收容队列和收容交换机绑定
#     channel.queue_bind(exchange=exchange, queue=queue)
#     # 设置延迟队列参数
#     arguments = {
#         'x-message-ttl': 1000 * 10,  # 延迟时间 (毫秒)
#         'x-dead-letter-exchange': exchange,  # 延迟结束后指向交换机(死信收容交换机)
#         'x-dead-letter-routing-key': queue,  # 延迟结束后指向队列(死信收容队列)
#     }
# # 声明队列
# channel.exchange_declare(exchange=delay_exchange, exchange_type='fanout', durable=True)
# # 声明交换机
# channel.queue_declare(queue=delay_queue, durable=True, arguments=arguments)
# # 队列和交换机绑定
# channel.queue_bind(exchange=delay_exchange, queue=delay_queue)
# 队列参数
data = {
    'date': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
}
# 加入队列
channel.basic_publish(
    routing_key=delay_queue, body=json.dumps(data),
    properties=pika.BasicProperties(delivery_mode=2),
    exchange=delay_exchange
)

这里写图片描述


这里写图片描述


这里写图片描述


这里写图片描述

消费队列

延迟队列是不需要消费者的,因为延迟队列内的消息到期后就被抛到死信收容队列中了。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# author=He
import pika
import time
import json

# 连接amqp
credentials = pika.PlainCredentials(username='mq', password='654321')
connection = pika.BlockingConnection(
        pika.ConnectionParameters(
            host='localhost', port=5672, virtual_host='/',
            credentials=credentials
        )
    )

if connection.is_open is False:
    print('connection fail')

channel = connection.channel()

if channel.is_open is False:
    print('connection channel fail')

# 延迟交换机
delay_exchange = 'delay.test.exchange'
# 延迟队列
delay_queue = 'delay_test_queue'

# 是否延迟队列
is_delay = True

# # 延迟交换机死信收容交换机
exchange = 'test.exchange'
# 延迟队列死信收容队列
queue = 'test.queue'
# 延迟队列参数设置
# arguments = {}
#
# if is_delay is True:
#     # 声明收容交换机
#     channel.exchange_declare(exchange=exchange, exchange_type='fanout', durable=True)
#     # 声明收容队列
#     channel.queue_declare(queue=queue, durable=True)
#     # 收容队列和收容交换机绑定
#     channel.queue_bind(exchange=exchange, queue=queue)
#     # 设置延迟队列参数
#     arguments = {
#         'x-message-ttl': 1000 * 10,  # 延迟时间 (毫秒)
#         'x-dead-letter-exchange': exchange,  # 延迟结束后指向交换机(死信收容交换机)
#         'x-dead-letter-routing-key': queue,  # 延迟结束后指向队列(死信收容队列)
#     }
# # 声明队列
# channel.exchange_declare(exchange=delay_exchange, exchange_type='fanout', durable=True)
# # 声明交换机
# channel.queue_declare(queue=delay_queue, durable=True, arguments=arguments)
# # 队列和交换机绑定
# channel.queue_bind(exchange=delay_exchange, queue=delay_queue)

# data = {
#     'date': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# }
#
# channel.basic_publish(
#     routing_key=delay_queue, body=json.dumps(data),
#     properties=pika.BasicProperties(delivery_mode=2),
#     exchange=delay_exchange
# )


# 回调函数
def methods(ch, method, properties, body):
    print(body)
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(consumer_callback=methods, queue=queue)
channel.start_consuming()

执行结果

/usr/bin/python3.5 /home/he/dev/rabbit/test.py
b'{"date": "2017-07-28 11:20:21"}'
b'{"date": "2017-07-28 11:22:07"}'
b'{"date": "2017-07-28 11:23:52"}'
b'{"date": "2017-07-28 11:23:53"}'
b'{"date": "2017-07-28 11:23:54"}'
b'{"date": "2017-07-28 11:23:56"}'
b'{"date": "2017-07-28 11:23:57"}'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值