【问题标题】:How to store real-time chat messages in database?如何在数据库中存储实时聊天消息?
【发布时间】:2013-03-04 17:59:19
【问题描述】:

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

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

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

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

感谢输入、示例和资源。
问候。

【问题讨论】:

    标签: python chat real-time tornado mysql-python


    【解决方案1】:

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

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

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

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

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

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

    另见此问答:Any suggestion for using non-blocking MySQL api on Tornado in Python3?

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

    【讨论】:

    • 哇,这是一个很好的答案,感谢您对此的帮助。这很有意义,是一个很好的起点。
    • 你能告诉我我以前在生产应用程序的 Tornado 循环上使用过阻塞调用吗? :)
    猜你喜欢
    • 2018-09-30
    • 2017-11-02
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多