Stream Framework 允许您使用 Redis 构建复杂的提要和缓存结构。
项目描述
流框架
----------------
[](https ://travis-ci.org/tschellenbach/Stream-Framework)
[](http://badge.fury. io/py/stream-framework)
## Activity Streams & Newsfeeds ##
<p align="center">
<img src="https://dvqg2dogggmn6.cloudfront.net/images/mood-home.png" alt="您可以构建的示例" title="您可以构建的"/>
</p>
Stream Framework 是一个 python 库,它允许您使用 Cassandra 和/或 Redis 构建活动流和新闻源。如果您不使用 python,请查看 [Stream] (https://getstream.io/),它支持 Node、Ruby、PHP、Python、Go、Scala、Java 和 REST。
您可以构建的示例有:
* 活动流,例如在 Github 上看到的
* Twitter 风格的新闻源
* Instagram/Pinterest 之类的
源 * Facebook 风格
的新闻源 * 通知系统
(Feed 通常也称为:活动流、活动源、新闻流。)
[fashiolista]:http://www.fashiolista.com/
[流]:http ://getstream.io/
[博客]:http://blog.getstream.io/post/98149880113/introducing-the -流框架
[stream_js]:https ://github.com/tschellenbach/stream-js [
stream_python ]:https://github.com/tschellenbach/stream-python
[stream_php]:https://github.com/tbarbugli/stream- php
[stream_ruby]: https://github.com/tbarbugli/stream-ruby
[fashiolista_flat]: http://www.fashiolista.com/feed/?feed_type=F
[fashiolista_aggregated]: http://www.fashiolista. com/feed/?feed_type=A
[fashiolista_notification]:http://www.fashiolista.com/my_style/notification/
[example_app_link]:https://github.com/tbarbugli/stream_framework_example
## Stream ##
<a href="https://getstream.io/"><img src="http://dvqg2dogggmn6.cloudfront.net/images/getstream-dot-io-logo-light.png" alt="构建可扩展的新闻源和使用 getstream.io 的活动流" title="使用 getstream.io 构建可扩展的新闻源和活动流" width="300px"/></a>
Stream Framework 的作者还在 [ getstream.io] [流]
它允许您通过与美观且易于使用的 REST API 交谈来创建您的提要。有适用于 Node、Ruby、PHP、Python、Go、Scala 和 Java 的客户端。[开始](https://getstream.io/get_started/#intro) 只需单击几下即可解释 API 和概念。它更易于使用,最多可释放 300 万个提要更新,并为您省去维护 Cassandra、Redis、Faye、RabbitMQ 和 Celery 工作人员的麻烦。
## Stream Framework ##
**安装**
推荐通过 pip 安装::
$ pip install stream-framework
默认 stream-framework 不安装 redis 和 cassandra 所需的依赖
***安装带有 Redis 依赖的 stream-framework* **
$ pip 安装流框架[redis]
***安装带有 Cassandra 依赖项的流框架***
$ pip install stream-framework[cassandra]
***安装带有 Redis 和 Cassandra 依赖项的流框架***
$ pip install stream-framework[redis,cassandra]
* *作者和贡献者**
* Thierry Schellenbach (thierry at getstream.io)
* Tommaso Barbugli (tommaso at getstream.io)
* Anislav Atanasov
* Guyon Morée
**资源**
* [Documentation]
* [Bug Tracker]
* [Code]
* [Travis CI]
* [Stackoverflow]
**示例应用程序**
我们包含了一个基于 Stream 框架的 [Pinterest 类示例应用程序] [example_app_link]。
**教程**
* [Pinterest 风格提要示例应用程序] [mellowmorning_example]
[mellowmorning_example]:http://www.mellowmorning.com/2013/10/18/scalable-pinterest-tutorial-feedly-redis/
[文档]:https://stream -framework.readthedocs.org/
[Bug Tracker]:https://github.com/tschellenbach/Stream-Framework/issues
[代码]:http ://github.com/tschellenbach/Stream-Framework
[Travis CI]:http ://travis-ci.org/tschellenbach/Stream-Framework/
[Stackoverflow]: http://stackoverflow.com/questions/tagged/stream-framework
## 使用 Stream Framework ##
这个快速示例将向您展示如何发布给所有关注者的 Pin 图。因此,让我们为您刚刚固定的项目创建
一个活动。
```蟒蛇
from stream_framework.activity import Activity
def create_activity(pin):
activity = Activity(
pin.user_id,
PinVerb,
pin.id,
pin.influencer_id,
time=make_naive(pin.created_at, pytz.utc),
extra_context=dict(item_id=pin .item_id)
)
返回活动
```
接下来我们要开始在多个提要上发布此活动。
首先,我们希望将其插入您的个人供稿中,然后再插入您的关注者的供稿中。
让我们从定义这些提要开始。
```python
from stream_framework.feeds.redis 导入 RedisFeed
类 UserPinFeed(PinFeed):
key_format = 'feed:user:%(user_id)s'
class PinFeed(RedisFeed):
key_format = 'feed:normal:%(user_id)s'
```
写入这些提要非常简单。例如,要写入用户 13 的提要,可以执行
```python
feed = UserPinFeed(13)
feed.add(activity)
```
但我们不想只发布给一个用户提要。我们希望发布到所有关注您的用户的订阅源。
此操作称为扇出,并在管理器类中抽象出来。
我们需要对 Manager 类进行子类化,并告诉它我们如何确定哪些用户关注我们。
```python
from stream_framework.feed_managers.base import Manager
class PinManager(Manager):
feed_classes = dict(
normal=PinFeed,
)
user_feed_class = UserPinFeed
def add_pin(self, pin):
activity = pin.create_activity()
# 添加用户活动将其添加到用户提要中,并开始扇出
self.add_user_activity(pin.user_id,活动)
def get_user_follower_ids(self, user_id):
ids = Follow.objects.filter(target=user_id).values_list('user_id', flat=True)
return {FanoutPriority.HIGH:ids}
manager = PinManager()
```
现在设置管理器类广播 pin 变得像
```python
manager.add_pin(pin)
```一样简单
调用此方法会将 pin 插入您的个人提要和所有关注您的用户的提要中。
它通过 Celery 生成许多小任务来实现这一点。在 Django(或任何其他框架)中,您现在可以显示用户提要。
```python
# django example
@login_required
def feed(request):
'''
被你关注的人固定的项目
'''
context = RequestContext(request)
feed = manager.get_feeds(request.user.id)['normal' ]
活动 = list(feed[:25])
context['activities'] = 活动
响应 = render_to_response('core/feed.html', context)
返回响应
```
此示例仅简要介绍了 Stream Framework 的工作原理。
完整的解释可以在阅读文档中找到。
## 特性##
Stream Framework 使用 celery 和 Redis/Cassandra 构建了一个写入量大、读取量极少的系统。
它的特点:
- 异步任务(所有繁重的工作都发生在后台,您的用户无需等待)
- 可重用组件(您需要根据您的用例进行权衡,Stream Framework 不会妨碍您)
-完整的 Cassandra 和 Redis 支持
- Cassandra 存储使用新的 CQL3 和 Python-Driver 包,让您可以访问最新的 Cassandra 功能。
- 为性能卓越的 Cassandra 2.1 构建。2.2 和 3.3 也通过了测试套件,但没有生产经验。
## 背景文章##
关于构建基于提要的系统的最佳方法的文章很多。
以下是一些谈话的集合:
[Twitter 2013] [twitter_2013]
基于 Redis 的数据库回退,与 Fashiolista 的旧方法非常相似。
[twitter_2013]:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html
[Etsy 提要缩放] [etsy]
( Gearman,单独的评分和聚合步骤,汇总 - 聚合第二部分)
[etsy]:http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture/
[linkedin]:https://engineering.linkedin.com/blog/2016/03/followfeed--linkedin-s-feed-made-faster-and-smarter
[LinkedIn 排名提要] [linkedin]
[facebook]:http: //www.infoq.com/presentations/Facebook-Software-Stack
[Facebook 历史] [facebook]
[djproject]: http://justquick.github.com/django-activity-stream/
[具有良好命名约定的 Django 项目] [djproject]
[activity_stream]:http: //activitystrea.ms/specs/atom/1.0/
[活动流规范] [activity_stream]
[关于最佳实践的 Quora 帖子] [quora]
[quora]:http://www.quora .com/What-are-best-practices-for-building-something-like-a-News-Feed?q=news+feeds
[Quora 扩展社交网络订阅源] [quora2]
[quora2]:http://www.quora.com/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed
[Redis ruby 示例] [redisruby ]
[redisruby]: http://blog.waxman.me/how-to-build-a-fast-news-feed-in-redis
[FriendFeed 方法] [friendfeed]
[friendfeed]: http://backchannel.org /blog/friendfeed-schemaless-mysql
[Thoonk setup] [thoonk]
[thoonk]: http://blog.thoonk.com/
[雅虎研究论文] [yahoo]
[yahoo]: http://jeffterrace.com/docs /feeding-frenzy-sigmod10-web.pdf
[Twitter 的方法] [twitter]
[twitter]:http: //www.slideshare.net/nkallen/q-con-3770885 [
Cassandra 在 Instagram] [instagram]
[instagram] :http://planetassandra.org/blog/post/instagram-making-the-switch-to-cassandra-from-redis-75-instasavings [
Etsy 相关性][etsy_relevancy]
[etsy_relevancy]:http:// /mimno.infosci.cornell.edu/info6150/readings/p1640-hu.pdf
[Zite 架构概述][zite]
[zite]:http: //blog.zite.com/2012/01/11/zite-under- the-hood/
[使用 ES 排名 feeds][es]
[es]: https://speakerdeck.com/viadeoteam/a-personalized-news-feed
[Riak at Xing - 由 Stefan Kaes 和 Sebastian Röbke 博士撰写][xing ]
[xing]:https://www.youtube.com/watch?v= 38yKu5HR-tM [
Yammer 的 Riak 和 Scala][yammer]
[yammer]:http://basho.com/posts/business/riak- and-scala-at-yammer/
----------------
[](https ://travis-ci.org/tschellenbach/Stream-Framework)
[](http://badge.fury. io/py/stream-framework)
## Activity Streams & Newsfeeds ##
<p align="center">
<img src="https://dvqg2dogggmn6.cloudfront.net/images/mood-home.png" alt="您可以构建的示例" title="您可以构建的"/>
</p>
Stream Framework 是一个 python 库,它允许您使用 Cassandra 和/或 Redis 构建活动流和新闻源。如果您不使用 python,请查看 [Stream] (https://getstream.io/),它支持 Node、Ruby、PHP、Python、Go、Scala、Java 和 REST。
您可以构建的示例有:
* 活动流,例如在 Github 上看到的
* Twitter 风格的新闻源
* Instagram/Pinterest 之类的
源 * Facebook 风格
的新闻源 * 通知系统
(Feed 通常也称为:活动流、活动源、新闻流。)
[fashiolista]:http://www.fashiolista.com/
[流]:http ://getstream.io/
[博客]:http://blog.getstream.io/post/98149880113/introducing-the -流框架
[stream_js]:https ://github.com/tschellenbach/stream-js [
stream_python ]:https://github.com/tschellenbach/stream-python
[stream_php]:https://github.com/tbarbugli/stream- php
[stream_ruby]: https://github.com/tbarbugli/stream-ruby
[fashiolista_flat]: http://www.fashiolista.com/feed/?feed_type=F
[fashiolista_aggregated]: http://www.fashiolista. com/feed/?feed_type=A
[fashiolista_notification]:http://www.fashiolista.com/my_style/notification/
[example_app_link]:https://github.com/tbarbugli/stream_framework_example
## Stream ##
<a href="https://getstream.io/"><img src="http://dvqg2dogggmn6.cloudfront.net/images/getstream-dot-io-logo-light.png" alt="构建可扩展的新闻源和使用 getstream.io 的活动流" title="使用 getstream.io 构建可扩展的新闻源和活动流" width="300px"/></a>
Stream Framework 的作者还在 [ getstream.io] [流]
它允许您通过与美观且易于使用的 REST API 交谈来创建您的提要。有适用于 Node、Ruby、PHP、Python、Go、Scala 和 Java 的客户端。[开始](https://getstream.io/get_started/#intro) 只需单击几下即可解释 API 和概念。它更易于使用,最多可释放 300 万个提要更新,并为您省去维护 Cassandra、Redis、Faye、RabbitMQ 和 Celery 工作人员的麻烦。
## Stream Framework ##
**安装**
推荐通过 pip 安装::
$ pip install stream-framework
默认 stream-framework 不安装 redis 和 cassandra 所需的依赖
***安装带有 Redis 依赖的 stream-framework* **
$ pip 安装流框架[redis]
***安装带有 Cassandra 依赖项的流框架***
$ pip install stream-framework[cassandra]
***安装带有 Redis 和 Cassandra 依赖项的流框架***
$ pip install stream-framework[redis,cassandra]
* *作者和贡献者**
* Thierry Schellenbach (thierry at getstream.io)
* Tommaso Barbugli (tommaso at getstream.io)
* Anislav Atanasov
* Guyon Morée
**资源**
* [Documentation]
* [Bug Tracker]
* [Code]
* [Travis CI]
* [Stackoverflow]
**示例应用程序**
我们包含了一个基于 Stream 框架的 [Pinterest 类示例应用程序] [example_app_link]。
**教程**
* [Pinterest 风格提要示例应用程序] [mellowmorning_example]
[mellowmorning_example]:http://www.mellowmorning.com/2013/10/18/scalable-pinterest-tutorial-feedly-redis/
[文档]:https://stream -framework.readthedocs.org/
[Bug Tracker]:https://github.com/tschellenbach/Stream-Framework/issues
[代码]:http ://github.com/tschellenbach/Stream-Framework
[Travis CI]:http ://travis-ci.org/tschellenbach/Stream-Framework/
[Stackoverflow]: http://stackoverflow.com/questions/tagged/stream-framework
## 使用 Stream Framework ##
这个快速示例将向您展示如何发布给所有关注者的 Pin 图。因此,让我们为您刚刚固定的项目创建
一个活动。
```蟒蛇
from stream_framework.activity import Activity
def create_activity(pin):
activity = Activity(
pin.user_id,
PinVerb,
pin.id,
pin.influencer_id,
time=make_naive(pin.created_at, pytz.utc),
extra_context=dict(item_id=pin .item_id)
)
返回活动
```
接下来我们要开始在多个提要上发布此活动。
首先,我们希望将其插入您的个人供稿中,然后再插入您的关注者的供稿中。
让我们从定义这些提要开始。
```python
from stream_framework.feeds.redis 导入 RedisFeed
类 UserPinFeed(PinFeed):
key_format = 'feed:user:%(user_id)s'
class PinFeed(RedisFeed):
key_format = 'feed:normal:%(user_id)s'
```
写入这些提要非常简单。例如,要写入用户 13 的提要,可以执行
```python
feed = UserPinFeed(13)
feed.add(activity)
```
但我们不想只发布给一个用户提要。我们希望发布到所有关注您的用户的订阅源。
此操作称为扇出,并在管理器类中抽象出来。
我们需要对 Manager 类进行子类化,并告诉它我们如何确定哪些用户关注我们。
```python
from stream_framework.feed_managers.base import Manager
class PinManager(Manager):
feed_classes = dict(
normal=PinFeed,
)
user_feed_class = UserPinFeed
def add_pin(self, pin):
activity = pin.create_activity()
# 添加用户活动将其添加到用户提要中,并开始扇出
self.add_user_activity(pin.user_id,活动)
def get_user_follower_ids(self, user_id):
ids = Follow.objects.filter(target=user_id).values_list('user_id', flat=True)
return {FanoutPriority.HIGH:ids}
manager = PinManager()
```
现在设置管理器类广播 pin 变得像
```python
manager.add_pin(pin)
```一样简单
调用此方法会将 pin 插入您的个人提要和所有关注您的用户的提要中。
它通过 Celery 生成许多小任务来实现这一点。在 Django(或任何其他框架)中,您现在可以显示用户提要。
```python
# django example
@login_required
def feed(request):
'''
被你关注的人固定的项目
'''
context = RequestContext(request)
feed = manager.get_feeds(request.user.id)['normal' ]
活动 = list(feed[:25])
context['activities'] = 活动
响应 = render_to_response('core/feed.html', context)
返回响应
```
此示例仅简要介绍了 Stream Framework 的工作原理。
完整的解释可以在阅读文档中找到。
## 特性##
Stream Framework 使用 celery 和 Redis/Cassandra 构建了一个写入量大、读取量极少的系统。
它的特点:
- 异步任务(所有繁重的工作都发生在后台,您的用户无需等待)
- 可重用组件(您需要根据您的用例进行权衡,Stream Framework 不会妨碍您)
-完整的 Cassandra 和 Redis 支持
- Cassandra 存储使用新的 CQL3 和 Python-Driver 包,让您可以访问最新的 Cassandra 功能。
- 为性能卓越的 Cassandra 2.1 构建。2.2 和 3.3 也通过了测试套件,但没有生产经验。
## 背景文章##
关于构建基于提要的系统的最佳方法的文章很多。
以下是一些谈话的集合:
[Twitter 2013] [twitter_2013]
基于 Redis 的数据库回退,与 Fashiolista 的旧方法非常相似。
[twitter_2013]:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html
[Etsy 提要缩放] [etsy]
( Gearman,单独的评分和聚合步骤,汇总 - 聚合第二部分)
[etsy]:http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture/
[linkedin]:https://engineering.linkedin.com/blog/2016/03/followfeed--linkedin-s-feed-made-faster-and-smarter
[LinkedIn 排名提要] [linkedin]
[facebook]:http: //www.infoq.com/presentations/Facebook-Software-Stack
[Facebook 历史] [facebook]
[djproject]: http://justquick.github.com/django-activity-stream/
[具有良好命名约定的 Django 项目] [djproject]
[activity_stream]:http: //activitystrea.ms/specs/atom/1.0/
[活动流规范] [activity_stream]
[关于最佳实践的 Quora 帖子] [quora]
[quora]:http://www.quora .com/What-are-best-practices-for-building-something-like-a-News-Feed?q=news+feeds
[Quora 扩展社交网络订阅源] [quora2]
[quora2]:http://www.quora.com/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed
[Redis ruby 示例] [redisruby ]
[redisruby]: http://blog.waxman.me/how-to-build-a-fast-news-feed-in-redis
[FriendFeed 方法] [friendfeed]
[friendfeed]: http://backchannel.org /blog/friendfeed-schemaless-mysql
[Thoonk setup] [thoonk]
[thoonk]: http://blog.thoonk.com/
[雅虎研究论文] [yahoo]
[yahoo]: http://jeffterrace.com/docs /feeding-frenzy-sigmod10-web.pdf
[Twitter 的方法] [twitter]
[twitter]:http: //www.slideshare.net/nkallen/q-con-3770885 [
Cassandra 在 Instagram] [instagram]
[instagram] :http://planetassandra.org/blog/post/instagram-making-the-switch-to-cassandra-from-redis-75-instasavings [
Etsy 相关性][etsy_relevancy]
[etsy_relevancy]:http:// /mimno.infosci.cornell.edu/info6150/readings/p1640-hu.pdf
[Zite 架构概述][zite]
[zite]:http: //blog.zite.com/2012/01/11/zite-under- the-hood/
[使用 ES 排名 feeds][es]
[es]: https://speakerdeck.com/viadeoteam/a-personalized-news-feed
[Riak at Xing - 由 Stefan Kaes 和 Sebastian Röbke 博士撰写][xing ]
[xing]:https://www.youtube.com/watch?v= 38yKu5HR-tM [
Yammer 的 Riak 和 Scala][yammer]
[yammer]:http://basho.com/posts/business/riak- and-scala-at-yammer/
项目详情
关
stream_framework -1.4.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a0154c62f4fcdb4137a723cb231363014a5559fb0bd102b15217c88c407c4746 |
|
MD5 | 441f760da6f31e6722df6a6bfc150591 |
|
布莱克2-256 | 8ee8d03b269cb10366515249bd5f7359f086faa4adb57692cb984d79de7ededb |