zeromq实践

zeromq实践

zeromq简介

图片 1

zeroMQ不是TCP,不是socket,也无是信息队列,而是这些的综合体。

ZeroMQ以嵌入式网络编程库的款型落实了一个并行开发框架(concurrency
framework),
能提供经过内(inproc)、进程中(IPC)、网络(TCP)和播音方式的信信道,
并支持扇出(fan-out)、发布-订阅(pub-sub)、任务分发(task
distribution)、请求/响应(request-reply)等通信模式。

ZeroMQ的异步I/O模型能够为多核消息网提供足够的扩展性。

ZeroMQ支持30多种语言的API,可以用来绝大多数操作系统。

与socket对比

ZeroMQ提供了近乎于Socket的一模一样多元接口,他与Socket的分别是:普通的socket是端到端的(1:1之干),而ZMQ却是好N:M
的涉嫌,人们对BSD套接字的刺探较多之是触发对点的接连,点对碰连要显式地立连接、销毁连接、选择情商(TCP/UDP)和处理错误等,而ZMQ屏蔽了这些细节,让你的网编程更为简单。ZMQ用于node与node间的通信,node可以是主机或者是过程。

ZeroMQ特点

ZeroMQ是一个传输层API库,
还关注消息之传。与信队列相比,ZeroMQ有以下部分特征:

1 点对碰无中间节点.

风土人情的信队列都得一个消息服务器来存储转发信息。而ZeroMQ则放弃了此模式,把中心放在了点对碰的消息传上。

ZeroMQ能缓存消息,但是是于殡葬端缓存。ZeroMQ里有水位设置的有关接口来控制缓存量。当然,ZeroMQ也支撑传统的信息队列(通过zmq_device来实现)。

2 强调消息收发模式

于触及对碰之信息传上ZeroMQ将通信的模式做了综合,比如大规模的订阅模式(一个音发大多独客户),分发模式(N个消息平均分吃X个客户)等等。下面是当下支持的信息模式配对,任何一方都得举行为服务端。

  • PUB and SUB
  • REQ and REP
  • REQ and ROUTER (take care, REQ inserts an extra null frame)
  • DEALER and REP (take care, REP assumes a null frame)
  • DEALER and ROUTER
  • DEALER and DEALER
  • ROUTER and ROUTER
  • PUSH and PULL
  • PAIR and PAIR
    XPUB and XSUB是PUB and SUB的弱版本。

4栽为主信息模式

ZeroMQ将消息通信分成4栽模型,分别是一律针对性一结对型(Exclusive-Pair
)、请求对型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)

Request-Reply请求对型

由于要求端发起呼吁,然后等待回应端应答。一个伸手必须相应一个回,从央端的角度来拘禁是发-收配对,从答应端的角度是收-发对。跟一对一结伴模型的分在要求端可以是1~N个。

行使场景:该模型主要用于远程调用及任务分配等。Echo服务就是是这种经典型的以。
图片 2

Publish-Subscribe发布订阅模型

公布端单为分发数据,且不关注是否将整音讯发送给订阅端。如果发布端开始颁发消息经常,订阅端尚未连接上,则这些信息会被直丢弃。订阅端未连接导致信息丢失的题目,可以通过与请求对型组合来缓解。订阅端只担负接收,而无能够反映,且当订阅端消费速度迟滞吃披露端的景象下,会以订阅端堆积数据。

使用场景:该型主要用以数据分发。天气预报、微博明星粉丝可动用这种经典型。
图片 3

注意事项:在这种模式于,SUB端在确立连接后,需要先订阅,才会吸纳信息,否则接收不至消息。示例如下:

ZMQ.Context context = ZMQ.context(1);
Socket subscriber = context.socket(ZMQ.SUB);
subscriber.connect("tcp://localhost:5557");
subscriber.subscribe("".getBytes());
int total = 0;
while (true) {
    byte[] bytes = subscriber.recv(0);
}

Subscribe按不同之topic主题过滤

//Publish端发送不同的topic主题
publisher.sendMore("access_point");
publisher.send(ipAddress.toByteArray(), ZMQ.NOBLOCK);

//topic filter过滤:根据topic过滤,不同的Subscribe订阅不同的数据    
subscriber.subscribe("access_point".getBytes());
while (true) {
    //接收topic
    byte[] bytesTopic  = subscriber.recv(0);
    // 接收数据
    byte[] bytesData = subscriber.recv(0);
}

Parallel Pipeline PUSH-PULL推拉模型 分而治之

Server端作为Push端,而Client端作为Pull端,如果发差不多个Client端同时连接到Server端,则Server端会在里面举行一个载重均衡,采用平均分配的算法,将装有消息均衡发布暨Client端上。与颁布订阅模型对照,推拉模型在从来不顾客之状下,发布之消息不见面给消耗少;在消费者力量不够的景下,能够提供多顾客互相消费解决方案。

