搜索
查看: 31282|回复: 25

ZeroMQ 实现服务端,客户端范例

    [复制链接]

110

主题

1385

帖子

7885

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7885
发表于 2011-11-20 08:08:48 | 显示全部楼层 |阅读模式
ZeroMQ网络库提供一些跨多种传输协议(如进程内通讯、IPC、TCP和广播)的套接字供你使用,可使用多种方式实现N对N的套接字连接。ZeroMQ非常适合与Protobuf结合使用,并且与Protobuf一样在很多编程语言中都有支持库,aardio最新版本已经同时支持ZeroMQ、与Protobuf。并提供了非常简洁并易于使用的接口。

ZeroMQ 中文指南 - aardio版本
https://github.com/aardio-Quicker/zguide-cn

服务端 :
  1. import zeromq
  2. import console;

  3. var context = zeromq.context()
  4. var responder = context.zmq_socket_reply() //创建套接字
  5. responder.bind(  "tcp://*:5559")

  6. console.log("服务端已启动")
  7. do {  
  8.     console.log("服务端收到消息",responder.recv() );  
  9.     responder.send("World")  
  10. }while( sleep (1) )
复制代码
客户端:
  1. import zeromq
  2. import console;

  3. var context = zeromq.context()  
  4. var requester = context.zmq_socket_request();  
  5. requester.connect( "tcp://localhost:5559" )

  6. requester.send("Hello");  //发送消息
  7. var str = requester.recv(); //接收字符串
  8. console.log ("客户端收到消息 ", str );  

  9. context.term(); //关闭
复制代码
回复

使用道具 举报

33

主题

581

帖子

3494

积分

荣誉会员

Rank: 8Rank: 8

积分
3494
发表于 2011-11-20 08:14:41 | 显示全部楼层

好东西,更新下

好东西,更新下
回复

使用道具 举报

20

主题

157

帖子

936

积分

三级会员

Rank: 4

积分
936
发表于 2011-11-20 08:59:17 | 显示全部楼层

这个厉害{:3_46:}

这个厉害
回复

使用道具 举报

48

主题

293

帖子

1725

积分

荣誉会员

Rank: 8Rank: 8

积分
1725
发表于 2011-11-20 09:15:49 | 显示全部楼层

{:soso_e179:}学习学习~

{:soso_e179:}学习学习~
◆ 半醒半醉日复日,花落花开年复年 ◆
回复

使用道具 举报

74

主题

1013

帖子

5336

积分

荣誉会员

Rank: 8Rank: 8

积分
5336
发表于 2011-11-20 09:39:27 | 显示全部楼层

这个就方便多了..........

这个就方便多了..........
aaa
回复

使用道具 举报

117

主题

1279

帖子

6802

积分

六级会员

Rank: 9Rank: 9Rank: 9

积分
6802
发表于 2011-11-20 10:05:15 | 显示全部楼层

[quote][size=2][color=#999999]xj199241 发表于 2011-11-20 09:39[/color] [url=forum.p

xj199241 发表于 2011-11-20 09:39
这个就方便多了..........

老大是要将简单进行到底
太方便我们了
我是菜鸟...
回复

使用道具 举报

45

主题

707

帖子

3945

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3945
发表于 2011-11-20 11:21:25 | 显示全部楼层

还在学socket编程吗?还在研究为什么epoll比select更好吗?噢,不必了! 在复杂的云计算环境中,我们面临的难题远比这个复杂得多。庞大的服务器集群作

还在学socket编程吗?还在研究为什么epoll比select更好吗?噢,不必了!
在复杂的云计算环境中,我们面临的难题远比这个复杂得多。庞大的服务器集群作为计算云,对来来看或许只是一个简单的搜索框;而在云的内部,复杂的互联和海量的通讯,加之不稳定的网络环境,廉价服务器的低可用性——构建一个高可用性且具备伸缩能力的云计算的环境,不是那么容易的!

为什么说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.
这是最重要的,不要钱,但也可以提供商业支持。

注:
Fan out:数电里很重要的概念,“一逻辑门的输出需要驱动多个等效门的输入,称输出端接的需要驱动的等效门数为扇出F”。扇出(fan-out)是定义单个逻辑门能够驱动的数字信号最大输入量的术语。

转自:http://hi.baidu.com/ah__fu/blog/item/fd73593ebb3dd6e8828b13a3.html



再好的编程语言到了不会用的人手里,都会变成恶魔,不幸的是 - 不会用的是大多数。
回复

使用道具 举报

45

主题

707

帖子

3945

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3945
发表于 2011-11-20 11:54:55 | 显示全部楼层

zeromq不是libevent,也不是ACE,因为它的主要特性是: 面向消息进行通信.所以,它提供的是比libevent,ACE处在网络通信中更高一层的组件

zeromq不是libevent,也不是ACE,因为它的主要特性是:
面向消息进行通信.所以,它提供的是比libevent,ACE处在网络通信中更高一层的组件.
使用它,程序员不再需要上面提到的libevent,ACE之类的库需要关心的东西,

程序员如果要使用zeromq,只需要做如下的事情:
1) 告知所使用的patten,比如request-reply,pub-sub,push-pull等
2) 告知是用于机器之间,还是进程之间,线程之间的通信.
然后,将所需要发送的数据封装到zeromq自带的msg结构体中发送出去,
使用者自己关心如何序列化/反序列化这些数据,然后如何处理这些数据就是使用者的事情了.

