Celery:如何避免将同一任务多次放入队列?

问题描述 投票:0回答:1

我编写了一个非常简单的 FastAPI/Celery/Redis/Flower 程序来开始了解它们的工作原理。如果您想查看,回购协议是 https://github.com/rjalexa/fastapi-redis

FastAPI 路由将在 Redis 缓存中查找字符串,如果找到,则返回哈希/字典和 code=200。

如果没有,它会将该字符串传递给 Celery,这将触发长时间运行的计算(不是在这个虚拟存储库中,而是在现实生活中,它可能需要长达 10 秒)并返回 code=202。处理完成后,结果将添加到 Redis 缓存中。

我想避免的是,当字符串排队等待处理时,如果我收到对同一字符串的请求(处理可能需要很多秒),我只想返回 code=202 而无需排队新任务对于完全相同的字符串。

感谢您的澄清。

redis celery fastapi
1个回答
0
投票

我在这里回答而不是使用评论,因为答案很长。

前提

我从来没有使用过redis,所以对我说的持保留态度。我使用术语

table
因为我来自
SQL
背景,所以它可能不正确。

想法1

这里的基本思想是将数据分为两部分:

cache
preparation/pre-cache
。缓存只是数据的缓存,而
pre-cache
是一种用于存放正在准备的数据值的空间。一旦准备好,它们就会从
pre-cache
移动到实际的
cache
。对缓存的错过命中将触发对
pre-cache
的命中。在这种情况下,您可能会向用户返回一些信息,表明数据尚未准备好。

想法2

这个想法将

Idea 1
的两个表合并为一个表。您收到一个请求,该请求在
cache
中具有有效条目且值非空,请返回该值。如果出现
cache
缺失,则意味着必须计算数据。计算它,但首先在
cache
中创建一个条目。这样,如果对相同数据的第二个请求到达,程序将发现一个空值,识别出计算已经开始但尚未完成。然后,您的程序将按照您针对这种边缘情况所决定的方式运行。

© www.soinside.com 2019 - 2024. All rights reserved.