Python 实际上是用于构建 Activity Streams 和 Newsfeeds 的绝佳语言。Tommaso 和我编写了 Stream Framework 包。
https://github.com/tschellenbach/stream-framework
是目前用于构建新闻源的最常用的 Python 解决方案。我们还在https://getstream.io提供托管解决方案。到目前为止,Django 客户端是最容易上手的:
https ://github.com/GetStream/stream-django和 python 可以在这里找到 ( https://github.com/getstream/stream-python )
模板部分是这样工作的
{% load stream_django %}
{% for activity in activities %}
{% render_activity activity %}
{% endfor %}
这将呈现位于 activity/tweet.html 中的模板,并将活动作为上下文。例如
{{ activity.actor.username }} said "{{ activity.object.body }} {{ activity.created_at|timesince }} ago"
完整的文档在这里:
https ://github.com/GetStream/stream-django#templating
Stream Framework 允许您使用 Redis 或 Cassandra 构建任何类型的新闻源。它是按比例构建的,并使用扇出过程创建单独的新闻源。
除了 Stream Framework(我显然更喜欢)之外,还有许多其他解决方案。django 包上提供了完整列表:
https ://www.djangopackages.com/grids/g/activities/
请注意,对于新闻源,需要牢记一些缩放问题。一般来说,有3种常见的方法:
非规范化策略
大多数
用户都是这样开始的。当您打开提要页面时,您只需查询您关注的所有用户的提要。如果用户提要存储在内存中,这将继续工作相当长的一段时间。最终很难继续使用这种策略,因为您经常需要查询存储用户提要的大多数节点。
推送
推送方法将您的活动写入您的所有关注者供稿。当然,这意味着您浪费了大量资源,但最终结果是每个用户预先计算的提要。这种方法(虽然最初不是很有效)很好地扩展。
组合
一些优化的系统使用这两种方法的组合。另请参阅有关此主题的 Yahoo 论文。
存储选项
在存储所有这些数据方面,最常见的选项是 Redis、Cassandra 和 MongoDB。让我们快速比较一下:
Redis
Redis 非常容易设置和维护。但是,它仅将数据存储在内存中。这意味着您必须优化序列化数据的方式,并可能回退到数据库以获取不经常查询的数据。另一个问题是,将机器添加到 Redis 集群并非易事。
MongoDB
Mongo DB 主要由一些 ruby 项目使用,它也可用作 e14n 的 pump.io 的后端。我个人从未在生产中运行过它,因此我无法正确评估此选项。然而,有很多博客文章涉及 mongo 的性能、可扩展性和可维护性问题。
Cassandra
Fashiolista、Instagram 和 Spotify 都在使用 Cassandra。我们的托管解决方案还使用 Cassandra 作为后端。操作起来极具成本效益,您可以轻松添加更多节点。唯一的问题是很难设置和维护。
文章
另外看看这篇高可扩展性帖子,我们解释了一些涉及的设计决策:http:
//highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-提要.html
要了解有关提要设计的更多信息,我强烈建议阅读我们基于提要的一些文章: