6

mysqldb目前正在使用我的数据库,我需要集成一个实时的消息传递功能。chat demoTornado 提供的没有实现数据库,(而blog .

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

就像这样简单:对于发送的每条聊天消息,查询数据库并将消息显示在用户的屏幕上。或者,这种方法容易遭受服务器负载高和优化不佳的问题吗?我应该如何构建“基础设施”来完成这项工作?

(我为这个问题的一些内在主观性道歉;但是,我更喜欢“测量两次,编码一次。”)

输入、示例和资源表示赞赏。
问候。

4

1 回答 1

14

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

这意味着如果您在主线程上进行任何阻塞调用,您最终会降低性能。一开始您可能不会注意到这一点,因为每个数据库调用可能只会阻塞 20 毫秒。但是,一旦您每秒进行超过 200 次数据库调用,您的应用程序就会被有效地锁定。

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

您可能想要做的是使用具有非阻塞 API 的队列。因此 Tornado 收到一条聊天消息。您将它放在队列中以由另一个进程保存到数据库中,然后将聊天消息发送回其他聊天成员。

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

无论如何,这就是我解决问题的方式。

另请参阅此问题和答案:任何建议在 Python3 中的 Tornado 上使用非阻塞 MySQL api?

请记住,Tornado 是单线程的。太奇妙了。并且可以处理数千个同时连接。但是,如果其中一个连接中的代码阻塞了 1 秒,那么在那一秒内任何其他连接都不会执行任何其他操作。

于 2013-03-15T21:43:58.780 回答