【问题标题】:A message queue model in Erlang(Comet chat)?Erlang(彗星聊天)中的消息队列模型?
【发布时间】:2010-11-22 04:43:18
【问题描述】:

我正在与 Erlang 进行 Comet 聊天。我只使用一个连接(长轮询)进行消息传输。但是,如您所知,长轮询连接不能一直保持连接。每次有新消息到达或达到超时时间时,它都会中断,然后再次连接到服务器。如果在重新连接之前发送了一条消息,那么保持聊天的完整性就会出现问题。

此外,如果用户使用 Comet-chat 打开多个窗口,则所有聊天消息都必须保持同步,这意味着用户可以拥有大量长轮询连接。所以很难保证每条消息都按时送达。

我应该为每个连接建立一个消息队列吗?或者还有什么更好的方法来解决这个问题?

【问题讨论】:

  • 许多浏览器都配置为每台服务器最多有 2 个活动连接。这是拥有所有订阅都通过的单一长轮询通信渠道的一个很好的理由。

标签: erlang message-queue comet chat long-polling


【解决方案1】:

对我来说,让每个用户有一个进程/消息队列连接到聊天似乎是最简单的方法(甚至有多个聊天窗口)。比跟踪聊天窗口应用程序中最后一条消息的时间戳,以及在此时间戳之后重新连接时请求消息。消息队列进程应该只在合理的时间跨度内保留消息。在这种情况下,重新连接完全取决于客户端。在另一种情况下,您可以从服务器发送某种 hart beat,但对我来说似乎不太可靠。除了超时之外,它没有解决其他断开连接原因的问题。服务器端排队有很多变体,每个客户端、每个用户、每个聊天室、每个 ...

【讨论】:

  • 感谢您的回答。而这种方式也是我现在正在使用的。只有一个小问题:延迟消息只能在下次长轮询连接建立后(或有新消息)发送,所以会有一点延迟。
  • 您也可以使用心跳消息来避免断开连接,但不要依赖它来保持一致性。
猜你喜欢
  • 2023-04-08
  • 2011-11-21
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多