relé使得与google pubsub的集成更加容易。
rele的Python项目详细描述
relé使与google pubsub的集成变得更容易,并且准备好 无缝集成到任何Django项目中。
动机和特点
Publish-Subscribe pattern特别是google cloudPubSub library是非常强大的工具,但是您可以很容易地在上面切掉手指。relé通过为发布者、订阅者和工作者类提供以下功能,实现了无缝集成:
- 一个
publish
函数:- singleton:避免每次发布时实例化
PublisherClient
。否则,它将导致内存泄漏,因为传输未被google库关闭。
- singleton:避免每次发布时实例化
- 声明订阅者的装饰符:
- 内置ACK
- 自动订阅主题命名
Publisher
和Subscription
类:- 自动GC客户端配置以及主题和订阅路径的构建
- 一个
Worker
类:- 内置数据库连接管理,使开放连接不会随时间增加
- 管理命令
- 自动创建订阅
- 订阅自动发现
名称中的内容
“relé”是西班牙语的relay,这是一种在通信和电子技术(包括电报、电话、电力传输和晶体管)发展史上has played a key role的技术。
快速启动
添加到您的INSTALLED_APPS
:
INSTALLED_APPS=[...,'rele',]
你还需要设置你的设置。
fromgoogle.oauth2importservice_accountRELE={'GC_CREDENTIALS':service_account.Credentials.from_service_account_file('rele/settings/dummy-credentials.json'),'GC_PROJECT_ID':'dummy-project-id','MIDDLEWARE':['rele.contrib.LoggingMiddleware','rele.contrib.DjangoDBMiddleware',],'SUB_PREFIX':'mysubprefix','APP_NAME':'myappname','ENCODER_PATH':'rest_framework.utils.encoders.JSONEncoder',}
注意:确保^{
换句话说,确保在运行的环境中未显式设置CONN_MAX_AGE
python manage.py runrele
。
用法
出版
importreledefmyfunc():# ...rele.publish(topic='lets-tell-everyone',data={'foo':'bar'},myevent='arrival')
声明订阅
只需用sub
装饰器装饰您的函数:
# your_app.subs.pyfromreleimportsub@sub(topic='lets-tell-everyone')defsub_function(data,**kwargs):event=kwargs.get('myevent')print(f'I am a task doing stuff with an event: {event}')
订阅suffix
为了使用同一主题中的多个订阅,您需要添加 订阅的唯一后缀,所以他们都会听周围的流言蜚语。
@sub(topic='lets-tell-everyone',suffix='sub1')defpurpose_1(data,**kwargs):pass@sub(topic='lets-tell-everyone',suffix='sub2')defpurpose_2(data,**kwargs):pass
在进程中运行工作进程
在worker中,可以运行python manage.py runrele
。一旦订阅
主题,在另一个进程中,您可以运行publish
函数。您的订阅过程
应该把消息打印出来。
运行测试
代码真的有用吗?
make test