我使用HAProxy每10秒发送一次健康检查.
它按以下方式进行:
HAProxy -> server: [SYN]
server-> HAProxy : [SYN, ACK]
HAProxy->server : [RST, ACK]
Run Code Online (Sandbox Code Playgroud)
我的TCP服务器是用以下方式用java编写的:
while (true){
Socket socket = kaServerSocket.accept();
MyListener listener = new MyListener(socket);
listener.start(); //costly operation
}
Run Code Online (Sandbox Code Playgroud)
在Windows 7上,accept()在此交换后不返回(它在常规syn-> ack-> syn握手后返回),这就是我需要的.
但是,当应用程序在Windows Server 2012上运行时,accept()函数[SYN]将从HAProxy发送的第一个函数返回,并执行代价高昂的操作.
所以我有两个问题:
这种行为是可配置的吗?
如果我不想在运行监听器之前等待第一位或消息,我怎样才能在Windows 2012上检测到来自HAProxy的连接?
编辑:
它可以连接到Windows上的ATM TCP/IP吗?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
使用accept函数时,实现在连接建立遍历发送方和接收方之间的整个距离之前,函数可能会返回.这是因为accept函数在收到CONNECT ACK消息后立即返回; 在ATM中,一旦处理CONNECT消息,就由路径中的下一个交换机返回CONNECT ACK消息(而不是由最终建立连接的端节点发送CONNECT ACK).因此,应用程序应该意识到,如果在收到CONNECT ACK消息之后立即发送数据,则数据丢失是可能的,因为可能没有在发送方和接收方之间始终建立连接.
来自http://soft.vub.ac.be/~tvcutsem/distsys/sockets.pdf 这似乎是预期的行为,因为 HAproxy 正在向客户端打开套接字,以便将其路由到另一台计算机。
问题是 HAproxy 符合 TCP :)
解决方法应该是在验证来自服务器的某些逻辑后开始执行逻辑(例如,发送了一条小消息并通过套接字收到了 ACK)。
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |