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之上的面向服务的消息传递。它是非常 例如,有助于促进不同 以可扩展、健壮和容错的方式提供微服务。

Build StatusDocumentation Status

安装

快速启动

经营经纪人

使用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可用时(通过connectis_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时间 它们之间使用某种指数退避重试库,例如 backoffredo

实施MDP工人

请参见majortomo.echo以获取示例工作机实现

更多详细信息待定

版权和信用

majortomo是由Shoppimon创建和维护的 团队,并根据Apache2.0许可证的条款分发 (见LICENSE)。

Majortomo(C)版权所有2018 Shoppimon有限公司

ØMQ版权所有(c)2007-2014 iMatix公司和贡献者

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

推荐PyPI第三方库


热门话题
java如何读取、验证和移动数据。csv文件?   用于在线蛇游戏的java解析scaing   java JavaFX:在窗口上移动元素(阶段)调整大小   mysql如何使用java中的IOUtils包在jsp中显示多个图像?   Java dateFormat不可解析日期异常   spring mvc java。执行单元测试时lang.AssertionError   java在一个webapp中运行多个调度器有什么问题吗?   JAVAlang.ArrayIndexOutofBounds异常:1未来。get()多线程   java使用MDC或spring boot中的任何过滤器屏蔽日志消息中的密码,而不使用logback。xml文件   与应用服务器的java AJP和SSL通信   java Hibernate更新列表中的特定对象   Java小程序:使用keylistener移动多边形   java访问是一个独立于MainActivity的进程   来自服务器的java重复密钥或完整性约束冲突消息:“列“volume”不能为null”   java是否有任何方法可以确保在Flink on job cancel with savepoint上通知所有检查点侦听器检查点完成?