当前位置 博文首页 > wang785994599的博客:redis和rabbitmq实现延时队列

    wang785994599的博客:redis和rabbitmq实现延时队列

    作者:[db:作者] 时间:2021-09-06 18:52

    有时候有些业务是需要在消息过期后执行一些操作,譬如订单创建三十分钟后自动删除。

    redis

    通过redis键过期通知可以实现此功能

    首先启用redis通知功能:
    编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知):
    notify-keyspace-events Ex
    或者登陆redis-cli之后,输入以下命令:
    
    config set notify-keyspace-events Ex

    ?

    python客户端

    import time
    from redis import Redis
    
    redis = Redis()
    pubsub = redis.pubsub()
    pubsub.psubscribe('__keyevent@0__:expired')
    while True:
        message = pubsub.get_message()
        if message:
            print(message)
        else:
            time.sleep(0.01)

    ?rabbitmq实现

    ?通过死信队列实现,

    声明队列时添加参数:x-dead-letter-exchange:'test',那么当消息过期后将会发送到该参数所指定的交换机,routing_key默认为消息自带的routing_key,也实现了过期后做进一步处理的功能。

    需要注意的时,不同过期时间(expiration)的消息不要存储到同一个死信队列,因为队列的FIFO特点,先进来的消息先出去,如果一个有效期很大的在队首,那么后面的数据即使已经过期也无法发送到下一个交换机内,因为被队首元素阻塞了。

    ?

    ?

    cs
    下一篇:没有了