我目前正在使用
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.