Zmq是一个简单好用的传输组件,使得socket变成更加简洁、高效、高性能。

一.zmq,云计算时代最好的通讯库

援引自看过的一篇介绍:

为什么说ZeroMQ是云计算时代最好的通讯库呢?我们从ZeroMQ的特性来分析吧:
1.The socket library that acts as a concurrency framework.
开起来像是并行开发框架的socket库。
为什么一个通讯的库不提供socket的风格,反而看起来像是一个并行的库?
云计算不就是分布式计算嘛!
并行、多核、分布式,让计算能力不断的被扩展扩展,让数据不断地被分区分区,强大的计算能力就是这样堆出来的。并发是目前云计算这个世界的主题,所以ZMQ提供了一个并发的库,正式我们最最需要的。
如同广告所讲:客户要的不是一英寸的钻头,而是一英寸的洞。
我们要的不是通讯,而是分布式并行计算。
2. Carries messages across inproc, IPC, TCP, and multicast.
提供进程内、进程间、机器间和广播方式的消息通讯。
可以说ZMQ提供了一种强大的复杂环境适应能力。
作为一个通讯库,可能我们觉得进程内通讯和进程间通讯不是重要的。
然而,提供这些功能,使得ZMQ能够在特定的场景下提供特定的解决方案。且通讯的配置相当的简单:inproc://, ipc://, tcp://这三个通讯方案简单地在字符串中指定即可。开发者可以很容易开发出可运维的应用程序,在不同的场景下,可以仅修改配置文件来适应复杂的部署环境。
3.Connect N-to-N via fanout, pubsub, pipeline, request-reply.
在多对多的网络环境中提供多对一,发布/订阅(one-to-many),管道(one-to-one),请求/响应等模型。
模式,还是模式。(对于fanout这个词,我没完全理解,我觉得在网络通讯中,应该就是多对一这样的场景)
天天做网络的开发的人,可能会觉得通讯就那么三板斧,经典的模式不断在重复,可是我们仍然在具体的问题上反复写着类似的代码。
而ZMQ提供的不仅仅是这个:ZMQ就像一堆水管的转接头,在复杂的自来水供水系统中,ZMQ在每个关节灵活地适配,像水管一样接起来,把数据分开或是合并。
例如,先把数据按照pub/sub模式分发给多个服务器,每个服务器上的进程在进程内用inproc,将请求分布到多个线程上处理,如果有特别的需要,还可以把数据用ipc方式转发给同一机器上的其他进程。而完成这一切复杂的工作仅需要少少的代码。
4. Fast enough for clustered products and supercomputing.
对服务器群集和超级计算来将都足够快了
超级计算都能做,你还想干啥?
5. Asynch I/O for scalable multicore message-passing apps.
对可扩展的多核消息传递应用程序提供异步I/O支持。
在ZMQ的inproc://模式中,库提供了线程安全的消息分发机制,可以简单地把请求分发给多线程处理。
6. Large and active open source community.
拥有超大并且活跃的开源社区
记住,你不是一个人在战斗!不是……
7. 20+ languages including C, C++, Java, .NET, Python.
有超过20种以上的开发语言绑定,诸如C, C++, Java, .NET, Python
8. Most OSes including Linux, Windows, OS X.
还支持绝大多数的操作系统,例如Linux, Windows, OS X
9. LGPL free software with full commercial support.
这是最重要的,不要钱,但也可以提供商业支持。

另,PostRank的创始人兼CTO,为ZeroMQ写了个简介如下:

