如何使用ZeroMQ消息库工作

介绍

有很多方法可以选择描述ZeroMQ;然而,它仍然是真正的是:一个真正出色的通信库,其丰富和成熟的功能集大大有利于开发人员。 在第二部分的DigitalOcean ZeroMQ文章中,按照我们前面关于应用程序的安装,我们将深入其使用,并发现实际实现这个快速和强大的库的方法。我们将通过分成连续部分的各种示例来开始,从进程之间的简单消息(即,使用请求/响应模式)开始。 注:本文构成了我们关于这个问题的第二片。 如果您有兴趣了解更多关于它的(即它是什么以及如何比较完整的消息代理),检查了 ZeroMQ简介和安装操作指南阅读本教程之前。

关于

ZeroMQ

ZeroMQ是一个库,用于实现应用程序和进程之间的消息传递和通信系统 - 快速和异步。 如果您有过其他应用消息传递解决方案(如RabbitMQ)的经验,了解ZeroMQ的确切位置可能有点具有挑战性。 当与一些更大的项目(它们提供企业消息传送的所有必要部分)相比时,ZeroMQ仍然是一个轻量级和快速的工具来制作您自己的。

本文

虽然技术上不是一个框架,考虑到它的功能和它解决的任务的关键位置,你可以考虑ZeroMQ是实现应用程序的实际通信层的骨干。 在这篇文章中,我们旨在为您提供一些例子与所有 能做的事情来激励你。
注意:我们将使用Python语言和我们的例子中其经典的解释器(Python的C解释)合作。 安装必要的语言绑定后,您应该能够简单地翻译代码,并使用您的喜好,而没有任何问题。 如果您想了解有关在CentOS的VPS安装Python,看看我们 如何设置的Python 2.7在CentOS 6.4教程。

使用ZeroMQ编程

ZeroMQ作为库通过遵循某些网络通信模式通过套接字工作。它设计为异步工作,这就是其名称的MQStapling - 来自在发送它们之前的线程排队消息。

ZeroMQ套接字类型

ZeroMQ的插座工作方式不同。与常规套接字工作的同步方式不同,ZeroMQ的套接字实现“呈现异步消息队列的抽象”。 这些套接字的工作方式取决于所选择的套接字类型。并且发送的消息流取决于所选择的模式,其中有四种:
  • 请求/应答模式:用于发送请求和接收回复以后为每一个发送。
  • 发布/订阅模式:用于从一个单一的过程(如发布者)给多个收件人(如用户)分布数据。
  • 管道模式:用于分发数据连接的节点。
  • 独家配对模式:用于连接两个同龄人在一起,形成一对。

ZeroMQ传输类型

ZeroMQ提供四种不同类型的通信传输。这些是:
  • 在制品(INPROC):本地(进程)通信传输。
  • 进程间(IPC):本地(进程间)通信传输。
  • TCP:使用TCP单播通信传输。
  • PGM:PGM使用多播通信传输。

构造ZeroMQ应用程序

ZeroMQ与典型和传统的通信设置不同。它可以有链接的任一侧(即服务器或客户端)绑定并等待连接。与标准套接字不同,ZeroMQ的工作原理是知道连接可能发生,因此可以完全等待。

客户端 - 服务器结构

对于构建客户端和服务器端的代码,这将是最好的决定,选出一个作为 绑定方和其他(S)作为 连接更稳定。 例:
Server Application                           Client Application
---------------------[ < .. < .. < .. < .. ......................
Bound -> Port:8080                          Connects <- Port:8080

客户端 - 代理 - 服务器结构

为了解决由于通信的两端处于动态(因此不稳定)状态所引起的问题,ZeroMQ提供网络设备(即,开箱即用的器具)。这些设备连接到两个不同的端口并路由连接。
  • 横批:为流水线并行通信流光设备。
  • 转发:发布/订阅通信转发设备。
  • 队列:为请求/应答通信转发设备。
例:
   Server App.            Device | Forward           Client App.
  ............ > .. > . ]------------------[ < .. < .. .........
    Connects               2 Port Binding             Connects

编程示例

使用我们过去部分的知识,我们现在将开始利用它们来创建简单的应用程序。 注意:下面的例子通常包括同时运行的应用程序。 例如,要使客户端/服务器设置工作,您将需要同时运行客户端和服务器应用程序。 执行此操作的一种方法是使用Linux Screen工具。 要了解更多关于它,看看这个 DigitalOceanTutorial 。 要在CentOS系统上安装屏幕,请记住,你可以简单地运行: yum install -y screen

使用请求/回复模式的简单消息传递

在应用程序之间的通信方面,请求/应答模式可能形成绝对经典,并为我们提供了一个从ZeroMQ的基本基础开始的好机会。 用例:
  • 用于服务器和客户端之间的简单通信。
  • 检查信息并请求更新。
  • 发送检查并更新到服务器。
  • echo或ping / pong实现。
使用的插座类型:
  • zmq.REP
  • zmq.REQ

服务器示例:server.py

创建一个“server.py”采用 纳米nano server.py ),并粘贴以下不言自明的内容。
import zmq

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
sock = context.socket(zmq.REP)
sock.bind("tcp://127.0.0.1:5678")

# Run a simple "Echo" server
while True:
    message = sock.recv()
    sock.send("Echo: " + message)
    print "Echo: " + message
完成编辑后,按CTRL + X,然后按Y保存和e xit。

客户端示例:client.py

创建一个“client.py”采用 纳米nano client.py ),并粘贴以下内容。
import zmq
import sys

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
sock = context.socket(zmq.REQ)
sock.connect("tcp://127.0.0.1:5678")

