跳转到主要内容

Majortomo - ZMQ MDP 0.2 (Majordomo) Python实现

项目描述

Majortomo

Majortomo 是一个纯Python实现的 ZeroMQ MDP 0.2 ("Majordomo")。它提供了一个现成的MDP服务代理,以及一个Python库,只需几行代码即可实现MDP客户端和工作进程。

MDP / Majordomo 是一个在 ZeroMQ 上实现高度可扩展、轻量级面向服务的消息传递协议。它非常有用,例如,可以以可扩展、健壮和容错的方式促进不同微服务之间的通信。

Build Status Documentation Status PyPI version

安装

注意:从版本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可用(通过 connectis_connectedclose),但通过上下文管理器协议管理到代理的连接是最容易的。

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 时间,例如 backoffredo

实现MDP工作者

请参阅 majortomo.echo 以获取示例工作者实现

更多详细信息待定

版权与致谢

Majortomo 由 Shoppimon 团队创建并维护,并根据 Apache 2.0 许可证分发(请参阅 LICENSE)。

Majortomo 版权所有 (C) 2018 Shoppimon LTD。

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

项目详情


下载文件

下载适用于您平台的文件。如果您不确定该选择哪个,请了解更多关于 安装软件包 的信息。

源分发

majortomo-0.2.0.tar.gz (17.2 kB 查看哈希值)

上传时间 源代码

构建分发

majortomo-0.2.0-py3-none-any.whl (25.4 kB 查看哈希值)

上传时间 Python 3

由以下组织支持