首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在芹菜中设定每条信息的有效期(TTL)?

如何在芹菜中设定每条信息的有效期(TTL)?
EN

Stack Overflow用户
提问于 2014-11-18 09:12:29
回答 1查看 1.2K关注 0票数 7

可以将消息发布到带有过期TTL的RabbitMQ队列中:这样的消息将在TTL完成后过期,并且(如果设置了死信队列,则)移到死信队列中。

但是,是否可以用芹菜来指定这样的每条信息的TTL呢?

注意,我不是在寻找一种指定任务到期的方法,而是寻找消息过期:我希望我的消息在队列中花费(一个可配置的)时间,然后才能最终获得@死信队列。

蒂娅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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属性,那么没有什么比设置本机过期更容易的了:

代码语言:javascript
复制
my_awesome_task.apply_async(args=(11,), expiration=42)

  • 请注意,芹菜自动将42秒转换为42000毫秒(这是正确的)。
  • 过期(在属性中)和过期(在标题中)可以组合在一起,这两个功能不受任何方式的影响。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26990438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档