`
kavy
  • 浏览: 904645 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ZMQ JAVA使用心得之 ZMQ简介

 
阅读更多

http://backend.blog.163.com/blog/static/202294126201251884238488   

 

ZMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API,大大简化了编程人员的复杂度,被称为史上最强大的消息中间件。ZMQ是用C语言编写的,30s内完成消息的传输,能够兼容多个平台,多种语言,可以使用多种方式实现NNSocket连接。本文仅以JAVA版本的ZMQ API为例,介绍ZMQ
    
ZMQ与传统的TCP Socket相比,具有以下优点:
    
1)  ZMQ发送和接受的是具有固定长度的二进制对象,ZMQ的消息包最大254个字节,前6个字节是协议,然后是数据包。数据包由3个部分组成,第一个字节是包的长度,第二个字节是包的一些属性,最后是包的内容。如果超过255个字节(有一个字节表示包属性),则ZMQ会自动分包传输;而对于TCP Socket,是面向字节流的连接,编程人员需要处理数据块与数据块之间的边界问题,而ZMQ能够保证每次用户发送和接受的都是一个完整的数据块;
    2)
 传统的TCP Socket的连接是11的,可以认为“1Socket=1个连接”,每一个线程独立的维护一个Socket。但是ZMQ摒弃了这种11的模式,ZMQSocket可以很轻松的实现1NN1NN的连接模式,一个ZMQSocket可以自动的维护一组连接,用户无法操作这些连接,用户只能操作套接字,而不是连接本身,所以说ZMQ的世界里,连接是私有的。这里大家关心的一点是,一个Socket是如何识别来自多个Socket的连接的,这里以请求响应模式为例介绍ZMQ是如何实现一个Socket连接NSocket的;
       3)ZMQ使用异步后台线程处理接受和发送请求,这意味着发送完消息,不可以立即释放资源,消息什么时候发送用户是无法控制的,同时,ZMQ自动重连,这意味着用户可以以任意顺序加入到网络中,服务器也可以随时加入或者退出网络;
      ZMQ之所以能够在无状态的网络中实现1N的连接,关键在于信封的机制,信封里保存了应答目标的位置。ZMQ涉及到请求-响应模式的Socket一共有4种类型:

  • DEALER是一种负载均衡,它会将消息分发给已连接的节点,并使用公平队列的机制处理接受到的消息。
  • REQ发送消息时会在消息顶部插入一个空帧,接受时会将空帧移去。其实REQ是建立在DEALER之上的,但REQ只有当消息发送并接受到回应后才能继续运行。
  • ROUTER在收到消息时会在顶部添加一个信封,标记消息来源。发送时会通过该信封决定哪个节点可以获取到该条消息。
  • REP在收到消息时会将第一个空帧之前的所有信息保存起来,将原始信息传送给应用程序。在发送消息时,REP会用刚才保存的信息包裹应答消息。REP其实是建立在ROUTER之上的,但和REQ一样,必须完成接受和发送这两个动作后才能继续。

   在了解了4种类型的Socket之后,我们就不难理解ZMQ的信封机制了。ZMQ信封机制的核心是Router Socket,它的工作原理如下:
   
ROUTER中读取一条消息时,ZMQ会包上一层信封,上面注明了消息的来源。ROUTER写入一条消息时(包含信封),ZMQ会将信封拆开,并将消息递送给相应的对象。REQ SocketROUTER Socket发送一条请求后,REP会从ROUTER收到一条消息,消息格式如下:
  


   第三帧是REP从应用程序收到的数据,第二帧是空帧,是REQ在发送ROUTER数据之前添加的,用来表示结束,第一帧即信封,是ROUTER添加的,主要用来记录消息来源;整个数据包处理过程如下:
   
    对于REQ Socket,可以在创建Socket的时候,为该Sock指定标示符,此时的Socket称为持久Socket,没有指定标示符的我们称为瞬时SocketROUTER会自动为瞬时Socket生成一个标示符;
 
这样
REP返回包含信封的数据给ROUTERROUTER就可以根据信封上的标示符将该消息发送到对应的REQ上;
     ZMQ使用注意事项:
  1. ZMQ是在发送端缓存消息的,可以通过阈值控制消息的溢出;
  2. ZMQ不可以线程之间共享Socket,否则会报org.zeromq.ZMQException: Operation cannot be accomplished in current state错误。
  3.  ZMQ一个进程只允许有一个Contextnew Context(int arg) arg表示后台线程的数量;
  4. ZMQSocket类有一个Linger参数,可以通过SetLinger设置,主要用于表示该Socket关闭以后,未发送成功的消息是否还保存,如果设置为-1表示该消息将永久保存(除非宕机,ZMQ是不持久化消息的),如果为0表示所有未发送成功的消息在Socker关闭以后都将立即清除,如果是一个正数,则表示该消息在Socket关闭后多少毫秒内被删除;这个方法非常有用,尤其在控制发送失败时,是否重发消息。
分享到:
评论

相关推荐

    ZMQ/ZeroMQ使用手册

    ZeroMQ的用户手册,适合C++、Java、Go、Python等通过MQ订阅消息的形式进行通信,低延迟,支持多语言SDK;手册内包含了ZeroMQ的基础入门知识,适合新手学习;介绍了ZeroMQ的集中模式包括高级请求-应答模式; 手册目录...

    ZMQ的纯java实现JeroMQ jar包及javadoc

    标题中的“ZMQ的纯java实现JeroMQ jar包及javadoc”指的是JeroMQ,这是一个完全用Java语言实现的零拷贝(ZeroMQ)消息队列库。ZeroMQ,通常简称为ZMQ,是一个高性能的开源消息中间件,它提供了一个轻量级的消息传递...

    Qt网络编程-ZMQ的使用

    在本文中,我们将深入探讨如何在Qt环境中使用ZeroMQ(ZMQ)进行网络编程,特别是实现PUB/SUB(发布/订阅)模式的进程间通信。ZeroMQ是一种强大的开源消息中间件,它提供了多种高级通信模式,使得应用程序可以轻松地...

    ZMQ简介,转

    ZMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API,大大简化了编程人员的复杂度,被称为史上最强大的消息中间件。ZMQ是用C语言编写的,30s...

    ZeroMQ(java)window库

    ZMQ本身只提供了C++版本的下载,如果在java里使用需要下载jzmq,需要自己编译,比较复杂。下载地址:https://github.com/zeromq/jzmq(右下角zip) 为了方便使用ZMQ,在这里提供了编译好的zeroMq和jzmq库,并附带了...

    Zmq使用实例多种语言C,C++,OC,Python等

    标题中的"Zmq使用实例多种语言C,C++,OC,Python等"表明这是一个关于ZeroMQ(Zmq)的多语言编程教程,涵盖了C、C++、Objective-C(OC)和Python这四种语言。ZeroMQ,又名0MQ或ØMQ,是一个开源的消息中间件,它提供...

    Qt-ZMQ的使用补充(pub-sub)

    Qt-ZMQ是一种基于Qt框架的ZeroMQ (ZMQ) 库封装,它使得在使用Qt开发应用程序时,能够方便地集成ZeroMQ的消息通信能力。ZeroMQ是一个高效的异步消息库,用于构建基于消息的架构,支持多种通信模式,包括发布/订阅模式...

    ZMQ的三种通信方式极其需要的jar包(完整版)

    在这个压缩包中,包含了ZMQ实现这三种通信方式所需的jar包,使得开发者无需繁琐的编译过程,可以直接在Java环境中使用。以下是关于ZMQ的三种通信模式及其相关知识点的详细解释: 1. **请求/应答模式 (Request/Reply...

    qt zmq 的使用:订阅模式:PUB(服务器)/SUB(客户端)

    3. zmq的使用 这种服务即服务器会不停发送数据,然后客户端对其进行订阅,客户端会收到服务器发送的数据,且不需要做出应答,客户端也不需要发送打招呼消息,只需要连接上就会收到服务器的订阅消息。 同时服务器不...

    使用ZMQ通信的头文件zmq.h

    使用ZMQ通信的头文件zmq.h

    zmq_java_20180502

    在"zmq_java_20180502"中,我们可能会看到try-catch-finally结构的使用,用于捕获并处理可能出现的异常,保证程序的稳定运行。 Java集合框架是处理数据集合的强大工具,包括List、Set、Map等接口,以及ArrayList、...

    zeromq简易demo搭建(java版本)

    zeromq简易demo搭建(java版本)是针对Java开发者介绍如何使用ZeroMQ这一高效的消息队列库进行简单应用开发的教程。ZeroMQ,也被称为ØMQ、0MQ或 zmq,是一个轻量级的消息中间件,它提供了一个高级消息队列模型,...

    windows下qt + zmq

    window下qt通过zmq的工程,分为demo、和应用。 主要为zmq的发布订阅的实现示例,使用该demo能够轻松模拟服务端、客户端、发布者和订阅者搭配组合的使用场景。 还有dll库。

    zmq.hpp 头文件

    zmq的cpp。头文件。

    QT调用ZMQ,qt调用dll库文件,QT

    qtzmq库提供了许多与ZeroMQ相关的Qt对象,如`ZmqContext`和`ZmqSocket`,你可以通过这些对象进行消息的发送和接收。例如,创建一个`ZmqSocket`实例并连接到ZeroMQ服务器: ```cpp #include <qtzmq/ZmqSocket> Zmq...

    grpc、zmq通信效率测试demo

    在IT行业中,网络通信效率是优化系统性能的关键因素之一。`gRPC` 和 `ZeroMQ (zmq)` 都是实现高效通信的框架,但它们的设计理念和应用场景各有不同。本篇文章将深入探讨这两个工具,并基于提供的“grpc、zmq通信效率...

    ZMQ数据传输各个版本库文件

    **正文** ZMQ,全称为ZeroMQ,是一个开源的消息中间件,它提供了一种高效、灵活的异步消息传输机制。在IT行业中,ZMQ因其强大的性能和丰富的特性被广泛...了解并熟练掌握ZMQ的使用,能够显著提升系统的性能和可靠性。

    zmq通讯demo

    zeromq(简称ZMQ)是一种高性能的消息中间件,它为分布式计算提供了强大的通信框架。在本示例“zmq通讯demo”中,我们将探讨...ZMQ的强大之处在于其灵活性和性能,使得开发者可以专注于业务逻辑,而不是底层通信细节。

    REP-REQ.zip_Rep和req_zmq_zmq REP_zmq REP REQ_zmq_req

    这个"REP-REQ.zip_Rep和req_zmq_zmq REP_zmq REQ_zmq_req"文件包含的是一个关于ZMQ中REPLY(REP)和REQUEST(REQ)模式的示例代码,这种模式是ZMQ中的基本通信模式之一,常用于客户端-服务器架构。 **ZMQ的REPLY...

Global site tag (gtag.js) - Google Analytics