如何在数据库中存储实时聊天消息?
我现在在用 mysqldb
作为我的数据库,我需要加入一个实时的消息功能。Tornado 提供的 chat demo
并没有实现数据库功能(而 blog
是有的)。
这个消息服务未来还会像 Facebook 的消息服务那样,兼作电子邮件(也就是说聊天平台也能发邮件)。无论如何,我想确保我现在的第一个聊天版本能够扩展成邮件功能,总之,我需要把消息存储在数据库里。
像这样的功能是不是很简单:每当发送一条聊天消息,就查询数据库并把消息显示在用户的屏幕上?还是说这种方法会导致服务器负担过重,优化效果不好?我应该如何构建这个“基础设施”才能让它正常工作呢?
(对于这个问题中一些主观的部分,我表示抱歉;不过我更喜欢“多量测量,少量编码”。)
欢迎提供输入、示例和资源。
谢谢!
1 个回答
Tornado 是一个单线程的非阻塞服务器。
这意味着,如果你在主线程上进行任何会阻塞的操作,最终会影响性能。一开始你可能不会注意到,因为每次数据库调用可能只会阻塞 20 毫秒。但一旦你每秒进行超过 200 次数据库调用,你的应用就会变得非常卡顿。
不过,这 200 次数据库调用可不算少。在你的情况下,这就相当于有 200 个人在同一秒钟内发送聊天消息。
你可能想要做的是使用一个队列,并且使用非阻塞的 API。这样,Tornado 收到一条聊天消息后,就把它放到队列里,让其他进程去保存到数据库,然后再把这条聊天消息发回给其他聊天成员。
当有人连接到聊天会话时,你还需要向队列发送请求,获取所有之前的消息。当队列回复时,你就把这些消息发送给新连接的用户。
这就是我处理这个问题的方法。
另外,可以看看这个问题和答案:有没有关于在 Tornado 中使用非阻塞 MySQL API 的建议?
记住,Tornado 是单线程的。它非常强大,可以处理成千上万的同时连接。但如果其中一个连接的代码阻塞了 1 秒钟,那么在这一秒内,其他连接就什么都不能做。