gpt4 book ai didi

django - 对于轮询其他 API 的 API,我应该使用任务队列 (Celery)、ayncio 还是两者都不使用?

转载 作者:行者123 更新时间:2023-12-05 00:46:07 26 4
gpt4 key购买 nike

我用 Django 编写了一个 API,目的是作为网站后端和我们使用的外部服务之间的桥梁,这样网站就不必处理对外部 API(CRM、日历事件、电子邮件提供商)的许多请求等等。)。

API主要轮询其他服务,解析结果并转发给网站后端。

我最初选择了一个基于 Celery 的任务队列,因为在我看来它是将处理卸载到另一个实例的正确工具,但我开始认为它并不真正符合目的。

由于网站需要同步响应,我的代码包含很多:
results = my_task.delay().get()
或者
results = chain(fetch_results.s(), parse_results.s()).delay().get()
感觉这不是使用 Celery 任务的正确方法。

当拉取数十个请求并并行处理结果时(例如定期刷新任务),它是有效的,但为代表大部分流量的简单请求(获取 - 解析 - 转发)增加了大量开销。

我应该为那些“简单请求”完全同步并为特定场景保留 Celery 任务吗?是否有更适合我的 API 目的的替代设计(可能涉及 asyncio)?

在 EBS EC2 实例上使用 Django、Celery(带 Amazon SQS)。

最佳答案

您可以考虑使用 Gevent使用您的 Django 网络服务器,使其能够有效地处理您提到的“简单请求”而不会被阻止。如果您继续使用这种方法,请确保使用 PgBouncer 或 Pgpool-II 或 Python 库将数据库连接池化,因为每个 greenlet 都会建立自己的连接。

一旦你实现了它,也可以使用 Gevent 而不是 Celery 来处理异步处理,方法是加入多个 Greenlet,每个 Greenlet 都发出一个外部 API 请求,而不是产生将消息传递给外部 celery worker 的开销。

您的实现与我们在 Kloudless 所做的类似,它提供了一个 API 来访问多个其他 API,包括 CRM、日历、存储等。

关于django - 对于轮询其他 API 的 API,我应该使用任务队列 (Celery)、ayncio 还是两者都不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54924953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com