接触ZeroMQ纯属巧合:几个月前实习时,老大让我学学RabbitMQ,好给同事讲解,因为之前听说过ZMQ,但是一直没有时间去了解。于是借着那个机会顺便了解ZMQ,这样讲解时也方便通过比较了解两个工具,碰巧ZeroMQ的新书出来了。读完后,感觉收获很多,准备把它翻译出来,已经翻译了一章。所以现在就出来给ZeroMQ做个广告。
装备了epoll的socket
如果要用一句话来解释ZMQ,我觉得最合适的就是上面的这个小标题了。
传统上进行网络编程就必须使用socket,但socket的抽象太低阶了,没有提供数据帧的抽象,并且更麻烦的是IO会成为瓶颈,要想可扩展性好就必须自己做epoll,这意味着只要是想通讯的部件就都要这样做,这样就可以想象很少有人会去这么做了。
所以ZMQ诞生了。解决了数据帧的问题:这样可以自己通过数据帧来实现转发逻辑。解决了epoll问题,每个ZMQ实例都自带epoll和后台IO线程,这样,使用者根本不需要在意IO扩展性问题,而且由于epoll是嵌入在库内部,就不需要像node那样把所有业务逻辑都围绕在event-loop上,制造callback hell。
有了这样的库,使用者可以更加关注于建立互联的网络、设计消息模式,而不是处理消息的并发。貌似erlang有这样的功能,但是我不懂erlang所以没办法比较。
在处理简单的问题时只需要REQ-REP和ROUTER-DELEAR这两种预设好的模式组合即可,对于复杂消息模式,也可以自己解决,由于ZMQ把消息做成一段段的数据帧,而且提供API来操作,所以要想实现更复杂的模式也可以通过自己建立中间代理,通过ZMQ暴露的数据帧自己实现路由逻辑。详细见ZeroMQ的第三章。
为什么ZMQ会存在,就是因为分布式需要这样的工具。
背后原理
分布式带来的是去中心化,这样在普通PC上提高了集群的可靠性。去中心化在政治方面产生民主,在软件方面提高可靠性,这两者其实殊途同归。同理,民主的保障是言论自由,而软件的保证就是通信API的简化。如果没有简单的通信API也就不会有人去尝试构建复杂的分布式系统,Linus在关于git的演讲中提到git的分支比svn廉价很多时就说到,“工具会改变人们工作的方式”,我觉得这句话也适用于ZeroMQ。
而且ZeroMQ的书确实是我看到的非常启发人的书了,觉得仅次于SICP。不光是推荐想学ZeroMQ的人去看,对于其他方面的编程也很有帮助,下面摘抄两段我感触比较深的:
Programming is a science dressed up as art, because most of us don’t understand the physics of software and it’s rarely, if ever, taught. The physics of software is not algorithms, data structures, languages, and abstractions. These are just tools we make, use, and throw away. The real physics of software is the physics of people.
Which brings us back to the science of programming. To fix the world, we needed to do two things. One, to solve the general problem of “how to connect any code to any code, anywhere.” Two, to wrap that up in the simplest possible building blocks that people could understand and use easily.
失误
但是觉得ZMQ做错了几件事:第一,最初版本的ZMQ使用C++写。第二,修正版的ZMQ即nanomsg使用C写。这里不是说这两个语言不好,只是说这样针对的的用户群不对,对ZMQ需求最大的就是分布式应用了,但是分布式的应用有几个是拿C写的?C++倒是在Google内部很流行,但是开源的Google工具克隆全是java写的,所以个人认为ZMQ应该拿java实现,这样也就不会有storm提到的问题了。
要不是现在忙着要跟老师做编译器的东西,我倒真想去写个java版的ZMQ。。