我对不使用Elixir/Erlang热升级的零宕机部署系统感兴趣(由于代码运行时数据迁移的复杂性)。
我听说在将服务器绑定到适配器时,我可以使用SO_REUSEPORT选项,这样我就可以运行绑定到相同地址和端口的同一应用程序的两个实例。我的意图是将版本2部署在与运行版本1相同的服务器上,启动版本2,然后优雅地停止版本1,这将允许传入连接自然地开始以独占方式连接到版本2。
不管这是否完全按照我的计划工作-我的目的是测试这个配置,知道它在不同的OSes上表现不同-我想知道配置Phoenix这样做所需的具体步骤,因为这似乎是:gen_tcp中的一个较低级别的配置。
或者,如果有一种方法可以将OS或Erlang VM配置为在缺省情况下启用此选项来建立所有连接,那就更好了。
发布于 2019-07-09 20:44:32
您应该以{:raw, protocol, option_num, value_bin} gen_tcp option/raw格式为套接字指定原始SO_REUSEPORT标志,并将其传递给基础传输。
请注意,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 — Phoenix v1.4.9transport_options Plug.Cowboy — PlugCowboy v2.1.0https://stackoverflow.com/questions/41885427
复制相似问题