我目前正在使用mysqldb
作为我的数据库,我需要集成实时的消息传递功能。 Tornado提供的chat demo
不实现数据库,(blog
。)
此消息传递服务也将在未来兼作电子邮件(如Facebook的消息服务如何工作。聊天平台也是电子邮件。)无论如何,我想确保我当前的第一个聊天版本能够要扩展为电子邮件,总的来说,我需要将消息存储在数据库中。
这样的事情很简单:对于发送的每条聊天消息,查询数据库并在用户屏幕上显示消息。或者,这种方法是否容易受到高服务器负载和不良优化的影响?我应该如何构建“基础设施”以使其发挥作用?
(我为这个问题中的一些固有的主观性道歉;但是,我更喜欢“测量两次,代码一次。”)
赞赏输入,示例和资源。
问候。
答案 0 :(得分:13)
Tornado是一个单线程非阻塞服务器。
这意味着如果你在主线程上进行任何阻塞调用,你最终会杀死性能。您可能最初没有注意到这一点,因为每次数据库调用可能只会阻塞20ms。但是,一旦您每秒进行超过200次数据库调用,您的应用程序将被有效锁定。
然而,这是相当多的数据库调用。在你的情况下,将有200人在同一秒内点击发送他们的聊天消息。
您可能想要做的是使用具有非阻塞API的队列。所以Tornado会收到一条聊天消息。您将其放入队列以通过其他进程保存到数据库,然后将聊天消息发送回其他聊天成员。
当有人连接到聊天会话时,您还需要向队列发送所有先前消息的请求,当队列响应时,您将这些消息发送给新连接的用户。
无论如何,这就是我如何解决问题的方法。
另请参阅此问题和答案:Any suggestion for using non-blocking MySQL api on Tornado in Python3?
请记住,Tornado是单线程的。太奇妙了。并且可以处理数千个同时连接。但是,如果其中一个连接中的代码阻塞1秒,那么 NOTHING else将在该秒期间为任何其他连接完成。