我正在开发一个网站,该网站允许用户彼此实时聊天(类似于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 发送了新消息,然后将其显示在聊天窗口中?
你真的应该使用 WebSockets 来实现这一点,但如果你真的想进行轮询,这就是你可以做到的:
您的系统应包含对话、用户或参与者和消息。
-
当John第一次与Mary开始对话时,您将创建一个具有独特
conversation_id
的新对话。对话的参与者是玛丽和约翰。 -
当用户首次打开过去的对话时,您
SELECT * FROM messages WHERE conversation_id = 'xyz'
。 -
从那时起,当约翰向玛丽发送消息时,您只需将该消息
INSERT
您的数据库中即可。 -
当玛丽发送下一个投票信号时,她在消息中包含了她收到的最后一个
message_id
。这使您可以SELECT * FROM messages WHERE message_id > 115 AND conversation_id = xyz
. -
然后,Mary 将新邮件附加到她现有的邮件列表中。
这假定message_id
是自动递增的列。
其他指针:
- 首选 WebSockets 而不是长轮询。它们更有效,因为服务器/客户端之间的通信仅在需要时发生,即发送消息时。
- 更喜欢非阻塞服务器技术,如 NodeJS。聊天应用程序围绕着来回发送极其频繁的小数据。像PHP这样的传统服务器技术不能很好地处理这些情况。