【问题标题】:Keep alive connection between two "request/response" services保持两个“请求/响应”服务之间的连接
【发布时间】:2020-06-10 13:44:38
【问题描述】:

我们有一个在中欧的服务器上运行的 Django 应用程序,一个在美国有服务器的服务提供商,在美国有一个带有简单 Flask 应用程序的代理服务器。 Flask 应用程序接受来自提供者的请求并将它们转发到我们的主 Django 应用程序。我们无法在美国运行 Django 应用。

目前,我们遇到了一个问题,即请求(带有响应)通常比实际花费的时间要长一些 - 它必须在 3 秒以下 - 部分原因是我们的主 Django 应用程序负载过重,所以我们要优化流程。

现在 Flask 和 Django 应用程序之间的通信是一个简单的Requests.post 用于来自提供程序的每个请求,它打开一个新的 TCP 连接。这在美国和欧洲之间可能会有点耗时(因为握手)。

我的想法是在两个应用程序之间创建某种“永久”连接,这样就不需要为每个请求握手,从而节省了我们一点时间。 天真的解决方案是在 Django 端创建一个 HTTP 服务器,并在 Flask 端创建一些服务(具有多个工作人员),这将创建连接,保持它们的活动状态,监听 Flask 代理并通过已经打开的方式转发来自 Flask 代理的请求与 Django 应用的 TCP 连接。

这似乎有点矫枉过正,但也有些东西,必须已经实施。您对如何在不触及 Flask 或 Django 应用程序(仅更改 URL...)的情况下尽可能优雅地解决此问题有任何建议吗? 谢谢你的想法

【问题讨论】:

    标签: django flask tcp connection


    【解决方案1】:

    最后,我们为每个线程创建了一个requests.Session,并将其存储到Flask 应用程序中的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)
    

    我们不得不更改 nginx(位于 django 应用程序前面)中的 keepalive_timeout 设置,以使这些连接长时间保持打开状态。

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      相关资源
      最近更新 更多