所有网络交互所使用的API实际上是Berkeley套接字(BSD) 。这个源自1980年代早期的协议是TCP/IP协议的最原始实现。而且可以说,在当今各操作系统中,它是受到最广泛支持的API,也是这些操作系统的核心组件之一。人们对BSD套接字的了解较多的是点对点的连接。点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等。一旦你解决了以上所有问题,你就进入应用协议层(如HTTP)的世界了,这里需要的是组帧、缓存和处理逻辑等。换言之,编写高性能网络协议的应用程序一点儿也不复杂。
如果我们能对各种套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,这不是件很好的事情吗?这正是ZeroMQ(ØMQ/ZMQ)网络库的由来:“它提供一些跨多种传输协议(如进程内通讯、IPC、TCP和广播)的套接字供你使用。你可使用多种方式实现N对N的套接字连接,譬如:扇出、发布订阅、任务分发以及请求响应。”ZeroMQ网站解释:
ØMQ是网络栈中新的一层,它是个可伸缩层,分散在分布式系统间。因此,它可支持任意大的应用程序。ØMQ不是简单的点对点交互,相反,它定义了分布式系统的全局拓扑。ØMQ应用程序没有锁,可并行运行。此外,它可在多个线程、内核和主机盒之间弹性伸缩

  • ZeroMQ交互是面向消息的。它将人们每天为应用程序周而复始地进行的例行消息处理封装起来。这意味着如果当客户端套接字发送一条150KB大小的消息时,服务端套接字无需显式处理任何缓存(buffer)或组帧,即能接接收到一条完整而相同的消息。
  • ZeroMQ套接字与传输协议无关:对于任何协议,只有单一且统一的发送消息和接收消息API。缺省情况下支持进程内通讯、IPC、广播和TCP。此外,协议间切换非常简单,仅需更改连接字符串的前缀即可。
  • ZeroMQ套接字能感知路由和网络拓扑。因为我们不再需要显示地管理点对点的连接状态——在上面我们已经看到,所有这些都已经由ZeroMQ库封装好——所以单个ZeroMQ套接字可以绑定两个独立的端口并监听他们的入站请求消息;也可使用一个API调用向两个独立的套接字发送数据。

缺省情况下,ZeroMQ中所有的交互都是异步的。这种异步处理模型使得ZeroMQ能够将建立连接、销毁连接、重新连接的过程封装起来,同时又能实现消息传输延迟的最小化:非阻塞的含义是,应用中一般的消息处理都是并行进行的,如消息的发送、传输以及(在发送端或接收端)排队。当然,你也可以控制ZeroMQ的排队行为,只需要设定内存范围即可,甚至你还可以为每个套接字设定交换区域。所以,如果需要的话,你完全可以模拟阻塞式API,但是异步I/O是缺省的行为。

二.介绍

zmq通信场景:

  • 线程之间进程内(inproc)
  • 进程之间(ipc)
  • 机器之间(tcp)

zmq通信模型:

  • 请求-回复(Request-reply)。分为ZMQ_REQ、ZMQ_REP、ZMQ_DEALER、ZMQ_ROUTER

就是一般的C/S架构中,client与server之间一问一答的通信模式,比如最经典的echo服务.需要注意的是,client发送一个request,server必须有一个回应.

  • 发布-订阅(Publish-subscribe)。分为ZMQ_PUB、ZMQ_SUB

server端作为publish端,而任何连接到服务端的client都会成为subscribe端.也就是说,server端会把当前的所有需要publish出去的消息全部发送到当前连接上去的client上.

  • 管道(Pipeline)。分为ZMQ_PUSH、ZMQ_PULL

server端作为push端,而client端作为pull端.如果有多个client端同时连接到这个server,则服务器会在内部做一个负载均衡,采用平均分配的算法,将所有的消息均衡发布到client端上.

  • 对立对(Exclusive pair)。分为ZMQ_PAIR

要注意的是,发布订阅模型和管道(也叫推拉)模式中,无论是server端还是client端在启动时都是不知道client实际数量的,
这就意味着,一个使用zeromq搭建的服务,可以进行”热更新”.

考虑如下一种场景.一个server端做为一组服务器集群最上层的一个proxy,起到负载均衡的作用,将请求按照它下面对应服务器集群依次派发到不同的client端进行处理.某个时刻可能处理的机器只有2台,而随着负载越来越大,可能需要3台机器了,这个时候如果使用zeromq的push-pull搭建的proxy端,则可以不用对之前搭建的server,client端进行停机,只需要新启动一个client连接上去,proxy层就会自动根据当前的机器分配平均派发任务了.cool.

