【问题标题】:Refresh rate for AJAX chat applicationAJAX 聊天应用程序的刷新率
【发布时间】:2018-08-05 07:36:40
【问题描述】:

我正在开发一个网站,除其他外,该网站允许用户彼此实时聊天(类似于 Facebook 聊天)。消息存储在MySQL表messages中,包含消息ID、发送者ID、接收者ID和时间。

当用户 A 与用户 B 聊天时,我通过 SQL 语句 SELECT * FROM messages WHERE (senderID='userA' AND receiverID='userB') OR (senderId='userB' AND receiverID='userA') 得到他们所有的消息。此语句检索用户 A 和用户 B 之间的所有消息。

当聊天打开时,我每秒发送一个 AJAX 请求(应该更少/更多?)检查数据库中这两个用户之间是否有任何新消息。

我的问题是:

  • 当数据库中有大量消息时,数据库每 X 秒运行一次这种 SQL 语句的要求有多高?
  • 如果每分钟有数千个请求,我的方法是否足够好?
  • 是否有更好/更快的方法来确定用户 A 是否向用户 B 发送了一条新消息,然后将其显示在聊天窗口中?

【问题讨论】:

  • 您是回答这些问题的最佳人选,可以在生产级硬件上对您的实现进行负载测试。它还取决于您的表的配置方式以及它们是否具有适合您查询的索引。
  • 您可能想阅读这篇文章,了解何时要使用哪种请求 In what situations would AJAX long/short polling be preferred over HTML5 WebSockets?
  • 此外,基于订阅和发布的系统对于此类应用程序应该具有最佳性能。
  • 谢谢,我会检查 HTML5 websockets。它们是否允许多个用户同时聊天,还是仅限于一次打开的对话?

标签: javascript sql ajax chat


【解决方案1】:

您确实应该为此使用WebSockets,但如果您真的想进行轮询,您可以这样做:

您的系统应保存对话用户参与者消息

  • John 第一次与 Mary 开始对话时,您将创建一个新的 Conversation,并带有唯一的 @987654323 @。该对话的参与者MaryJohn

  • 当用户第一次打开过去的对话时,你SELECT * FROM messages WHERE conversation_id = 'xyz'

  • 从那时起,当 John 向 Mary 发送消息时,您只需 INSERT 数据库中的该消息即可。

  • 当 Mary 发送下一个轮询信号时,她在消息中包含她收到的 last message_id。这使您可以SELECT * FROM messages WHERE message_id > 115 AND conversation_id = xyz

  • Mary 然后将新消息附加到她现有的消息列表中。

这假定message_id 是一个自动递增的列。

其他指针:

  • 首选WebSockets 而不是长轮询。它们更高效,因为服务器/客户端之间的通信仅在需要时发生,即发送消息时。
  • 首选非阻塞服务器技术,如 NodeJS。聊天应用程序围绕着非常频繁地来回发送的小数据。像 PHP 这样的传统服务器技术不能很好地处理这些情况。

【讨论】:

  • 您是否弄乱了第三个要点中的名称?这对我来说没有任何意义。
  • @BillO 是的 - 我已经修好了。
  • @BillO 我想指出的是,使用 WebSocket 而不是轮询将使这更具可扩展性,并且在发送新消息时更容易避免执行任何SELECT
  • 但有一件事是,我不会从消息中获取所有信息,而是 LIMIT 他们喜欢 20 或 30,或者任何业务案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多