如何配置HAProxy以与服务器发送事件一起使用?

10

我正在尝试向一个已有的应用程序添加一个端点,该端点发送服务器推送事件。通常可能会没有任何事件约5分钟左右。我希望配置该端点,即使响应在约1分钟内未完成,也不会切断我的服务器,但所有其他端点会在服务器未能响应时超时。

是否有一种简单的方法在HAProxy中支持服务器推送事件?

1个回答

11

这是我对HAProxy和SSE的建议:在HAProxy中有许多自定义超时选项,并且有两个有趣的选项适合你。

timeout tunnel指定了用于Websockets、SSE或CONNECT的隧道连接的超时时间。绕过服务器和客户端超时。

timeout client处理客户端失去连接的情况(网络丢失,在结束会话的ACK之前消失等)。

在你的haproxy.cfg文件中,这是你应该做的,首先在你的defaults部分:

# Set the max time to wait for a connection attempt to a server to succeed
timeout connect 30s
# Set the max allowed time to wait for a complete HTTP request
timeout client  50s
# Set the maximum inactivity time on the server side
timeout server  50s

直到这里都没有什么特别的。

现在,还在defaults部分中:

# handle the situation where a client suddenly disappears from the net
timeout client-fin 30s

接下来,转到您的backend定义并添加以下内容:

timeout tunnel 10h

我建议一个高值,10小时似乎可以。

你还应该避免使用默认的http-keep-alive选项,SSE不使用它。 相反,请使用http-server-close


隧道超时可能适用于Web套接字,我不太确定它是否适用于SSE...良好的做法可能是每分钟从服务器发送保持活动事件,并将timeout server设置为两倍的延迟。 - Claude Brisson
我安装了SSE服务器(NodeJS),并将其配置为与HAProxy一起使用。 除了一件事之外,所有工作都很好:当客户端关闭连接(EventSource :: close())时,有关关闭连接的数据包不会通过HAProxy发送到SSE服务器(request.on('close',()=> {...})。有什么想法吗?尝试了http-server-close,选项httpclose,选项http-keep-alive和超时的不同组合,haproxy v2.5、2.7。如果直接使用(无需haproxy),则关闭连接将被发送到SSE服务器。 - dixonpfu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接