跳转到主要内容

AwesomeStream创建出色的流

项目描述

AwesomeStream

AwesomeStream是一套用于创建“流服务器”的工具。也就是说,一个可以存储事件发生的信息的服务器,并且可以以有趣的方式逆序查询这些事件。

示例和用例

假设你运行一个像GitHub这样的网站,人们以各种不同的方式互动。人们可以创建存储库、分叉它们、关注或取消关注存储库、添加朋友等。用户可以在网站上执行各种操作。让我们看看AwesomeStream如何帮助。

首先,我们将设置一个简单的基于Redis的服务器

>>> from awesomestream.backends import RedisBackend
>>> from awesomestream.jsonrpc import create_app, run_server
>>> backend = RedisBackend(
...     keys=['user', 'kind', 'repo'],
...     host='127.0.0.1',
...     port=6379
... )
>>>
>>> app = create_app(backend)
>>> run_server(app, 8080)

这个简单的脚本设置了一个基于Redis的AwesomeStream服务器,特别关注“用户”、“类型”和“存储库”键。这将在稍后变得更加清晰。

在另一个控制台中,我们将实例化一个客户端。

>>> from awesomestream.jsonrpc import Client
>>> c = Client('http://127.0.0.1:8080/')

好的,现在我们已经设置了客户端,让我们开始记录用户操作。看,一个用户刚刚创建了一个新的存储库!

>>> c.insert({
...     'kind': 'create-repo',
...     'repo': 17,
...     'user': 291,
...     'name': 'frist',
...     'description': 'This is my first repo ever!',
... })
>>>

但用户犯了一个错误,将其命名为“frist”而不是“first”。所以他们继续删除它

>>> c.insert({
...     'kind': 'delete-repo',
...     'repo': 17,
...     'user': 291,
...     'reason': 'Made a typo :(',
... })
>>>

然后他们放弃了,决定关注另一个用户的存储库

>>> c.insert({'kind': 'watch', 'repo': 2842, 'user': 291, 'owner': 23})

最后他们添加那个用户为朋友

>>> c.insert({'kind': 'friend', 'user': 291, 'friend': 23})

第二个用户注意到有人关注他们,并回关

>>> c.insert({'kind': 'friend', 'user': 23, 'friend': 291})

现在我们已经将数据插入到流服务器中,我们可以查询它以获取完整的流。这里是如何看起来像这样

>>> c.items()
[{'kind': 'friend', 'user': 23, 'friend': 291},
 {'kind': 'friend', 'user': 291, 'friend': 23},
 {'repo': 2842, 'owner': 23, 'kind': 'watch', 'user': 291},
 {'repo': 17, 'kind': 'delete-repo', 'reason': 'Made a typo :(', 'user': 291},
 {'repo': 17, 'kind': 'create-repo', 'user': 291, 'name': 'frist', 'description': 'This is my first repo ever!'}
]

正如您所看到的,我们以倒序时间顺序获得了整个流。但假设我们只想过滤出‘朋友’请求。我们很容易做到这一点。

>>> c.items(kind='friend')
[{'kind': 'friend', 'user': 23, 'friend': 291},
 {'kind': 'friend', 'user': 291, 'friend': 23}
]

请注意,它们仍然以倒序时间顺序排列。我们还可以组合我们的谓词,以仅获取特定用户发出的朋友请求。

>>> c.items(kind='friend', user=23)
[{'kind': 'friend', 'user': 23, 'friend': 291}]

但一个非常常见的案例是您只想看到您朋友生成的内容。在AwesomeStream中,这很简单。

>>> c.items(user=[23, 291])
[{'kind': 'friend', 'user': 23, 'friend': 291},
 {'kind': 'friend', 'user': 291, 'friend': 23},
 {'repo': 2842, 'owner': 23, 'kind': 'watch', 'user': 291},
 {'repo': 17, 'kind': 'delete-repo', 'reason': 'Made a typo :(', 'user': 291},
 {'repo': 17, 'kind': 'create-repo', 'user': 291, 'name': 'frist', 'description': 'This is my first repo ever!'}
]

正如您所看到的,列表中通过每个用户ID都检索到了。默认情况下,items()函数检索20个项目,但通常我们需要对其进行自定义。这将是以下样子:

>>> c.items(user=[23, 291], start=1, end=3)
[{'kind': 'friend', 'user': 291, 'friend': 23},
 {'repo': 2842, 'owner': 23, 'kind': 'watch', 'user': 291}
]

支持的后端

  • 内存中(主要用于测试)

  • SQL

  • Redis

计划支持

  • CouchDB

  • Cassandra

成熟度

我正在编写此文档,以最终部署在http://radiosox.com/上,但尚未在生产环境中部署。请自行承担风险。

需求

简短摘要

使用pip,并执行pip install -U -r requirements.txt

详细摘要

严格来说,唯一的需求是simplejson。但话虽如此,如果您想支持redis,则需要安装redis。如果您想支持SQL,则需要安装SQLAlchemy。如果您想支持创建一个WSGI应用程序来通过HTTP公开,则需要安装werkzeug。最后,如果您想以纯Python的方式运行该WSGI应用程序,则想安装cherrypy

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

awesomestream-0.1.tar.gz (8.4 kB 查看哈希)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面