# Send a "message" using the socket
sock.send(" ".join(sys.argv[1:]))
print sock.recv()
完成编辑后,按CTRL + X,然后按Y保存并退出。 注意:当使用ZeroMQ库时,请记住每个线程用于发送邮件(即 .send(..)预计一 .recv(..)跟随。未能实现该对将导致异常。

用法

我们 server.py被设定为“呼应”应用程序工作。 无论我们选择发送给它,它会发送回(如“echo: 消息 ”)。 使用Python解释器运行服务器:
python server.py
在另一个窗口中,使用客户端应用程序发送消息:
python client.py hello world!
# Echo: hello world!
注意:要关闭服务器,则可以使用组合键:Ctrl + C键

使用发布/预订模式

在发布/订阅图案的情况下,ZeroMQ用于建立一个或多个用户,在连接到一个或多个发布和连续地接收什么出版商发送(或 种子 )。 指定前缀以仅接受以此开头的此类消息的选项可用于此模式。 用例: 发布/订阅模式用于跨各种消费者均匀分发消息。自动更新记分板和新闻可以被视为使用此解决方案的可能区域。 使用的插座类型:
  • zmq.PUB
  • zmq.SUB

发布商示例:pub.py

创建一个“pub.py”采用 纳米nano pub.py ),并粘贴以下内容。
import zmq
import time

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
sock = context.socket(zmq.PUB)
sock.bind("tcp://127.0.0.1:5680")

id = 0

while True:
    time.sleep(1)
    id, now = id+1, time.ctime()

    # Message [prefix][message]
    message = "1-Update! >> #{id} >> {time}".format(id=id, time=now)
    sock.send(message)

    # Message [prefix][message]
    message = "2-Update! >> #{id} >> {time}".format(id=id, time=now) 
    sock.send(message)

    id += 1
完成编辑后,按CTRL + X,然后按Y保存并退出。

订阅者示例:sub.py

创建一个“sub.py”采用 纳米nano sub.py ),并粘贴以下内容。
import zmq

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
sock = context.socket(zmq.SUB)

# Define subscription and messages with prefix to accept.
sock.setsockopt(zmq.SUBSCRIBE, "1")
sock.connect("tcp://127.0.0.1:5680")

while True:
    message= sock.recv()
    print message
完成编辑后,按CTRL + X,然后按Y保存并退出。 注意:使用 .setsockopt(..)的过程中,我们订阅接收开始用 绳子消息 1 。 接收所有,离开它没有设置(即 ""

用法

我们 pub.py设定为 发布商合作,发送两个不同的消息-同时-用于不同用户。 运行发布者发送消息:
python pub.py
在另一个窗口,看到订阅内容的打印输出(即 1 ):
python sub.py!
# 1-Update! >> 1 >> Wed Dec 25 17:23:56 2013
注意:要关闭用户和发行商的应用程序,你可以使用组合键:Ctrl + C键

管道发布/与管道模式(推/拉)

它非常类似于发布/订阅模式,第三行管道模式作为一种解决方案的不同类型的问题:按需分发消息。 用例: 流水线模式可以在需要有排队的产品清单进行路由(即行 )的一个要求它(即那些谁 )的情况下使用。 使用的插座类型:
  • zmq.PUSH
  • zmq.PULL

PUSH示例:manager.py

创建一个“manager.py”采用 纳米nano manager.py ),并粘贴以下内容。
import zmq
import time

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
sock = context.socket(zmq.PUSH)
sock.bind("tcp://127.0.0.1:5690")

id = 0

while True:
    time.sleep(1)
    id, now = id+1, time.ctime()

    # Message [id] - [message]
    message = "{id} - {time}".format(id=id, time=now)

    sock.send(message)

    print "Sent: {msg}".format(msg=message)
该文件 manager.py将作为一个 任务分配器

PULL示例:worker_1.py

创建“工人 1.py”采用纳米 (纳米`工人 1.py`),并粘贴以下内容。 import zmq
# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
sock = context.socket(zmq.PULL)
sock.connect("tcp://127.0.0.1:5690")

while True:
    message = sock.recv()
    print "Received: {msg}".format(msg=message)
该文件 worker_1.py将作为 任务进程 (消费者/工人)。

用法

我们 manager.py被设置为具有任务的分配器(即经理)的作用, ING的项目。 同样, worker_1.py设置为 职工实例收到这些物品,当它通过 上拉 ING在列表中向下做处理工作。 运行发布者发送消息:
python manager.py
在另一个窗口,看到订阅内容的打印输出(即 1 ):
python worker_1.py!
# 1-Update! >> 1 >> Wed Dec 25 17:23:56 2013
注意:要关闭用户和发行商的应用程序,你可以使用组合键:Ctrl + C键

独占对模式

独家双模式意味着,允许建立一个音调排序使用通信信道的 zmq/PAIR插槽类型。

绑定示例:bind.py

创建一个“bind.py”采用 纳米nano bind.py ),并粘贴以下内容。
import zmq

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
socket = context.socket(zmq.PAIR)
socket.bind("tcp://127.0.0.1:5696")
完成编辑后,按CTRL + X,然后按Y保存并退出。

连接示例:connect.py

创建一个“connect.py”采用 纳米nano connect.py ),并粘贴以下内容。
import zmq

# ZeroMQ Context
context = zmq.Context()

# Define the socket using the "Context"
socket = context.socket(zmq.PAIR)
socket.connect("tcp://127.0.0.1:5696")
完成编辑后,按CTRL + X,然后按Y保存并退出。

用法

您可以使用上述示例创建任何双向单向通信应用程序。 注:要么关机,你可以使用组合键:Ctrl + C键
:提交 OS Tezer
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