在Django中处理阻塞的外部API调用

zpqajqem  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(127)

我是Django项目的一部分,我们使用requests和zeep库对外部服务进行了许多API调用。这些调用是顺序完成的,我们的API严重依赖于它们的即时响应。
但是,当我们的服务器遇到高流量时,它会停止响应。似乎我们所有的工作人员都被占用了,等待这些外部网络调用完成,没有工作人员可以处理新的传入请求。
该项目规模很大,将整个项目转换为异步目前还不可行。此外,由于我们需要从这些API调用中立即响应,因此使用Celery这样的任务队列系统不是一个解决方案。
随着我们预计未来会有更多的流量,我正在寻找一种解决方案,它可以有效地处理这些阻塞的网络调用,而不会阻塞我们的服务器或需要完全重写为异步。
我使用2*CPU+ 1公式增加了gunicorn工人的数量,但这在将来可能不够。

bogh5gae

bogh5gae1#

我有两个建议,但都不能完全消除同步I/O的阻塞特性。如果您的流量继续增加,您可能最终需要考虑重构您的应用程序以使用异步I/O,最好是与Celery结合使用。
1.使用eventledgevent:这些库使用轻量级伪并发线程来更有效地处理I/O绑定的任务,例如网络请求。它们与同步代码兼容,因此不需要重写整个应用程序。如果您使用Python requests库执行请求,我建议您更改为如下内容:ThreadPoolExecutor Example或grequests
1.缓存:尽可能多地缓存。如果您收到大量相同数据的请求,这一点尤其有用,因为它可以防止系统阻塞已知的结果。
虽然这些解决方案可以在一定程度上缓解问题,但要注意,随着应用程序的增长,它们可能需要更多的CPU资源。我强烈建议尝试将一些关键组件转换为异步。

相关问题