保持两个 "request/response" 服务之间的连接
Keep alive connection between two "request/response" services
我们在中欧的服务器上有一个 Django 应用程序 运行ning,这是一家在美国有服务器的服务提供商,在美国有一个简单的 Flask 应用程序的代理服务器。 Flask 应用程序接受来自提供商的请求并将它们转发到我们的主要 Django 应用程序。我们无法在美国 运行 Django 应用程序。
目前,我们 运行 遇到一个问题,即请求(带响应)通常花费的时间比实际花费的时间长一点 - 它必须在 3 秒内 - 部分原因是负载过重我们的主要 Django 应用程序,因此我们想要优化流程。
现在 Flask 和 Django 应用程序之间的通信很简单 Requests.post
对于来自打开新 TCP 连接的提供程序的每个请求。这在美国和欧洲之间可能会有点耗时(因为握手)。
我的想法是在两个应用程序之间创建某种“永久”连接,这样就不需要为每个请求握手,从而为我们节省了一点时间。
天真的解决方案是在 Django 端创建一个 HTTP 服务器,在 Flask 端创建一些服务(有多个工作人员),这将创建连接,保持连接,监听 Flask 代理并通过已经打开的 Flask 代理转发请求到 Django 应用程序的 TCP 连接。
这似乎有点矫枉过正,但也必须已经实施。您对如何尽可能优雅地解决此问题有什么建议,而无需触及 Flask 或 Django 应用程序(仅更改 URL...)?
感谢您的意见
最后,我们为每个线程创建了一个requests.Session
,并存储到Flask app中的一个threading.local
对象中。使用这种方法,每个工作人员都应该保持自己的会话处于活动状态。这是有效的,因为 wgsi 应用程序不会为每个请求创建一个新线程,而是重用其线程池中的现有线程。
thread_data = threading.local()
def get_local_session() -> requests.Session:
"""
Returns session for a current thread. If no session exists yet, a new session is created.
"""
if not hasattr(thread_data, 'session'):
thread_data.session = requests.session()
return thread_data.session
response = get_local_session().post(URL, data=req_body, headers={'Content-Type': req_content_type}, timeout=REQUEST_TIMEOUT)
我们不得不更改 keepalive_timeout
nginx 中的设置(位于 django 应用程序前面)以保持这些连接长时间打开。
我们在中欧的服务器上有一个 Django 应用程序 运行ning,这是一家在美国有服务器的服务提供商,在美国有一个简单的 Flask 应用程序的代理服务器。 Flask 应用程序接受来自提供商的请求并将它们转发到我们的主要 Django 应用程序。我们无法在美国 运行 Django 应用程序。
目前,我们 运行 遇到一个问题,即请求(带响应)通常花费的时间比实际花费的时间长一点 - 它必须在 3 秒内 - 部分原因是负载过重我们的主要 Django 应用程序,因此我们想要优化流程。
现在 Flask 和 Django 应用程序之间的通信很简单 Requests.post
对于来自打开新 TCP 连接的提供程序的每个请求。这在美国和欧洲之间可能会有点耗时(因为握手)。
我的想法是在两个应用程序之间创建某种“永久”连接,这样就不需要为每个请求握手,从而为我们节省了一点时间。 天真的解决方案是在 Django 端创建一个 HTTP 服务器,在 Flask 端创建一些服务(有多个工作人员),这将创建连接,保持连接,监听 Flask 代理并通过已经打开的 Flask 代理转发请求到 Django 应用程序的 TCP 连接。
这似乎有点矫枉过正,但也必须已经实施。您对如何尽可能优雅地解决此问题有什么建议,而无需触及 Flask 或 Django 应用程序(仅更改 URL...)? 感谢您的意见
最后,我们为每个线程创建了一个requests.Session
,并存储到Flask app中的一个threading.local
对象中。使用这种方法,每个工作人员都应该保持自己的会话处于活动状态。这是有效的,因为 wgsi 应用程序不会为每个请求创建一个新线程,而是重用其线程池中的现有线程。
thread_data = threading.local()
def get_local_session() -> requests.Session:
"""
Returns session for a current thread. If no session exists yet, a new session is created.
"""
if not hasattr(thread_data, 'session'):
thread_data.session = requests.session()
return thread_data.session
response = get_local_session().post(URL, data=req_body, headers={'Content-Type': req_content_type}, timeout=REQUEST_TIMEOUT)
我们不得不更改 keepalive_timeout
nginx 中的设置(位于 django 应用程序前面)以保持这些连接长时间打开。