这样看上来,使用者要关注的事情”高”了一层,大部分的精力都可以放在业务逻辑之上了.
简而言之,它让使用者的精力放在了通信模式和业务逻辑上,而不是更下面一层的网络层上.

下面解释一下zeromq常用的几种网络pattern:

1) request-reply
就是一般的C/S架构中,client与server之间一问一答的通信模式,比如最经典的echo服务.需要注意的是,client发送一个request,server必须有一个回应. 这个pattern并不是什么亮点,下面亮点来了.

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

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

看上去,很稀松平常?接下来亮点真的来了.
2), 3)两种模式中,无论是server端还是client端在启动时都是不知道client实际数量的,
这就意味着,一个使用zeromq搭建的服务,可以进行”热更新”.

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

转自:http://www.codedump.info/?p=196


再好的编程语言到了不会用的人手里,都会变成恶魔,不幸的是 - 不会用的是大多数。
回复

使用道具 举报

45

主题

707

帖子

3945

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3945
发表于 2011-11-20 12:01:39 | 显示全部楼层

Ilya Grigorik,即PostRank的创始人兼CTO,为[url=http://www.igvita.com/2010/09/03/zeromq-mo

Ilya Grigorik,即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是由社区推动的:
ØMQ(又称作ZeroMQ或0MQ)是由数十位作者历时三年合作开发出来的自由软件
Ilya解释:


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

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

Ilya解释:
Mongrel2给出了将ZeroMQ应用于Web服务器的一个有趣的案例研究:所有入站消息通过“Push”套接字路由到Mongrel2,套接字可以自动实现负载均衡,将消息分发到连接处理器。反过来,连接处理器处理入站消息(通过Pull套接字),然后将处理结果发布到一个“Pub”套接字,Mongrel2服务器本身已订阅了该套接字,并且通过主题(topic)过滤器监听该套接字的进程号。


ZeroMQ网站上给出了一个列表,简要给出了ZeroMQ较之其他传输机制的优势:




    • TCP:ZeroMQ基于消息,消息模式,而非字节流。
    • XMPP:ZeroMQ更简单、快速、更底层。Jabber可建在ØMQ之上。
    • AMQP:完成相同的工作,ZeroMQ要快100倍,而且不需要代理(规范更简洁——少278页)
    • IPC:ZeroMQ可以跨多个主机盒,而非单台机器。
    • CORBA:ZeroMQ不会将复杂到恐怖的消息格式强加于你。
    • RPC:ZeroMQ完全是异步的,你可以随时增加/删除参与者。
    • RFC 1149:ZeroMQ比它快多了!
    • 29west LBM:ZeroMQ是自由软件!
    • IBM低延迟:ZeroMQ是自由软件!
    • Tibco:仍然是自由软件!

Ilya总结:
无需多说,ZeroMQ是一个雄心满满项目,该简介对于完整的特性集而言只能略见一斑。ZeroMQ的明确目标是“成为标准网络协议栈的一部分,之后进入Linux内核”,现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD套接字之上的一层封装。 ZeroMQ让编写高性能网络应用程序极为简单和有趣。

Antonio Garrote赞同Ilya的观点:
ZeroMQ的确非常强大,除了快速和高效之外,它还大大简化了应用程序交互层的设计。此外,它还使得在多种场景下重用相同的交互模式成为可能。 然而,在我看来,ZeroMQ应该被看作RabbitMQ之类的队列系统的补充,而不是替代品。与任何其他软件系统一样,仔细分析应用程序的需求就能让更加清楚哪种交互机制才是解决问题的最佳之选。
你在使用ZeroMQ吗?你如何看待它呢?

转自:http://www.infoq.com/cn/news/2010/09/introduction-zero-mq
再好的编程语言到了不会用的人手里,都会变成恶魔,不幸的是 - 不会用的是大多数。
回复

使用道具 举报

48

主题

613

帖子

3427

积分

五级会员

Rank: 8Rank: 8

积分
3427
发表于 2011-11-20 12:31:26 | 显示全部楼层

呵呵 日新月异啊

呵呵 日新月异啊
回复

使用道具 举报

5

主题

125

帖子

1338

积分

四级会员

Rank: 6Rank: 6

积分
1338
发表于 2011-11-20 13:21:56 | 显示全部楼层

这个库很不错,学习

这个库很不错,学习
回复

使用道具 举报

9

主题

65

帖子

386

积分

二级会员

Rank: 3Rank: 3

积分
386
发表于 2011-11-20 14:48:03 | 显示全部楼层

ZeroMQ 的服务端,客户端可以和socket建立的客户端或者服务端通信吗

ZeroMQ 的服务端,客户端可以和socket建立的客户端或者服务端通信吗
回复

使用道具 举报

37

主题

225

帖子

1451

积分

四级会员

Rank: 6Rank: 6

积分
1451
发表于 2011-11-20 18:21:14 | 显示全部楼层

哇塞,老大更新的进度是在太快了,ZeroMQ,protobuf都还没有个概念,要掉队了~{:soso_e118:}

哇塞,老大更新的进度是在太快了,ZeroMQ,protobuf都还没有个概念,要掉队了~{:soso_e118:}
回复

使用道具 举报

7

主题

32

帖子

232

积分

二级会员

Rank: 3Rank: 3

积分
232
发表于 2011-11-23 19:53:46 | 显示全部楼层

建议多来一两种模式的例子 :)

