Erlang中的消息队列模型(Comet聊天)?

4
我正在使用Erlang进行Comet聊天。我只使用一个连接(长轮询)进行消息传输。但是,正如您所知道的那样,长轮询连接不能一直保持连接。每当有新消息到达或超时时,它就会中断,然后重新连接到服务器。如果在重新连接之前发送了一条消息,则很难保持聊天的完整性。
此外,如果用户打开多个具有Comet-chat的窗口,则所有聊天消息都必须保持同步,这意味着用户可能会有很多长轮询连接。因此,很难确保每条消息都能及时交付。
我应该为每个连接构建一个消息队列吗?还是有更好的方法来解决这个问题?

许多浏览器默认配置为每个服务器最多有2个活动连接。这是建立一个单一的长轮询通信通道,所有订阅都通过该通道传递的一个很好的理由。 - Christian
1个回答

1

对我来说,最简单的方法似乎是为连接到聊天的每个用户拥有一个进程/消息队列(甚至有多个聊天窗口)。然后在聊天窗口应用程序中跟踪最后一条消息的时间戳,并在重新连接时请求该时间戳之后的消息。消息队列进程应仅保留一段合理的时间跨度内的消息。在这种情况下,重新连接完全由客户端处理。在另一种情况下,您可以从服务器发送某种心跳信号,但我认为这种方法不太可靠。它不能解决连接断开的其他原因而不是超时的问题。服务器端排队有许多变体,如每个客户端、每个用户、每个聊天室、每个... 队列等。


谢谢你的回答。这种方式也是我现在正在使用的。只有一个小问题:延迟消息只能在下一次长轮询连接建立(或者有新消息到来时)才能发送,因此会有一些延迟。 - Mickey Shine
你也可以使用心跳消息来避免断开连接,但不要仅依赖于它来保持一致性。 - Hynek -Pichi- Vychodil

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