4

我正在尝试为网站创建聊天,我想知道如果有大量用户,db 解决方案是否是最好的解决方案。

如果数据库是一个可接受的解决方案,我想知道哪种是设计它的最佳方式:

  1. 一张表是否足以存储所有用户的所有消息?每次用户发送它时,我是否必须存储每条消息(比如一个记录中的简单“你好”)?

  2. 我必须为每个聊天创建单独的表格吗?

显然假设进行了索引和分区。

我很害怕现阶段的表现(分贝级别)。然后我可以更好地专注于中间件部分并在那里进行管理。

4

3 回答 3

9

MySQL 不是实时的

MySQL 显然不是聊天的最佳解决方案:您没有理由处理多年的积压工作来获取最新消息,也不想为每个活动用户每秒触发一次查询。关系数据库的开销不容忽视。

看看redis

我会选择redis:它是一种高级键值存储,具有实时交互 (PUB/SUB)、自动过期的功能,在处理简单数据时绝对比 MySQL 快。

编辑:是的,它的所有数据都在内存中。1 Gb 的内存足以容纳世界上每个图书馆中的每一本书。也就是说,MySql 还使用 ram 缓存(查询缓存)。而redis是ACID。(过度简化:您可以启用保存到磁盘。)

MySql 提示,如果你坚持下去

如果您还决定使用 MySQL,则必须将每一行都写入 DB 以便其他行可见。更明确地说,您需要对每条消息进行提交。确保你有某种清理机制,例如一个 cronjob 将所有早于一天的消息移动到一些存档表中。

缓存!

想象一下你房间里有 100 个用户,每个用户每 3 秒检查一次新消息。每秒 300 个查询?(好的,体面的服务器可以处理这个问题,但你要求一个好的解决方案) 换一种方式:有一个 memcached /redis-saved 标志“Last message id”。每次有人在聊天中写东西时更改它。现在让客户端提交它的最后一个已知消息ID。如果你成功了,即使没有启动 MySql 也立即退出。如果你真的很优秀,你可以让 PHP 甚至 make 来返回相应的 ETag。

长民意调查

对于前端客户端:不要每 n 秒触发一次重新加载或 ajax 请求!让自己了解 Websocket 和长投票。这是一种技术,浏览器打开一个不会立即返回结果的站点,但会保持连接打开,直到有要报告的内容(或发生超时)

编辑:OP的评论询问使用什么编程语言

这取决于你的知识。我会使用 PHP 和 redis,但那是因为我很了解它们。如果您更喜欢 Java,请使用它。如果你没有偏好:Java更通用,php更容易开始学习。没有客观的万能答案。

于 2013-06-04T20:12:50.843 回答
0

使用 NOSQL 将数据存储为文件,适用于大型数据库

于 2013-06-04T20:12:25.513 回答
0

确定您想要的功能。我能马上想到的一些可能会有所作为:

  • 你想存储流吗?(如果没有,那么您的数据库需求很小。)
  • 您希望用户可以访问多少流?一天?一周?所有的?(您可以定期卸载消息以维护自己的历史记录,但也可以保持可公开访问的小型数据库。)
  • 用户每分钟/小时/天可以发布多少条消息?(提示:没有他们想要的那么多)
  • 你想要线程,还是只是一个每个人都可以看到的长流?(增加复杂性)
  • 您希望用户能够发送私人消息吗?(增加复杂性)
  • 浏览器中的聊天多久刷新一次?(刷新越多,服务器负载越大)
于 2013-06-04T20:18:03.927 回答