使用长外部 API 响应设置 Django WSGI worker
Setting Django WSGI workers with long external API response
我正在 Python/Django 中编写与 Shopify 商店集成的电子商务插件应用程序。每当商店的顾客结账时,Shopify 都会向我的应用程序发送带有购物车和目的地地址数据的请求,并且我的应用程序需要以运费信息作为响应。问题是我需要在他们之间进行外部 API 调用,向我发送请求并向他们发送响应,在中等负载下,我的 WSGI worker 很容易被填满。
我试图避免不必要的横向扩展。我是否应该简单地将我的工人数量增加到超过建议的 cores * 2 + 1
?我是否只是监视 CPU 负载以调整此数字?我应该寻找的理想 CPU 负载百分比是多少?由于我也在处理来自同一个应用程序的短的非阻塞请求,这会导致任何问题吗?
Django 不适合这种用例吗?如果是这样,什么是好的匹配,以及在不重写我的整个应用程序的情况下应用它的最佳方式是什么?
编辑:我的 WSGI 服务器是 Gunicorn
这里有几件事可以提高 gunicorn 的性能。鉴于您的设计,几乎可以肯定您的工作人员受 IO 限制。因此,一开始您可以将它们配置为每个工作人员使用多个线程;文档建议 2-4.
但是,同样由于您网站的 IO 限制性质,您似乎可以通过使用其中一种异步工作者类型获得更好的改进。详情见the design docs:我认为gevent和eventlet之间没有太多选择,我个人认为前者的效果很好。
我正在 Python/Django 中编写与 Shopify 商店集成的电子商务插件应用程序。每当商店的顾客结账时,Shopify 都会向我的应用程序发送带有购物车和目的地地址数据的请求,并且我的应用程序需要以运费信息作为响应。问题是我需要在他们之间进行外部 API 调用,向我发送请求并向他们发送响应,在中等负载下,我的 WSGI worker 很容易被填满。
我试图避免不必要的横向扩展。我是否应该简单地将我的工人数量增加到超过建议的 cores * 2 + 1
?我是否只是监视 CPU 负载以调整此数字?我应该寻找的理想 CPU 负载百分比是多少?由于我也在处理来自同一个应用程序的短的非阻塞请求,这会导致任何问题吗?
Django 不适合这种用例吗?如果是这样,什么是好的匹配,以及在不重写我的整个应用程序的情况下应用它的最佳方式是什么?
编辑:我的 WSGI 服务器是 Gunicorn
这里有几件事可以提高 gunicorn 的性能。鉴于您的设计,几乎可以肯定您的工作人员受 IO 限制。因此,一开始您可以将它们配置为每个工作人员使用多个线程;文档建议 2-4.
但是,同样由于您网站的 IO 限制性质,您似乎可以通过使用其中一种异步工作者类型获得更好的改进。详情见the design docs:我认为gevent和eventlet之间没有太多选择,我个人认为前者的效果很好。