创建分布式asgi应用程序,从中心redis队列中提取事件。
distributed-asgi的Python项目详细描述
分布式asgi
使用redis在基于路由的工作asgi应用程序之间分发asgi消息。工人可以在不同的机器上,他们只需要能够连接到中央redis服务器。
用法
路由由两部分组成:匹配路径的正则表达式和用于形成asgi事件被推送到的键的键模板字符串。
密钥模板也可以使用带编号的regex反斜杠替换。例如,路由{"/api/([a-z-]+)":r"API-\1"}
将匹配并生成以下密钥:
PATH KEY
/api/test API-test
/api/test/38 API-test
/api/banana API-banana
/test/api/test2 API-test2
下面是一个示例:
# distributor.pyfromdistributed_asgiimportcreate_path_distributorapp=create_path_distributor(host="mywebsite.com",# point to redis serverport=6379,db=0,password="abc123",routes={"/api/([a-z-]+)":r"ASGI-\1","/worker/([0-9]+)":r"worker-queue-\1","/":"ALL-WEBSITE-TRAFFIC"})
要真正利用这一点,我们需要让一个工人监听一个或多个键
# worker.pyfromdistributed_asgiimportNodeclassASGIApp:def__init__(self,scope):self.scope=scopeasyncdef__call__(self,receive,send):awaitsend({"type":"http.response.start","status":200})awaitsend({"type":"http.response.body","body":b"Hello World!"})node=Node(host="mywebsite.com",port="6379",password="abc123",cls=ASGIApp,key='ASGI-testing')print(f"Starting worker")node.run()
一旦你有了worker.py
和server.py
,使用一些接口服务器来运行distributor.py
。
$ uvicorn server:App
作为一个普通的python脚本运行worker.py
:
$ python worker.py
工作进程将只使用包含/api/testing
的路径响应http请求,因为这是我们告诉它要侦听的唯一密钥。
如果没有工人怎么办?
如果没有节点实例监听分发服务器将事件推送到的密钥,则分发服务器将在5秒后超时,关闭连接,并返回405错误。worker不需要在5秒内响应,node类会自动让分发服务器知道至少有一个worker在监听。