【发布时间】:2012-07-11 04:34:35
【问题描述】:
请原谅缺少问题。 我正在尝试建立一个与聊天室功能相同的网站。每个房间(有数千个房间)有 5-50 个观众的想法是非常真实的,只有大约 1% 的房间会聊天。
我有一些想法,但我想出的所有想法似乎都需要大量的处理能力......什么是有效的方法?
【问题讨论】:
请原谅缺少问题。 我正在尝试建立一个与聊天室功能相同的网站。每个房间(有数千个房间)有 5-50 个观众的想法是非常真实的,只有大约 1% 的房间会聊天。
我有一些想法,但我想出的所有想法似乎都需要大量的处理能力......什么是有效的方法?
【问题讨论】:
有专门为此目的而设计的程序(ircd,请参阅http://www.atheme.org/project/charybdis 和类似的程序。)但是,如果您真的想重新发明轮子,您可能需要一个具有相当数量的物理内存和共享内存扩展(例如:APC。)
共享内存功能(在这种情况下为 APC)将是让每个人的对话保持同步的最快方式,而硬盘驱动器不会过度旋转或 MySQL 会失控。您应该能够以这种方式容纳数百个并发请求,而服务器不会出汗,因为它不会对 MySQL 征税。它几乎直接从 RAM 芯片中读取数据。
您可以密钥存储用于对话的各个频道(例如:“channel-#welcome”)并通过 AJAX 直接轮询它们。请参阅apc_store、apc_add 和apc_fetch 了解更多信息。
即使您最终出于某种原因将对话存储在 MySQL 中,仍然最好使用某种内存缓存进行读取,因为这会减轻数据库服务器的巨大负载。
如果您这样做,最好将您的数据库设置为 innodb,因为它们在写入期间不会锁定。使用 APC,您的限制因素将是您打算保留在共享缓冲区中的 RAM 量和会话长度。
【讨论】:
您提出了一个非常广泛的问题,但是:
将每条消息作为一行存储在数据库中,使用 AJAX 重新加载包含最后几条消息的聊天窗口内容,例如
SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100
将为聊天室选择 100 条最新消息。循环遍历结果并根据需要显示所有消息。
如果您的数据库用户有权创建表格,您还可以为每个聊天室动态创建一个表格(这会提高性能)
然后,您只需在表单中添加 input 或 textarea,当提交时,将新行插入数据库(下次重新加载聊天窗口时将显示给所有人)。
另一种更优化的方法是每次查询只向用户返回新消息,方法是将每条消息的时间戳存储在数据库中,并在 JavaScript 中本地存储最后一个请求的时间戳,然后使用查询喜欢:
SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100
然后将结果附加到聊天窗口,而不是替换它。
【讨论】: