分布式系统之分布式中间件zeroMQ

zeroMQ,又称0MQ,是一个非常简单的通信库,它扩展了传统BSD socket能力,提供简单的基于消息的通信。zeroMQ不解析消息体,没有序列化能力,或者说你可以使用任何第三方序列化库比如google的protocol buffer。

iMatix公司,AMQP协议的制定者,在2010年退出了AMQP工作组,其CEO Pieter Hintjens 认为AMQP从根本上就有不可修改的缺陷,太复杂了,目前转而支持zeroMQ,iMatix 2011年后不再维护其AMQP软件OpenAMQP。

在zeroMQ的guide中,将现在(将来)的软件类比人类的大脑,几万亿个神经元互相之间发送消息来完成一些任务,没有控制点,没有单点故障。而现实中,软件和软件间的互联极难,非常难以维护和控制。IETF已经建立了很多标准,用来解决这个问题,HTTP是一个非常简单的解决方案,但是这个解决方案让问题更加复杂:HTTP鼓励开发者和架构师将软件设计为复杂、万能的中心服务器和简陋、愚蠢的客户端。这造成了现在整个互联网到处是中心点,难以控制,即使有分布式的P2P架构(skype,bittorrent),也只是些玩具,很少有人使用它们来传输数据,解决实际生产问题。

OK,实践实践。按照guide上的说明,下面使用zeroMQ做一个简单的helloworld分布式程序。
首先安装zeroMQ,从网站上下载当前release版本,然后编译安装,需要g++和uuid-dev(在俺的亚马逊ec2虚拟机上没有,现yum安装,汗。。。)。编译出来的动静态库和头文件默认都放到了/usr/local目录下的lib和include目录下。

server代码:
C代码 收藏代码
#include <zmq.h>
#include <stdio.h>
#include <string.h>

int main()
{
void *context = zmq_init(1);

void *s = zmq_socket(context, ZMQ_REP);
zmq_bind(s, "tcp://*:5555");

while (1)
{
zmq_msg_t msg;
zmq_msg_init(&msg);
zmq_recv(s, &msg, 0);
printf("received hello\n");

zmq_msg_close(&msg);

zmq_msg_init_size(&msg, 5);
memcpy(zmq_msg_data(&msg), "World", 5);
zmq_send(s, &msg, 0);
zmq_msg_close(&msg);
}

zmq_close(s);
zmq_term(context);
}

client代码:
C代码 收藏代码
#include <stdio.h>
#include <string.h>
#include <zmq.h>

int main()
{
void *ctx = zmq_init(1);
void *s = zmq_socket(ctx, ZMQ_REQ);
zmq_msg_t msg;
char buf[10];

zmq_connect(s, "tcp://localhost:5555");

zmq_msg_init_size(&msg, 5);
memcpy(zmq_msg_data(&msg), "hello", 5);
zmq_send(s, &msg, 0);
zmq_msg_close(&msg);

zmq_msg_init(&msg);
zmq_recv(s, &msg, 0);
memcpy(buf, zmq_msg_data(&msg), 5);
buf[5] = 0;
printf("%s\n", buf);

zmq_msg_close(&msg);
zmq_close(s);
zmq_term(ctx);
return 0;
}

Makefile:
Makefile代码 收藏代码
all: server client
server: server.c
gcc -o $@ $< -lzmq
client: client.c
gcc -o $@ $< -lzmq

ok,测试通过。解释一下,客户端和服务端都是首先初始化一个zmq的context,然后创建一个socket,客户端创建request类型的,服务端创建reply类型的,服务端bind一个地址,客户端connect这个地址,然后客户端发送一个消息,服务端收到后回应一个消息。

可以看到如下几点:
0. zeroMQ就是一个通信库,提供创建socket,建立连接,监听端口,发送消息,接收消息的功能。
1. 使用类似URL的字符串方式指定一个地址,远远比BSD socket的sockaddr好用。
2. context创建时可以指定有多少个I/O线程,可以并发进行多个线程处理
3. 对于string,不假定有'\0'结束符,便于多种语言进行交互
4. 对于消息内容,zeroMQ不做任何解析,就是一段长度的字节流,编解码由客户端和服务端自己搞定
5. 最后很有趣的一点,先启动客户端,再启动服务端,程序照样运行正常,说明在建立连接时,如果被连接的服务端不存在,客户端会等待并尝试重连。这一点对分布式系统的容错性比较有意义。

先到这里,后续深入分析。

zeromq的更多相关文章

  1. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  2. ZeroMQ:云时代极速消息通信库

    ZeroMQ:云时代极速消息通信库(大规模|可扩展|低成本|高效率解决之道,大规模分布式|多线程应用程序|消息传递架构构建利器) [美]Pieter Hintjens(皮特.亨特金斯)著   卢涛 李 ...

  3. 以ZeroMQ谈消息中间件的设计【译文】

    本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...

  4. NetMQ(一):zeromq简介

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  5. zeromq系列

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  6. 消息队列之ZeroMQ(C++)

    ZMQ是什么? 这是个类似于Socket的一系列接口,他跟Socket的区别是:普通 的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的 ...

  7. ZeroMQ(ZMQ)函数接口英汉直译

    找了好多地方都找不到ZMQ接口函数的中文文档,就厚着脸皮自己翻译了下.但因为作者本人涉世未深,翻译有错误的地方还请大家不吝赐教,在下感激不尽. 因为时间有限,只能一点一点翻译了. ZMQ接口文档的官方 ...

  8. ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核

    官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...

  9. ZeroMQ接口函数之 :zmq_bind - 绑定一个socket

    ZeroMQ 官方地址 : http://api.zeromq.org/4-0:zmq-bind zmq_bind(3) ZMQ Manual - ZMQ/3.2.5 Name zmq_bind -  ...

  10. ZeroMQ接口函数之 :zmq_close - 关闭ZMQ socket

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_close zmq_close(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_close  ...

随机推荐

  1. php get传递数据

    url:?goods[]=924&goods[]=967&goods[]=993 <?php  if($_GET){            print_r($_GET);  } ...

  2. asp.net解决数据转换为DBNULL的问题

    if (string.IsNullOrEmpty(CookieHelper.GetCookie("DEPID", "theway").ToString()) = ...

  3. [前端 1] 使用frameset框架构建网页基本布局

    导读:在做项目的过程中,发现网页的一些地方是不变的,比如说顶部.底部.而变幻的内容就只是一部分.这个时候在想,这是每次都刷新一个界面呢,还是有别的快捷方法呢.然后就找到了frameset 这个东西.本 ...

  4. CLRS:master theory in complexity of algorithm

    T(n)=aT(n/b)+f(n); where we can interpret n/b to mean either floor(b/n) or ceil(b/n), Then T (n) has ...

  5. Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状

    本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...

  6. PayPal 开发详解(一):注册PayPal帐号

    1.注册paypal帐号 https://www.paypal.com 2.使用刚才注册的paypal帐号登录3.进入开发者中心 4.登录开发者中心 5.登录 查看我们paypal Sandbox测试 ...

  7. VS2013添加NuGet的方法

    1.工具->扩展和更新->联机 2.右上角搜索框搜索NuGet,选择NuGet Package Manager for Visual Studio 2013,安装后重启VS 下面通过添加N ...

  8. 安装JAVA JDK注意事项

    1 WIN8系统 安装JDK  我安装的是1.6版本,   64位的 : 2 安装好后  cmd  输入 java -version  正常 java  命令  正常 javac 命令不正常    提 ...

  9. c#文本文件写入

      string err = "Hellod world";             FileStream fs = null;             string filePa ...

  10. 使用C#中JavaScriptSerializer类将对象转换为Json格式数据

    将对象转换为json格式字符串: private JavaScriptSerializer serializer = new JavaScriptSerializer(); protected voi ...