Majortomo - ZMQ MDP 0.2 (Majordomo) Python实现
项目描述
Majortomo
Majortomo 是一个纯Python实现的 ZeroMQ MDP 0.2 ("Majordomo")。它提供了一个现成的MDP服务代理,以及一个Python库,只需几行代码即可实现MDP客户端和工作进程。
MDP / Majordomo 是一个在 ZeroMQ 上实现高度可扩展、轻量级面向服务的消息传递协议。它非常有用,例如,可以以可扩展、健壮和容错的方式促进不同微服务之间的通信。
安装
注意:从版本0.2开始,Majortomo不再支持低于3.6的Python版本,包括Python 2.7。如果您需要使用较旧的Python版本,请将Majortomo安装版本锁定为0.1.x,但请注意,这些版本将不会发布任何修复。
安装Majortomo最简单的方式是通过 pip
$ pip install majortomo
如果您只想运行MDP代理,例如,如果您已经用某些其他语言/库实现了MDP的工作进程和客户端,您可以简单地运行Docker镜像而无需安装任何Python包
# This doesn't actually work yet, but will at some point...
# $ docker run shoppimon/majortomo-broker:latest
快速入门
运行代理
使用MDP工作进程公开服务
使用MDP客户端消费服务
完整文档
项目文档可在此处找到: https://majortomo.readthedocs.io/en/latest/
用法
运行代理
在大多数情况下,MDP代理可以直接使用,只需使用正确的命令行参数运行即可。您可以通过使用Docker构建和运行它来完成此操作
# Build the Docker image
$ docker build -t shoppimon/mdp-broker -f mdp-broker/Dockerfile .
# Run the broker from Docker
$ docker run --rm -ti shoppimon/mdp-broker -b tcp://0.0.0.0:5555 --verbose
您可以使用 --help
运行代理以获取更多命令行选项。
当然,您也可以使用Python 3.5及以上版本直接运行代理
$ python -m majortomo.broker --help
请注意,这需要设置一个虚拟环境并配置项目依赖关系,以下将进行描述。
安装和使用客户端和工作者模块
待定
使用客户端类
请参阅 majortomo.echo
以获取示例客户端实现。
通常应直接使用 Client
类(而不进行子类化)来向代理(和工作者)发送请求。
打开和关闭客户端连接
尽管有低级API可用(通过 connect
、is_connected
和 close
),但通过上下文管理器协议管理到代理的连接是最容易的。
with Client(broker_url='tcp://127.0.0.1:5555') as client:
client.send(b'my-service', b'frame1', b'frame2')
reply = client.recv_all_as_list(timeout=10.0)
上述示例会根据需要打开和关闭ZeroMQ套接字。
注意:ZeroMQ会自动重新创建丢失的TCP连接并等待尚未绑定的对等方。
发送请求和接收回复
要发送请求,请使用 send
方法
client.send(service_name, frame1, frame2, frame3)
此方法将服务名称(作为 bytes
)作为第一个参数。所有其他参数都作为消息帧发送 - MDP协议支持向代理发送包含多个帧的请求。这些帧的内容是应用程序相关的,由您决定。
一旦发送了请求,您就必须读取从代理返回的整个回复(或如果您想重试,请关闭到代理的连接并重新连接)。
根据您的需求,有多种读取回复的方法
recv_part(timeout: float=None) -> Optional[List[bytes]]
从代理接收一个回复部分(一个回复部分是字节列表,因为它可能包含多个ZeroMQ帧)。
如果没有更多的部分可用(即最后一个部分是 FINAL
回复),将返回 None
。
recv_all(timeout: float=None) -> Iterable[List[bytes]]
返回一个迭代器,它产生每个接收到的消息部分,并在收到 FINAL
回复后退出。
for part in client.recv_all(timeout=5.0):
do_something_with_reply_part(part)
注意:在这种情况下,timeout
参数与回复块之间的时间相关,而不是接收整个回复直到 FINAL
所需的时间。
recv_all_as_list(timeout: float=None) -> List[bytes]
返回所有回复部分中所有消息帧的扁平列表。无论工作者在发送 FINAL
回复之前发送了多少个 PARTIAL
回复,此方法始终返回一个包含消息帧的单维 bytes
列表。
超时和重试
客户端的所有 recv_*
方法都接受一个 timeout
参数,该参数应指定等待响应的秒数(期望一个 float
,因此您可以指定秒的小数部分)。如果没有指定超时,则函数将无限期等待。
一旦 recv_*
超时,将引发 majortomo.error.Timeout
。有时捕获此异常并在重新连接到代理后重试操作是有用的。
while True:
with Client(broker_url='tcp://127.0.0.1:5555') as client:
try:
client.send(b'my-service', b'frame1', b'frame2')
reply = client.recv_all_as_list(timeout=10.0)
break
except majortomo.error.Timeout:
logging.warning("Timed out waiting for a reply from broker, reconnecting")
time.sleep(1.0)
continue
或者,如果您不想依赖上下文管理器进行重连(例如,如果上下文在外部作用域中管理)
# Here `client` is passed from an outer scope
while True:
try:
client.send(b'my-service', b'frame1', b'frame2')
reply = client.recv_all_as_list(timeout=10.0)
break
except majortomo.error.Timeout:
logging.warning("Timed out waiting for a reply from broker, reconnecting")
time.sleep(1.0)
client.connect(reconnect=True)
continue
更好的是,建议使用某种指数退避和重试库来管理重试次数和它们之间的 sleep
时间,例如 backoff 或 redo
实现MDP工作者
请参阅 majortomo.echo
以获取示例工作者实现
更多详细信息待定
版权与致谢
Majortomo 由 Shoppimon 团队创建并维护,并根据 Apache 2.0 许可证分发(请参阅 LICENSE
)。
Majortomo 版权所有 (C) 2018 Shoppimon LTD。
ØMQ 版权所有 (c) 2007-2014 iMatix Corporation 和贡献者。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定该选择哪个,请了解更多关于 安装软件包 的信息。