介绍
有很多方法可以选择描述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