ZMQ通信模型及基本服务实现相关推荐

  1. 【五】分布式微服务架构体系详解——服务发现和服务通信

    前言 微服务架构的概念比容器技术早,但是却随着容器技术在13年的兴起,基于容器技术的微服务架构越来越被广泛应用.容器的轻量级部署方式很适合为每个微服务提供基础运行环境. 本文会基于Docker容器,先 ...

  2. Netty从入门到精通-BIO详解

    导语   随着JavaI/O库的不断迭代升级,基于Java 语言的网络编程也开始变的简单,随着异步I/O功能的增强,基于JavaNIO开发的网络服务器也越来越多.很多的互联网大厂都在不断的优化Java ...

  3. Java SE 基础知识

    Java SE 基础知识 1 2 @(Notes)[J2SE, Notes] VICTORY LOVES PREPARATION. 特别说明: 该文档在马克飞象查阅最佳: 本部分知识还在迭代中,欢迎补 ...

  4. ZeroMQ 中文指南 第二章 ZeroMQ进阶【转载】

    此文章转载自GitHub : https://github.com/anjuke/zguide-cn 作者信息如下. ZMQ 指南 作者: Pieter Hintjens ph@imatix.com, ...

  5. 《浅谈整车SOA架构》终篇:整车SOA系统设计

    <浅谈整车SOA架构>终篇:整车SOA系统设计 参考链接: 1.https://zhuanlan.zhihu.com/p/330973653 2.<浅谈整车SOA架构>第1篇: ...

  6. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架--Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

  7. experience

    编程有个说法,能用组合就不用继承.说说继承的好处. 学过设计模式的都听说过,能用组合就别用继承. - 不破坏封装,整体类与局部类之间松耦合,彼此相对独立 - 具有较好的可扩展性 - 支持动态组合.在运 ...

  8. ZEROMQ 第 4 章 - 可靠地请求响应模型

    第三章中我们使用实例介绍了高级请求-应答模式,本章我们会讲述请求-应答模式的可靠性问题,并使用ZMQ提供的套接字类型组建起可靠的请求-应答消息系统. 本章将介绍的内容有: 客户端请求-应答 最近最少使 ...

  9. 06-JAVA面试核心知识点整理(时间较多的同学全面复习)

    JVM (1) 基本概念: JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域.JVM 是运行在操作系统之上的,它与硬件没有直接的 ...

最新文章

  1. 活久见!技术面试官竟然给我出了一个脑筋急转弯,还问我王者荣耀什么段位?...
  2. Rabbitmq基本框架和安装(1)
  3. java list set map的区别_Java集合类List/Set/Map的区别和联系
  4. Java读取resource文件/路径的几种方式
  5. Java JDBC篇2——JDBC增删查改
  6. java addobject_springMVC后台的值无法通过ModelAndView的addObject传到前台
  7. linux各版本基线检查脚本(centos6、centos7、ubuntu系列)
  8. odoo pivot中去掉求和_评比算分,去掉最高分和最低分算平均,PLC怎样编程实现?...
  9. mongodb常用命令脚本化-自动化运维
  10. FCC 中级算法题 最小公倍数
  11. 利用 bat 脚本强制杀死 Windows 进程
  12. 龙格-库塔(Runge-Kutta)
  13. Java实现坦克大战小游戏
  14. Hijack攻击揭秘
  15. 【问链财经-区块链基础知识系列】 第四十三课 区块链+保险,最全最深入的设计思路就在这儿了!
  16. 从事热爱的工作和积极乐观
  17. 汇编指令学习(AND,OR,XOR,NOT)
  18. 第六章微型计算机,微型计算机原理及应用 第六章微型计算机的接口技术
  19. 软件缺陷及其生命周期
  20. 【推荐】AI智慧安监企业安全生产监督管理平台建设技术解决方案合集(共342份,863M)

热门文章

  1. Java java.lang.ArithmeticException: Underflow问题解决
  2. A Game of Thrones(79)
  3. CPChain星火计划介绍及最新进展
  4. [蓝桥杯单片机]刷题笔记—客观题—2019年省赛真题
  5. 不要买 Xperia Z 的理由
  6. Vue项目打包后js文件压缩
  7. 第7章第18节:单图排版:通过蒙版改变图片的形状 [PowerPoint精美幻灯片实战教程]
  8. 初中计算机知识点结构图,初中信息技术总复习第一课 构建知识框架
  9. 就鹿晗宣布恋情导致微博宕机事件浅谈大型网站高可用性架构
  10. WindowsPE(一)PE头字段节表