gpt4 book ai didi

network-programming - 将 SO_REUSEPORT 与 Phoenix 一起使用

转载 作者:行者123 更新时间:2023-12-04 08:51:07 24 4
gpt4 key购买 nike

我对不使用 Elixir/Erlang 热升级的零停机部署系统感兴趣(由于代码运行时数据迁移的复杂性)。

我听说我可以在将服务器绑定(bind)到适配器时使用 SO_REUSEPORT 选项,这样我就可以运行绑定(bind)到相同地址和端口的同一应用程序的两个实例。我的意图是将版本 2 与正在运行的版本 1 部署在同一台服务器上,启动版本 2,然后正常停止版本 1,这应该允许传入连接自然地开始专门连接到版本 2。

不管这是否完全按照我的计划工作——我的目的是测试这个配置,知道它在不同的操作系统上表现不同——我想知道配置 Phoenix 执行此操作所需的具体步骤,因为这似乎是一个较低的- :gen_tcp 内的级别配置.

或者,如果有一种方法可以配置 OS 或 Erlang VM 以在默认启用此选项的情况下建立所有连接,那就更好了。

最佳答案

您应该以 {:raw, protocol, option_num, value_bin} 格式为套接字指定原始 SO_REUSEPORT 标志。
gen_tcp option/raw并将其传递给底层传输。

请注意,mac/linux 的标志是不同的。在您的 config.exs 中:

so_reuseport =
case :os.type() do
{:unix, :linux} -> {:raw, 1, 15, <<1::32-native>>}
{:unix, :darwin} -> {:raw, 0xffff, 0x0200, <<1::32-native>>}
end

config :yourapp, YourApp.Endpoint,
http: [port: {:system, "PORT"}, transport_options: [socket_opts: [so_reuseport]]]

在 Phoenix 1.4.9 上测试过,但我想旧版本也应该没问题。
以下是已使用选项的相应文档。
  • http Phoenix.Endpoint — Phoenixv1.4.9
  • transport_options Plug.Cowboy — PlugCowboyv2.1.0
  • 关于network-programming - 将 SO_REUSEPORT 与 Phoenix 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41885427/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com