twisted python 挂在大型多部分消息上

twisted python hangs on large multipart messages

在我的公司,我们使用 twisted 和 flask 在工业计算机上 运行 休息 api 服务。此 API 部分用于 IPC 和来自外部来源的有限通信。我们最近发现了一个问题,即通过 multipart post 发送文件时扭曲挂起。大约 600MB 的文件将扭曲挂起大约 40-50 秒,在此期间不会处理任何请求。

我应该说我不是 Web 开发人员,我是边学边做。我已经分析了这个问题并将其隔离到多部分消息的程序集,flask 也挂在这个问题上但不会阻止消息。 same/similar 问题有几个错误报告:https://twistedmatrix.com/trac/ticket/5511。问题是这些是 8 年前的,我不关心流媒体,或者至少我不这么认为。

只是运气不好?我们可以为这项工作做些什么来扭曲,我想也许是配置问题。或者也许是扭曲的替代品,奇怪的是 flask 附带的 WSGI 没有这个问题,但它不是用于生产,所以它不是一个选项。

除了针对问题实施修复之外,您可能确实不走运。您注意到这个 Twisted 问题的原因是您的 Twisted Web 服务器几乎肯定是完全单线程的(这是默认设置,否则需要一些 non-trivial 的努力)。当单个 Twisted 反应器线程开始解析巨大的上传时,在它完成对巨大上传的解析之前,无法提供任何其他服务。正如您所发现的,解析器非常慢。

您在 WSGI-based 服务器上没有观察到此问题(至少在相同条件下没有),因为这些服务器 运行 正在使用多个线程或进程。当一个客户端上传一个大文件时,其中一个线程或进程可能会被阻塞一段时间,但其他线程或进程可以继续为其他请求提供服务。如果您每个线程或进程有一个客户端,并且这些客户端都上传了一个大文件,您仍然会阻止所有 threads/processes 并且其他客户端将不会得到服务,直到那些 threads/processes 完成该工作。

正如我在顶部所说,这并非无法修复。它可以在 Twisted 中修复,以便表单解析在完全完成之前不会阻塞反应器线程。可能还有其他解决方案。例如,您可以 运行 多个 Twisted Web 进程(可能共享一个监听套接字以使其对客户端透明),以便它至少表现得与您观察到的 WSGI 服务器一样。