建议多来一两种模式的例子  :)
回复

使用道具 举报

5

主题

87

帖子

477

积分

二级会员

Rank: 3Rank: 3

积分
477
发表于 2011-11-24 15:00:36 | 显示全部楼层

[quote][size=2][color=#999999]wyyyh 发表于 2011-11-23 19:53[/color] [url=forum.php?

wyyyh 发表于 2011-11-23 19:53
建议多来一两种模式的例子  :)

request-reply(请求-应答)模式:
SVN: \upload\namwonsta\zguide\examples\aardio\hwclient.aau
SVN: \upload\namwonsta\zguide\examples\aardio\hwserver.aau

publish-subscribe(发布-订阅)模式:
SVN: \upload\namwonsta\zguide\examples\aardio\wuclient.aau
SVN: \upload\namwonsta\zguide\examples\aardio\wuserver.aau

push-pull(推-拉)模式,也称pipeline(管道)模式
SVN: \upload\namwonsta\zguide\examples\aardio\taskvent.aau
SVN: \upload\namwonsta\zguide\examples\aardio\taskwork.aau
SVN: \upload\namwonsta\zguide\examples\aardio\tasksink.aau

这些例子都是根据 0QM -The Guide 第一章 改写的,请参考此文档。
回复

使用道具 举报

7

主题

32

帖子

232

积分

二级会员

Rank: 3Rank: 3

积分
232
发表于 2011-11-24 19:12:46 | 显示全部楼层

{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}

{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}{:soso_e179:}
回复

使用道具 举报

9

主题

65

帖子

386

积分

二级会员

Rank: 3Rank: 3

积分
386
发表于 2011-11-24 19:15:47 | 显示全部楼层

[quote][size=2][color=#999999]namwonsta 发表于 2011-11-24 15:00[/color] [url=forum.

namwonsta 发表于 2011-11-24 15:00
request-reply(请求-应答)模式:
SVN: \upload\namwonsta\zguide\examples\aardio\hwclient.aau
SVN: \u ...

版主真给力能不能在来个asyncsrv的例子先谢了
回复

使用道具 举报

39

主题

196

帖子

1274

积分

四级会员

Rank: 6Rank: 6

积分
1274
发表于 2011-11-25 16:59:14 | 显示全部楼层

暂时还没有用到,下次试试这个好东西,收藏!!

暂时还没有用到,下次试试这个好东西,收藏!!
回复

使用道具 举报

7

主题

32

帖子

232

积分

二级会员

Rank: 3Rank: 3

积分
232
发表于 2012-7-4 00:07:43 | 显示全部楼层

没有svn,例子也不在了

没有svn,例子也不在了
回复

使用道具 举报

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-22 07:03 , Processed in 0.078125 second(s), 23 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表