`

zeromq实现服务器间高性能通信

阅读更多

ZeroMQ 是一个很有个性的项目,它原来是定位为“史上最快消息队列”,所以名字里面有“MQ”两个字母,但是后来逐渐演变发展,慢慢淡化了消息队列的身影,改称为消息内核,或者消息层了。从网络通信的角度看,它处于会话层之上,应用层之下,有了它,你甚至不需要自己写一行的socket函数调用就能完成复杂的网络通信工作。

一、三种基本模式

zeromq 有多种模式,常用的有三种:请求应答模式、订阅发布模式、push pull模式 。

1. 请求应答模式(req 和 rep)

消息双向的,有来有往,req端请求的消息,rep端必须答复给req端

2. 订阅发布模式 (sub 和 pub)

消息单向的,有去无回的。可按照发布端可发布制定主题的消息,订阅端可订阅喜欢的主题,订阅端只会收到自己已经订阅的主题。发布端发布一条消息,可被多个订阅端同事收到。

3. push pull模式

消息单向的,也是有去无回的。push的任何一个消息,始终只会有一个pull端收到消息.

后续的代理模式和路由模式等都是在三种基本模式上面的扩展或变异。

4.阻塞 和 非阻塞

以上三种基本模式都支持阻塞模式和非阻塞模式。req 和 rep的阻塞模式是这样的(其实跟原生的socket实现也非常像)。大家用过socket的,客户端要是先启动的话,会连接失败,或者是短时间内有超时问题。

二、示例代码

如果使用ActiveMQ/RabbitMQ之类的有代理MQ系统,只要保证MQ代理最先启动, 就可以保证系统的正常运行。而对于无代理的ZeroMQ来说,似乎比较难办。 在刚刚开始使用ZeroMQ时,我也一直担心这个问题,总是小心翼翼地首先启动调 用bind指令的程序,然后启动执行connect指令的程序。这样其实只是利用了 ZeroMQ的高速数据传输能力,以及ZeroMQ对IPC和socket的良好封装特性,还是 没有解决进程启动顺序的问题。后来,偶然实验了一下,发现bind程序和 connect程序无论谁先启动,其实都不影响整个系统的正常运行。

req-rep.png

服务端

  1. import zmq
  2. context = zmq.Context()
  3. # Socket to talk to server
  4. print"Connecting to hello world server…"
  5. socket = context.socket(zmq.REQ)
  6. socket.connect ("tcp://localhost:5555")
  7. # Do 10 requests, waiting each time for a response
  8. for request in range (10):
  9. print"Sending request ", request,"…"
  10. socket.send ("Hello")
  11. # Get the reply.
  12. message = socket.recv()
  13. print"Received reply ", request,"[", message,"]"

客户端

 

  1. import zmq
  2. import time
  3. context = zmq.Context()
  4. socket = context.socket(zmq.REP)
  5. socket.bind("tcp://*:5555")
  6. whileTrue:
  7. # Wait for next request from client
  8. message = socket.recv()
  9. print"Received request: ", message
  10. # Do some 'work'
  11. time.sleep (1)# Do some 'work'
  12. # Send reply back to client
  13. socket.send("World")

sub-pub.png

可以看出发布者绑定绑定一个端口,订阅者通过连接发布者接受订阅的消息。这里的Publish-Subscribe模型是一个很典型的PUB-SUB模型,即发布者(Publisher)只能发送数据,它发送时指明发送数据的类型,而订阅者(Subscriber)则只接收它关心的类型的消息

1. pub/sub模式下,sub事实上可以连接多个pub,每次只连接一个connect,所以接收到的消息可以是叫错的,以至于不会单个pub掩盖了其他pub

2. 如果存在某个pub没有被任何sub连接,则该pub会丢弃所有的消息

3. 如果你采用tcp的连接方式,sub很慢,消息将会堆积在pub,后期会对该问题有个较好的解决

4. 目前的而版本,过滤发生在sub端,而不是pub端,意思就是说一个pub会发送所有的消息到所有的sub, 由sub决定是要drop这个msg.

zeromq是lib库,部署完成后可自行编写server和client,编译时指定-lzmq即可

为题提高性能 可以用gevent框架:

  1. import gevent
  2. from gevent_zeromq import zmq
  3. # Global Context
  4. context = zmq.Context()#它是GreenContext的一个简写,确保greenlet化socket
  5. def server():
  6. server_socket = context.socket(zmq.REQ)#创建一个socket,使用mq类型模式REQ/REP(请求/回复,服务器是请求),还有PUB/SUB(发布/订阅),push/pull等
  7. server_socket.bind("tcp://127.0.0.1:5000")#绑定socket
  8. for request in range(1,10):
  9. server_socket.send("Hello")
  10. print('Switched to Server for ', request)
  11. server_socket.recv()#这里发生上下文切换
  12. def client():
  13. client_socket = context.socket(zmq.REP)(客户端是回复)
  14. client_socket.connect("tcp://127.0.0.1:5000")#连接server的socket端口
  15. for request in range(1,10):
  16. client_socket.recv()
  17. print('Switched to Client for ', request)
  18. client_socket.send("World")
  19. publisher = gevent.spawn(server)
  20. client = gevent.spawn(client)
  21. gevent.joinall([publisher, client])

 

分享到:
评论

相关推荐

    ZeroMQ-云时代极速消息通信库

    2. **轻量级**:ZeroMQ不需要额外的服务器进程或数据库支持,只需简单的客户端和服务器即可实现通信。这降低了系统的复杂性,使得部署和维护更加容易。 3. **模式化通信**:支持多种消息模式,如发布/订阅(Publish...

    ZeroMQ云时代极速消息通信库PDF带书签目录高清版

    2. **高性能通信**:ZeroMQ通过零拷贝技术(Zero-Copy)和高效的内存管理,实现了数据传输的高速度和低开销。零拷贝减少了CPU在内存操作中的工作量,提高了系统性能。 3. **可伸缩性**:ZeroMQ的设计使得它可以轻松...

    ZeroMQ 云时代极速消息通信库(完整版)

    1. 高速消息通信:ZeroMQ可以实现进程间(Inter-Process Communication, IPC)、线程间(Inter-Thread Communication, ITC)以及节点间(Node-to-Node Communication)的低延迟消息传递。其设计允许消息在发送者和...

    ZeroMQ 实现服务端,客户端范例1

    ZeroMQ 是一个高性能的轻量级消息中间件,它提供了多种类型的套接字,使得开发者可以轻松地构建分布式计算系统。ZeroMQ 不仅仅是一个网络库,它还抽象出了一种高级的消息模式,如请求-响应模式、发布-订阅模式、推送...

    ZeroMQ 云时代极速消息通信库

    ZeroMQ(又称0MQ)就是这样一款优秀的开源库,它为开发者提供了一种高性能、轻量级且模式灵活的消息传递机制,广泛应用于云计算环境。 **1. ZeroMQ简介** ZeroMQ,源自 CZMQ 项目,是一个跨平台的开源消息中间件,...

    C# zeromq 功能实现

    ZeroMQ,也被称为 ØMQ 或 0MQ,是一个高性能、轻量级的消息中间件,它提供了一种灵活的消息模式,可以用于构建分布式应用程序。在C#环境中,ZeroMQ提供了丰富的功能,允许开发人员轻松地实现高效的消息传递。本文将...

    zeromq的Android简单实现

    ZeroMQ,又称为0MQ,是一个高性能、轻量级的消息队列库,它为分布式计算提供了灵活高效的通信机制。在Java环境中,我们可以利用ZeroMQ进行跨平台的消息传递,并且在Android平台上也有应用。本文将详细介绍如何在...

    zeromq+qt通信源码

    zeromQ,全称为“ZeroMQ”,是一个高性能的开源消息中间件,它提供了一种灵活的、点对点的通信模式,可以用于构建分布式应用。zeromQ的核心概念是消息队列,它允许进程之间异步通信,即使这些进程可能位于不同的网络...

    ZeroMQ 云时代极速消息通信库 PDF电子书下载 带书签目录 完整版

    通过学习这本书,你可以了解如何在C#项目中集成ZeroMQ,实现高性能的消息通信,包括: 1. **安装与配置**:学习如何在C#项目中添加ZeroMQ的NuGet包,配置相关设置,以及如何进行基本的错误处理。 2. **创建上下文...

    ZeroMQ 云时代极速消息通信库高清

    “ZeroMQ 云时代极速消息通信库”深入介绍了如何利用ZeroMQ构建高性能、高可用的云环境通信系统。无论你是开发者、系统架构师还是云技术爱好者,理解并掌握ZeroMQ都能极大地提升你的工作效率和系统质量。通过阅读...

    一个简单的ZeroMQ通信程序Demo

    ZeroMQ,也称为0MQ或ØMQ,是一个高性能的开源消息中间件,它提供了一种灵活的、异步的消息传递模式。在这个“一个简单的ZeroMQ通信程序Demo”中,我们将会探讨如何使用ZeroMQ实现一个基础的客户端(client)与...

    zeromq 云时代极速消息通信库

    ZeroMQ的主要设计目标是提供一个高性能的通信机制,让不同节点上的应用能够通过消息的发送和接收来进行通信。 ### 云时代的通信需求 在云时代,随着分布式计算和微服务架构的广泛采用,应用程序需要快速且可靠地在...

    基于ZeroMQ的分布式系统通信方法.pdf

    在论文“基于ZeroMQ的分布式系统通信方法.pdf”中,作者探讨了使用ZeroMQ来实现分布式系统中节点间通信的方法。文中提到的分布式系统架构通常由一个服务器和多个客户端组成,它们之间通过消息的发送和接收进行通信。...

    ZeroMQ指南.pdf

    ZeroMQ使用基于消息队列的异步通信机制,提供了高性能、可靠的消息传递机制。ZeroMQ支持多种编程语言,包括C、C++、Java、Python等,提供了灵活的开发环境。 使用ZeroMQ的优势 使用ZeroMQ可以提供高性能、可靠的...

    zeromq 源码 4.3.5

    ZeroMQ的核心概念是基于发布/订阅、请求/响应和推/拉模式的高性能消息队列。这些模式使得开发分布式系统变得更加简单,因为它抽象了网络通信的复杂性。下面,我们将深入探讨ZeroMQ 4.3.5版本的源码,了解其主要组件...

    基于ZeroMQ的分布式通信开发平台的设计与实现.pdf

    ZeroMQ(也称为0MQ、0-MQ或zmq)是一个开源的高性能消息库,用于在不同的编程语言之间实现分布式或并发应用程序。这个平台旨在满足战场态势分发和控制命令信息传输的需求。 2. 分布式系统的特点与需求:文档提到了...

    ZeroMQ 云时代极速消息通信库_带书签目录 完整版

    ZeroMQ,全称为“零MQ”或“ØMQ”,是一个高性能、轻量级的消息队列系统,被广泛应用于分布式计算环境中。它不仅提供了一种高效的消息传递机制,而且具有易于使用、灵活和可扩展的特性,是构建分布式应用程序的重要...

    ZeroMQ4.3.4

    ZeroMQ,全称为“零MQ”或“ØMQ”,是一个开源的消息中间件,它提供了一种灵活、高性能的异步消息传递机制。在标题中提到的"ZeroMQ4.3.4"是ZeroMQ的一个特定版本,4.3.4是在撰写此文本时的最新版本。这个版本包含了...

    编译后的ZeroMQ含lib文件

    2. **高性能**: 通过高效的内存管理机制和零拷贝技术,ZeroMQ能实现快速的消息传递,减少了CPU和内存的开销。 3. **模式丰富**: 支持多种通信模式,如请求/响应(Request/Reply)、发布/订阅(Publish/Subscribe)、...

Global site tag (gtag.js) - Google Analytics