可以将消息发布到带有过期TTL的RabbitMQ队列中:这样的消息将在TTL完成后过期,并且(如果设置了死信队列,则)移到死信队列中。
但是,是否可以用芹菜来指定这样的每条信息的TTL呢?
注意,我不是在寻找一种指定任务到期的方法,而是寻找消息过期:我希望我的消息在队列中花费(一个可配置的)时间,然后才能最终获得@死信队列。
蒂娅。
发布于 2022-01-25 12:44:33
简介:到期与到期
RabbitMQ确实支持每条消息的TTL (以及队列的TTL ),行为记录在这里:https://www.rabbitmq.com/ttl.html#per-message-ttl-in-publishers。诀窍是在消息发布时(以毫秒为单位)设置expiration Message属性(https://www.rabbitmq.com/publishers.html#message-properties)。
另一方面,芹菜允许您在秒内或作为日期时间设置expires参数(https://docs.celeryproject.org/en/stable/reference/celery.app.task.html)。与本机RabbitMQ功能的不同之处在于,消息过期后仍保留在队列中。将过期消息传递给工作人员,然后员工读取过期标头,以确定消息已过期并拒绝该消息。
tl;dr:expiration != expires
如何在芹菜中传递信息属性
这种方法在芹菜中没有记载。我是通过反复试验才发现的,因为我自己想要一个本地的TTL。
例如,send_task方法(celery.app.base.Celery.send_task)由apply_async调用,它接受**options参数。芹菜所不知道的所有**options然后在celery.app.amqp.Queues->send_task_message( ... )方法中作为**kwargs传递,然后作为消息属性传递。
因此,如果我们可以设置message属性,那么没有什么比设置本机过期更容易的了:
my_awesome_task.apply_async(args=(11,), expiration=42)

https://stackoverflow.com/questions/26990438
复制相似问题