问题标签 [ranch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
tcp - 使用 Ninenine 牧场实现 Long live tcp 连接
我正在尝试与ninnenine ranch erlang library实现长期 TCP 连接。但是查看文档我看不到这样做的方法。我也编写了自己的牧场协议,如下所示
正如你所看到的,我已经评论了Transport:close(Socket)
并且我没有向客户发送任何回复,因为Transsport:send(socket,Data)
也评论认为这将解决问题,但仍然,我的连接在打开时立即关闭。我有一个如下所示的 golang 客户端
我虽然是在牧场超时造成的。我搜索了,我发现在牧场中,在文件 src/ranch_tcp.erl 中,我们有如下实现的函数监听
如您所见,有一个特别是 Opts5Opts5 = ranch:set_option_default(Opts4, send_timeout_close, true)
和 Opts4的超时选项Opts4 = ranch:set_option_default(Opts3, send_timeout, 30000),
。我禁用了它们,但仍然无法正常工作。那么我应该怎么做才能使用牧场建立长期有效的 tcp 连接。
erlang - 牛仔听众
尝试查找有关侦听器的详细信息,并为应用程序使用多个侦听器。所以我想知道如果我在生产中继续使用大约 15 个具有不同端口的侦听器会发生什么。
似乎现在一切都很好,除了 cpu 延迟(10 核处理器上大约 7\8)
设置是(对于每个侦听器):
你能否用详细的信息告诉我正确的方向,或者没有处理它,我可以尽可能多地使用听众
先感谢您
erlang - 当客户端关闭连接时,Cowboy/Ranch 杀死处理程序进程
我在 HTTP 端点后面有具有复杂业务逻辑的 Phoenix 应用程序。该逻辑包括与数据库和少量外部服务的交互,一旦请求处理开始,在所有操作完成之前不得中断。
但是,如果客户端突然关闭连接,这似乎会导致 Cowboy 或 Ranch 杀死请求处理程序进程(Phoenix 控制器),从而导致部分执行的业务流程。为了调试这个,我在控制器操作中有以下代码:
为了模拟连接关闭,我设置了 timeout: curl --request POST 'http://localhost:4003' --max-time 3
。在 IEx 控制台 3 秒后,我看到该进程即将退出:Message: {:EXIT, #PID<0.4196.0>, :shutdown}
.
所以我需要让控制器完成它的工作并在它仍然存在时回复客户端,或者如果连接丢失则什么都不做。这将是实现这一目标的最佳方法:
- 在控制器操作中捕获退出并忽略退出消息;
- spawn 未
Task
在控制器操作中链接并等待其结果; - 以某种方式配置 Cowboy/Ranch 以便它不会杀死处理程序进程,如果可能的话(尝试
exit_on_close
没有运气)?