标签: ranch

当客户端关闭连接时,Cowboy/Ranch 会终止处理程序进程

我有 Phoenix 应用程序,HTTP 端点背后有复杂的业务逻辑。此逻辑包括与数据库和少量外部服务的交互,一旦请求处理开始,就不得中断,直到所有操作完成为止。

但如果客户端突然关闭连接,Cowboy 或 Ranch 似乎会杀死请求处理程序进程(Phoenix 控制器),这会导致部分执行的业务流程。为了调试这个,我在控制器操作中有以下代码:

Process.flag(:trap_exit, true)

receive do
  msg -> Logger.info("Message: #{inspect msg}")
after
  10_000 -> Logger.info("Timeout")
end
Run Code Online (Sandbox Code Playgroud)

为了模拟连接关闭,我设置了 timeout: curl --request POST 'http://localhost:4003' --max-time 3。在 IEx 控制台中 3 秒后,我看到该进程即将退出:Message: {:EXIT, #PID<0.4196.0>, :shutdown}

因此,我需要让控制器完成其工作,并在客户端仍然存在时回复客户端,或者如果连接丢失则不执行任何操作。这将是实现这一目标的最佳方法:

  • 陷阱在控制器操作中退出并忽略退出消息;
  • 生成未链接Task到控制器操作并等待其结果;
  • 如果可能的话,以某种方式配置 Cowboy/Ranch,这样它就不会杀死处理程序进程(尝试过exit_on_close但没有运气)?

erlang elixir cowboy ranch phoenix-framework

5
推荐指数
1
解决办法
418
查看次数

标签 统计

cowboy ×1

elixir ×1

erlang ×1

phoenix-framework ×1

ranch ×1