下场景:该模型主要用来多任务并行。
图片 4

pair :The Relay Race

信号模式迟早是相当的,这种模式可以代表信号量和互斥锁,用于协调线程。

图片 5

安装

采用时,注意用防火墙端口关闭。

在CentOS下使用ZeroMQ

centos 安装 zeromq jzmq

#install zeromq
tar -xzf zeromq-2.1.7.tar.gz
cd zeromq-2.1.7
#./configure --prefix=/usr/local/zeromq  #按照此种方式,会报错,搞不定。
./configure
yum -y install libuuid-devel ##如果报错uuid-dev,安装此程序
make & make install

#install jzmq
(yum -y install libtool)
git clone https://github.com/nathanmarz/jzmq.git
cd jzmq
./autogen.sh
./configure 
make & make install

测试

/ddhome/usr/jzmq/perf
sh local_lat.sh tcp://127.0.0.1:5000 1 100
    如果报以下错误:
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no jzmq in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
            at java.lang.Runtime.loadLibrary0(Runtime.java:823)
            at java.lang.System.loadLibrary(System.java:1028)
            at org.zeromq.ZMQ.<clinit>(ZMQ.java:34)
            at local_lat.main(local_lat.java:36)
    解决方案:(不是必选项)
    vi ~/.bashrc 
    export LD_LIBRARY_PATH=/usr/local/lib

报错:错误: 找不到或无法加载主类 remote_lat。这是因为未执行./configure

sh remote_lat.sh tcp://127.0.0.1:5000 1 100

#出现下面信息,则测试成功
message size: 1 [B]            #####说明测试成功
roundtrip count: 100
mean latency: 140.0 [us]
  • java测试demo:
    服务器上java代码测试demo

在Windows10下使用ZeroMQ

自身只行使zeromq client接收数据,故未举行编译安装,参考
ZeroMQ(Java)使用民用小心得,这里Mark一下(适用于windows64bit以及32bit),下载就编译好之公文。

都编译好之文书,一般是三独:jzmq.dll,libzmq.dll,zmq.jar文件(这个maven中起)

点滴单dll文件在jdk放置目录:%JAVA_HOME%/bin/.dll

<dependency>
    <groupId>org.zeromq</groupId>
    <artifactId>jzmq</artifactId>
    <version>2.2.0</version>
</dependency>

即可在idea中运行java代码编写的zeromq.


ZeroMQ进阶

iothread设置

When you create a new context, it starts with one I/O thread. The
general rule of thumb is to allow one I/O thread per gigabyte of data in
or out per second.

ZMQ.Context context = ZMQ.context(1); //1是iothread

Number of threads to use, usually 1 is sufficient for most use cases.
public static Context context(int ioThreads) {
        return new Context(ioThreads);
}

康宁认证

zmq_plain(7)

clear-text authentication明文认证 Authentication Using SASL

The PLAIN mechanism defines a simple username/password mechanism that
lets a server authenticate a client. PLAIN makes no attempt at security
or confidentiality. It is intended for use on internal networks where
security requirements are low. The PLAIN mechanism is defined by this
document:
http://rfc.zeromq.org/spec:24.内网使用,安全性低。

zmq_curve(7)

secure authentication and confidentiality安全的印证方法和保密措施

The CURVE mechanism defines a mechanism for secure authentication and
confidentiality for communications between a client and a server. CURVE
is intended for use on public networks. The CURVE mechanism is defined
by this document:
http://rfc.zeromq.org/spec:25.公网使用。

Pub-Sub Network with a Proxy 请求-应答代理

少种植艺术来连接多独客户端以及多个服务端。

  • 首先种植是叫客户端通过负载均衡和大多独服务端进行连接。
    图片 6
  • 其次栽是要-应答代理会将简单独拟接字分别绑定到前者和后端,供客户端和服务端套接字连接。代理装置必须要是非阻塞式的。这种办法灵活性更好。
    图片 7

The Request-Reply Mechanisms 高级请求-应答模式

阿联酋模式以及小伙伴模式

图片 8

The Naming Ceremony

图片 9

The State Flow状态流

图片 10

参考文献

  • ØMQ – The Guide
  • ZMQ
    指南
  • ZeroMQ简介
  • ZeroMQ
    使用(一)
  • ZeroMq的研究和采用

tips:本文属于自己读书和履过程的记录,很多贪图以及仿都粘贴自网上文章,没有注明引用请见谅!如有其它问题要留言或邮件通知,我会马上恢复。

admin

网站地图xml地图