CometD 故障转移能力 - VM Switch During restart

CometD Failover Ability - VM Switch During Restart

我有一个使用 CometD 的聊天实现。

在前端,我有一个 clientId=123 并且正在与 VirtualMachine-1 通信的客户端

VirtualMachine-1 和Client 之间的长轮询连接是通过clientId 完成的。在握手期间建立连接时,VirtualMachine-1 将 123 clientId 注册为自己的并接受其数据。

由于某种原因,如果 VM-1 重新启动或失败。 Client 和 VM-1 之间的长轮询连接断开(因为 VirtualMachine-1 死了,心跳会失败,因此它会断开连接)。

在这种情况下,CometD loadBalancer 会将客户端通信重新路由到新的 VirtualMachine-2。但是,由于 VirtualMachine-2 具有不同的 clientId,因此无法理解来自客户端的“123”。

我的问题是 - 在这种情况下 cometD 的行为是什么?它如何将流量从 VM-1 重新路由到新的 VM-2 以成功完成握手过程?

当负载均衡器将 CometD 客户端重定向到第二个服务器时,第二个服务器不知道此客户端。

客户端将发送带有 clientId=123/meta/connect 消息,第二个服务器将回复 402::unknown_sessionadvice: {reconnect: "handshake"}

当收到重新握手的建议时,客户端将发送一个/meta/handshake消息,并从第二个服务器得到一个新的clientId=456

握手后,向所有需要的通道发送 well written CometD application will subscribe (even for dynamic subscriptions),并最终几乎透明地恢复到以前的功能。

在从一台服务器切换到另一台服务器期间发布到客户端的消息完全丢失:CometD 未实现任何持久化功能。

然而,持久化消息直到客户端确认它们是可能的:CometD 提供了许多由 CometD 实现调用的侦听器,并且通过这些侦听器,应用程序可以将消息(或其他信息)持久化到他们自己选择的持久(也可能是分布式)存储:Redis、RDBMS 等

CometD 为您透明地处理重新连接 - 它只需要客户端和新服务器之间的一些消息。

您还想了解 CometD 的内存 clustering features