概述
我们真正需要的是这样一种消息软件,它能够做大型消息软件所能做的一切,但使用起来又非常简单,成本很低,可以用到所有的应用程序中,没有任何依赖条件。因为没有了额外的模块,就降低了出错的概率。这种软件需要能够在所有的操作系统上运行,并能支持所有的编程语言。
ZMQ就是这样一种软件:它高效,提供了嵌入式的类库,使应用程序能够很好地在网络中扩展,成本低廉。
ZMQ的主要特点有:
- ZMQ会在后台线程异步地处理I/O操作,它使用一种不会死锁的数据结构来存储消息。
- 网络组件可以来去自如,ZMQ会负责自动重连,这就意味着你可以以任何顺序启动组件;用它创建的面向服务架构(SOA)中,服务端可以随意地加入或退出网络。
- ZMQ会在有必要的情况下自动将消息放入队列中保存,一旦建立了连接就开始发送。
- ZMQ有阈值(HWM)的机制,可以避免消息溢出。当队列已满,ZMQ会自动阻塞发送者,或丢弃部分消息,这些行为取决于你所使用的消息模式。
- ZMQ可以让你用不同的通信协议进行连接,如TCP、广播、进程内、进程间。改变通信协议时你不需要去修改代码。
- ZMQ会恰当地处理速度较慢的节点,会根据消息模式使用不同的策略。
- ZMQ提供了多种模式进行消息路由,如请求-应答模式、发布-订阅模式等。这些模式可以用来搭建网络拓扑结构。
- ZMQ中可以根据消息模式建立起一些中间装置(很小巧),可以用来降低网络的复杂程度。
- ZMQ会发送整个消息,使用消息帧的机制来传递。如果你发送了10KB大小的消息,你就会收到10KB大小的消息。
- ZMQ不强制使用某种消息格式,消息可以是0字节的,或是大到GB级的数据。当你表示这些消息时,可以选用诸如谷歌的protocol buffers,XDR等序列化产品。
- ZMQ能够智能地处理网络错误,有时它会进行重试,有时会告知你某项操作发生了错误。
- ZMQ甚至可以降低对环境的污染,因为节省了CPU时间意味着节省了电能。
其实ZMQ可以做的还不止这些,它会颠覆人们编写网络应用程序的模式。虽然从表面上看,它不过是提供了一套处理套接字的API,能够用zmq_recv()和zmq_send()进行消息的收发,但是,消息处理将成为应用程序的核心部分,很快你的程序就会变成一个个消息处理模块,这既美观又自然。它的扩展性还很强,每项任务由一个节点(节点是一个线程)、同一台机器上的两个节点(节点是一个进程)、同一网络上的两台机器(节点是一台机器)来处理,而不需要改动应用程序。
支持的传输协议
传输协议
|
描述
|
uri 示例
|
tcp
|
TCP的单播通信
|
tcp://*:8080
|
ipc
|
本地进程间通信
|
ipc://
|
inproc
|
本地线程间通信
|
inproc://
|
pgm
|
PGM广播通信
|
pgm://
|
epgm
|
广播通信
|
epgm://
|
核心消息模式
pattern
|
type
|
description
|
一对一结对模型
|
ZMQ_PAIR
|
|
请求回应模型
|
ZMQ_REQ
|
client端使用
|
ZMQ_REP
|
server端使用
|
|
ZMQ_DEALER
|
将消息以轮询的方式分发给所有对端(peers)
|
|
ZMQ_ROUTER
|
|
|
发布订阅模型
|
ZMQ_PUB
|
publisher端使用
|
ZMQ_XPUB
|
|
|
ZMQ_SUB
|
subscriber端使用
|
|
ZMQ_XSUB
|
|
|
管道模型
|
ZMQ_PUSH
|
push端使用
|
ZMQ_PULL
|
pull端使用
|
|
原生模型
|
ZMQ_STREAM
|
|
合法的套接字连接-绑定对(一端绑定、一端连接即可)
-
PUB - SUB
-
REQ - REP
-
REQ - ROUTER
-
DEALER - REP
-
DEALER - ROUTER
-
DEALER - DEALER
-
ROUTER - ROUTER
-
PUSH - PULL
-
PAIR - PAIR
其他的组合模式会产生不可预知的结果,在将来的ZMQ版本中可能会直接返回错误。你也可以通过代码去了解这些套接字类型的行为。
除了PAIR之外,其它模式都是支持一对多或多对一的
来源:oschina
链接:https://my.oschina.net/u/3312209/blog/4870019