我已经使用Django编写了一个API,其目的是充当网站后端与我们使用的外部服务之间的桥梁,因此该网站不必处理对外部API的许多请求(CRM,日历事件,电子邮件提供商等。
API主要轮询其他服务,解析结果并将其转发到网站后端。
最初,我去了一个基于Celery的任务队列,因为在我看来,它是将处理任务转移到另一个实例的正确工具,但我开始认为它确实不符合目的。
由于网站希望同步响应,所以我的代码包含很多:
results = my_task.delay().get()
或
results = chain(fetch_results.s(), parse_results.s()).delay().get()
使用Celery任务感觉不正确。
当拉取数十个请求并并行处理结果时(例如定期执行 refresh 任务),效率很高,但是对于简单请求(获取-解析-转发)会增加很多开销,代表大部分流量。
对于那些“简单请求”,我应该完全同步,并在特定情况下保留Celery任务吗?是否有其他设计(可能涉及asyncio)更适合我的API的目的?
在EBS EC2实例上使用Django,Celery(带有Amazon SQS)。
答案 0 :(得分:5)