majortomo-zmq mdp 0.2(majordomo)python实现
majortomo的Python项目详细描述
少校
Majortomo是纯PythonZeroMQ MDP 0.2 (“Majordomo”)实施。它提供了一个随时可用的mdp服务代理, 以及一个用于实现mdp客户机和工作者的python 2.7/3.5+库 只有几行代码。
mdp/majordomo是一个用于实现高度可伸缩、轻量级 位于ZeroMQ之上的面向服务的消息传递。它是非常 例如,有助于促进不同 以可扩展、健壮和容错的方式提供微服务。
安装
快速启动
经营经纪人
使用mdp worker公开服务
使用MDP客户端使用服务
完整文档
项目文档可在此处获得:https://majortomo.readthedocs.io/en/latest/
用法
经营经纪人
在大多数情况下,可以按原样使用mdp代理,只需使用 右命令行参数。您可以使用 码头工人:
# 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
运行代理以获得更多命令行选项。
当然,您也可以使用Python3.5及更高版本直接运行代理:
$ python -m majortomo.broker --help
请注意,这需要使用项目设置虚拟环境 依赖项,如下所述
使用客户端和工作模块安装&;eh3>
待定
使用客户端类
有关示例客户端实现,请参见majortomo.echo
。
通常应该直接使用Client
类(不使用子类)来
向代理(和工人)发送请求
打开和关闭客户端连接
当一个较低级别的api可用时(通过connect
,is_connected
,
以及close
),管理到代理的连接最容易通过
上下文管理器协议:
withClient(broker_url='tcp://127.0.0.1:5555')asclient: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
回复后:
forpartinclient.recv_all(timeout=5.0):do_something_with_reply_part(part)
Note:本例中的timeout
参数与应答之间的时间有关
分块,而不是在FINAL
之前接收整个回复所需的时间。
recv_all_as_list(timeout: float=None) -> List[bytes]
返回来自所有回复部分的所有消息帧的简单列表不管
工作进程发送了多少个PARTIAL
回复,直到FINAL
回复为止,
此方法将始终返回一个一维列表bytes
,其中
信息帧。
超时和重试
客户端的所有recv_*
方法都会收到一个timeout
参数,该参数应该
指定等待响应的秒数(应为float
所以你也可以指定第二个分数)如果未指定timeout
,
函数将等待R.
一旦recv_*
超时,一个majortomo.error.Timeout
将
被抚养成人。有时捕获此异常并重试
重新连接到代理后的操作:
whileTrue:withClient(broker_url='tcp://127.0.0.1:5555')asclient:try:client.send(b'my-service',b'frame1',b'frame2')reply=client.recv_all_as_list(timeout=10.0)breakexceptmajortomo.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 scopewhileTrue:try:client.send(b'my-service',b'frame1',b'frame2')reply=client.recv_all_as_list(timeout=10.0)breakexceptmajortomo.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创建和维护的
团队,并根据Apache2.0许可证的条款分发
(见LICENSE
)。
Majortomo(C)版权所有2018 Shoppimon有限公司
ØMQ版权所有(c)2007-2014 iMatix公司和贡献者