【问题标题】:Using memcached as a database buffer for chat messages使用 memcached 作为聊天消息的数据库缓冲区
【发布时间】:2011-09-15 00:44:15
【问题描述】:

我正在使用 PHP 和 CodeIgniter 构建一个聊天应用程序。

为此,我正在使用 memcached 实现一个缓存“缓冲区”,以在内存中保存最新的聊天消息,从而减少数据库的负载。我想做的是这样的:

  1. 当消息到达时,我使用当前分钟 (YYYY-MM-DD-HH-MM) 作为键将其保存在 memcached 中。不涉及数据库 I/O。其理念是同一分钟的所有消息都收集在同一个密钥下。
  2. 用户收到的新聊天消息也从 memcached 中获取(目前我使用的是长轮询,但出于明显的性能原因,这将移至 Node.js 下的 WebSockets)。同样,不涉及数据库 I/O。
  3. 自动服务器脚本 (cronjob) 将每 5 分钟运行一次,收集最近 5 分钟的 memcached 数据并将消息插入数据库。
  4. memcached 对象设置为在 6 分钟后失效,因此我们永远不需要在内存中保留超过 6 分钟的消息数据

这意味着每 5 分钟总共有一次数据库写入操作和零次数据库读取操作。

这听起来可行吗?有没有更好的(甚至是内置的?)方法来使用 memcached 来达到这个目的?


更新:我现在一直在做一些试验,我有一个捷径的想法(阅读:hack)。我可以在 Node.js 服务器脚本中临时“缓冲”消息,直到我准备好存储它们。 Node.js 服务器中的 Javascript 对象/消息数组基本上是一种内存缓存。

所以:每 N 条消息/秒,我可以使用我想要的任何方法将缓冲的消息(JS 数组的内容)传递到我的数据库,因为它不会被经常调用。

但是,我担心这可能会削弱 Node.js 服务器进程,因为它可能不喜欢携带 200 KB 数组。

对这个策略有什么想法吗?是不是完全疯了?

【问题讨论】:

  • 要研究的技术:COMET 和 erlang/jabber(Facebook 使用这些)或:HTML5 和 Web 套接字(带有 Flash 套接字后备 - Google 用于这些)

标签: php database memcached chat buffer


【解决方案1】:

您是否研究过 HTML5 套接字连接?使用套接字服务器,您不需要存储任何东西。服务器收到来自一个订阅者的消息,并立即将其发送回正确的订阅者。我自己没有使用 HTML5 完成此操作,但我知道该功能现在存在。在使用同样支持套接字连接的 Flash 之前,我已经这样做了。

【讨论】:

  • WebSockets 是目标,当然,但它们在大多数浏览器中还不可用,所以现在我将使用 Socket.IO(它在可用时使用 WebSockets,但有几个回退机制)跨度>
【解决方案2】:

为什么不使用 INSERT DELAYED ?它为您提供几乎相同的功能,而无需使用 memcached。

不管怎样,你的解决方案看起来也不错。

【讨论】:

  • 有趣的想法。我不太喜欢它的想法,因为它似乎是在强制向 SQL 服务器提供数据,希望它能够记住正确咀嚼(缩放到每秒 100 次插入),但它实际上可能会起作用
  • @Jens:这不是希望。 INSERT DELAYED 是专门针对这种情况制作的。
  • 但是如果我的 node.js 实例每秒接收 100 条消息,并且它需要为每个消息向 SQL 服务器发出 INSERT DELAYED 语句,它是否必须与数据库服务器建立 100 个连接?除非我可以使用 node.dbslayer.js 在此之上进行连接池。
  • @Jens:良好的连接是不可避免的,但你也需要连接到memcache服务器。
  • 没错,但如果我没记错的话,我的 Node.js 实例可以保持与 memcached 服务器/进程的开放连接。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多