relé使得与google pubsub的集成更加容易。

rele的Python项目详细描述


relé使与google pubsub的集成变得更容易,并且准备好 无缝集成到任何Django项目中。

Build StatusRead the DocsCode CoveragePyPI - Python Version

动机和特点

Publish-Subscribe pattern特别是google cloudPubSub library是非常强大的工具,但是您可以很容易地在上面切掉手指。relé通过为发布者、订阅者和工作者类提供以下功能,实现了无缝集成:

  • 一个publish函数:
    • singleton:避免每次发布时实例化PublisherClient。否则,它将导致内存泄漏,因为传输未被google库关闭。
  • 声明订阅者的装饰符:
    • 内置ACK
    • 自动订阅主题命名
  • PublisherSubscription类:
    • 自动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',}

注意:确保^{} 在工作进程中设置为0。django默认值为0。

换句话说,确保在运行的环境中未显式设置CONN_MAX_AGEpython 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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
HTTP标头的java InputStream未终止   java测试SpringWebListener   具有定义的替换编号Java的regex ReplaceAll   在java中使用contains()方法   java在选择查询中使用JoinColumn字段   具有用户的java Start-stop demon不是以给定用户启动   java glBufferData生成GL\u无效\u操作   java中循环代码的循环   Java位无符号移位(>>>>)会产生奇怪的结果   java HQL使用点分隔符从select获取结果   条纹、弹簧、玩耍(或?):使用哪种高性能Java框架?   广播接收机中的java停止服务   java回收器视图占据整个屏幕。不在上面显示我的UI元素   java使MySQL查询更快   java MappedByteBuffer查询   java递归算法问题