在django中实现活动流(消息可能会破坏吗?)

时间:2014-02-20 11:11:53

标签: django

我正在建设一个使用django的社交网站,我需要实现一个新闻提要。我认为这是社交网站中最难的部分。

我一直在阅读,我已经看到过使用消息代理(例如rabbitmq)来实现活动流或者只是在Django中使用更简单的东西。

老实说,从架构的角度来看,我不知道从哪里开始,也不知道活动流应该如何工作。正在使用消息代理正确的方法?我想实现一个,因为我从来没有这样做,但不知道这样一个简单的事情是否会有太多工作。有人可以告诉我应该采取什么方向吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个扩展问题,你可以只使用Django模型和数据库,但随着用户数量的增加,交互次数也会增加。可能你只需要基本的Django,但大型社交网站不会这样做。

问题的一部分是:你怎么知道Jane的哪些朋友能够看到Jane刚发布的消息?这并不难,但您最终会在SQL查询中连接几个表。在'web scale'这是一个问题,因为连接速度很慢,而且你有很多用户你的数据库在多个服务器上分片(可能无法连接到分片!https://stackoverflow.com/a/6717063/202168)。

这就是Twitter或Facebook等网站将使用某种“NoSQL”数据存储区的原因。这些dbs的设计可以轻松扩展并保持大规模快速,但代价是外键,连接等功能。如果你不能加入,你会怎么做?您最终会“对数据进行非规范化”...基本上将相关表中的值复制到需要它们的位置。这意味着数据的“读取”速度很快,但是当您保存新状态时必须执行更多工作...可能您必须将新消息的副本插入到每个收件人的表中或类似的内容中。

现在您发现要将发布状态更新的用户(在数据库中保存单个记录)的行为与广播该消息的行为分离到相关用户连接的源... ...因为后者动作需要太多的数据库更新,并且需要太长时间,让事情变得缓慢。

这是消息代理进入的地方...而不是在用户点击“发送”的位置完成所有工作,您只需执行以下操作:将帖子保存到数据库并转发“发布的新状态” '对消息经纪人的任务......其余的事后发生'异步'。

代理的一个有用属性是消息的“队列”。换句话说,您可以将消息快速推送到队列中(例如在活动高峰期间),并且队列将会增长,而不是从过载的数据库中获取错误。之后当秒杀已经过去时,你的工作人员仍然会从队列中弹出消息......希望在下一次秒杀之前足够快地将其清空!

另一个好处是代理,工作人员,数据库节点,Web服务器都可以根据需要独立扩展。

通常,对于Python中的消息代理/任务队列系统,您需要使用Celery:
http://www.celeryproject.org

在实际操作中,您可以使用来自@ vadimchin的答案的信号将您的任务添加到Celery队列。

答案 1 :(得分:1)

简单方法:创建信号,并建立类似

的模型
class Event(models.Model):
    event_type = .... # 1 - new photo, 2 - news, 3 - new video etc.
    title =
    content = 


def create_event_record(sender, user, source,event_type, title, content, **kwargs):
   ...

从视图中调用信号

在客户端 - 获取事件包,例如100.将其放入客户端缓存(使用jscript),然后旋转。当所有事件都旋转后,从服务器获取新的数据部分。