如何在数据库中存储实时聊天消息?

我目前正在使用 mysqldb作为我的数据库,我需要集成一个实时的消息传递功能. Tornado提供的聊天演示没有实现数据库,(而博客则是这样).

此消息传递服务也将在未来兼作电子邮件(如Facebook的消息服务如何工作.聊天平台也是电子邮件.)无论如何,我想确保我当前的第一个聊天版本能够扩展作为电子邮件,总的来说,我需要将消息存储在数据库中.

这样的事情很简单:对于发送的每条聊天消息,查询数据库并在用户屏幕上显示消息.或者,这种方法是否容易受到高服务器负载和不良优化的影响?我应该如何构建“基础设施”以使其工作?

(我为这个问题中的一些固有的主观性道歉;但是,我更喜欢“测量两次,代码一次.”)

输入,示例和资源受到赞赏.
问候.

解决方法

Tornado是一个单线程非阻塞服务器.

这意味着如果你在主线程上进行任何阻塞调用,你最终会杀死性能.您可能最初没有注意到这一点,因为每个数据库调用可能只会阻塞20ms.但是,一旦您每秒进行超过200次数据库调用,您的应用程序将被有效锁定.

然而,这是相当多的数据库调用.在你的情况下,将有200人在同一秒内点击发送他们的聊天消息.

您可能想要做的是使用具有非阻塞API的队列.所以Tornado会收到一条聊天消息.您将其放入队列以通过其他进程保存到数据库,然后将聊天消息发送回其他聊天成员.

当有人连接到聊天会话时,您还需要向队列发送所有先前消息的请求,当队列响应时,将这些消息发送给新连接的用户.

无论如何,我就是这样解决问题的.

另见这个问题和答案:Any suggestion for using non-blocking MySQL api on Tornado in Python3?

请记住,Tornado是单线程的.太奇妙了.并且可以处理数千个同时连接.但是,如果其中一个连接中的代码阻塞了1秒,那么在该秒期间,任何其他连接都将执行NOTHING else.

相关文章

本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的...
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中...
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册...
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看...