资讯专栏INFORMATION COLUMN

zeromq的三种简单模式(python实现)

lufficc / 1095人阅读

摘要:的明确目标是成为标准网络协议栈的一部分,之后进入内核。实现端测试消息已发送端正在转发端输出结果已发送已发送已发送正在转发正在转发正在转发测试消息测试消息测试消息

简介
ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD 套接字之上的一层封装。ZMQ 让编写高性能网络应用程序极为简单和有趣。

zeromq 并不是类似rabbitmq消息列队,它实际上只一个消息列队组件,一个库。

zeromq的几种模式 Request-Reply模式:

客户端在请求后,服务端必须回响应

Python实现:
server端:

# -*- coding=utf-8 -*-
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    message = socket.recv()
    print("Received: %s" % message)
    socket.send("I am OK!")

client端:

# -*- coding=utf-8 -*-

import zmq
import sys

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

socket.send("Are you OK?")
response = socket.recv();
print("response: %s" % response)

输出:

$ python app/server.py 
Received: Are you OK?

$ python app/client1.py 
response: I am OK!
Publish-Subscribe模式:

广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。

Python实现
server端:

# -*- coding=utf-8 -*-
import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555")

while True:
    print("发送消息")
    socket.send("消息群发")
    time.sleep(1)    

client端1:

# -*- coding=utf-8 -*-

import zmq
import sys

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.setsockopt(zmq.SUBSCRIBE,"")  # 消息过滤
while True:
    response = socket.recv();
    print("response: %s" % response)

client端2:

# -*- coding=utf-8 -*-

import zmq
import sys

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.setsockopt(zmq.SUBSCRIBE,"") 
while True:
    response = socket.recv();
    print("response: %s" % response)

输出:

$ python app/server.py 
发送消息
发送消息
发送消息

$ python app/client2.py 
response: 消息群发
response: 消息群发
response: 消息群发

$ python app/client1.py 
response: 消息群发
response: 消息群发
response: 消息群发
Parallel Pipeline模式:

由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。

当连接被断开,数据不会丢失,重连后数据继续发送到对端。

Python实现

server端:

# -*- coding=utf-8 -*-
import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5557")

while True:
    socket.send("测试消息")
    print "已发送"    
    time.sleep(1)    

work端:

# -*- coding=utf-8 -*-

import zmq

context = zmq.Context()

recive = context.socket(zmq.PULL)
recive.connect("tcp://127.0.0.1:5557")

sender = context.socket(zmq.PUSH)
sender.connect("tcp://127.0.0.1:5558")

while True:
    data = recive.recv()
    print "正在转发..."
    sender.send(data)

client端:

# -*- coding=utf-8 -*-

import zmq
import sys

context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind("tcp://*:5558")

while True:
    response = socket.recv();
    print("response: %s" % response)

输出结果:

$ python app/server.py 
已发送
已发送
已发送

$ python app/work.py 
正在转发...
正在转发...
正在转发...

$ python app/client1.py
response: 测试消息
response: 测试消息
response: 测试消息

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44472.html

相关文章

  • 初探ZeroMQ

    摘要:关闭套接字和上下文备注说明如何利用使用首先下载所需的包,解压以后将和文件放到自己电脑中的安装路径中的文件夹下,最后需要将之前解压后的包放在项目的中或者资源下载链接密码项目源码下载链接链接密码 在讲ZeroMQ前先给大家讲一下什么是消息队列。 消息队列简介: 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是...

    Harriet666 评论0 收藏0
  • 初探ZeroMQ

    摘要:关闭套接字和上下文备注说明如何利用使用首先下载所需的包,解压以后将和文件放到自己电脑中的安装路径中的文件夹下,最后需要将之前解压后的包放在项目的中或者资源下载链接密码项目源码下载链接链接密码 在讲ZeroMQ前先给大家讲一下什么是消息队列。 消息队列简介: 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是...

    lentoo 评论0 收藏0
  • python之单例模式实现三种方式

    摘要:输出结果输出结果此外还有两种实现单例的方式,我呢也给大家列出来,方便大家学习和参考方式一方式二单例模式实现方式二。。。 什么是单例模式?通俗点讲:单例模式就是在程序执行的过程中,类只有一个实例,这不是说单例模式只能去创建一个实例,而是你创建的所有实例(也就是对象)都指的是同一个实例。如何做到这一点呢?我们的__new__特殊方法就派上用场了,可能大家对这个方法熟悉又陌生,那么接下来通过...

    dack 评论0 收藏0
  • 关于k8s集群容器日志收集的总结

    摘要:我推荐你使用进行日志收集,将作为的出口。集群目前暂时没有提供日志查看机制。以如下的形式启动容器,容器日志将发往配置的。 【作者barnett】本文介绍了k8s官方提供的日志收集方法,并介绍了Fluentd日志收集器并与其他产品做了比较。最后介绍了好雨云帮如何对k8s进行改造并使用ZeroMQ以消息的形式将日志传输到统一的日志处理中心。 容器日志存在形式 目前容器日志有两种输出形式: ...

    jeffrey_up 评论0 收藏0
  • 关于k8s集群容器日志收集的总结

    摘要:我推荐你使用进行日志收集,将作为的出口。集群目前暂时没有提供日志查看机制。以如下的形式启动容器,容器日志将发往配置的。 【作者barnett】本文介绍了k8s官方提供的日志收集方法,并介绍了Fluentd日志收集器并与其他产品做了比较。最后介绍了好雨云帮如何对k8s进行改造并使用ZeroMQ以消息的形式将日志传输到统一的日志处理中心。 容器日志存在形式 目前容器日志有两种输出形式: ...

    or0fun 评论0 收藏0

发表评论

0条评论

lufficc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<