RSS Feed

Posts Tagged ‘zeromq’

  1. June 21, 2014 by xudifsd

    summer

    生活

    最近苏州经常下雨,晚上城市的灯光映射在道路的雨水上特别好看,而且不知道为什么苏州园区这边特别干净,雨后树叶上的水里完全不会像其他城市那样积满灰尘,这一点比我到过的任何城市都好,这种感觉真是太好了。

    现在每天的生活变得有些单一了,都是8点起来去实验室,然后待到晚上10点才回寝室睡觉,周末也不休。以前还会偶尔出去骑下车,但是最近实在是太忙了。虽然我的GSOC mentor没对我的工作量有什么要求,但是为了对项目表忠心(其实更主要的是为了刷github最长streak,笑),自己要求自己每天至少commit一次,已经这样坚持一个月了。顺便也锻炼下自己的耐心,因为发现很多事情最终只有坚持下来才会取得胜利,追求短平快的都不怎么靠谱。

    似乎一年前我在北京时出去面基、参加活动的次数比在苏州这多多了,一个原因也是苏州这边貌似很少有程序员的活动,另一个原因也是我们学校这边的学习氛围实在是太好了,不光是我周末基本不休,很多同学也是,晚上11点左右最后几班回寝室的公交总是挤满了科大的学生,这样也不好意思经常出去玩了。现在想想在这里学习可比上班累多了,不过好在都是在做自己想做的事情,在看自己想看的书,写自己想写的代码。再过几个月就要出去实习了,我想我以后应该会想念在这里的一年吧。

    前几天跟同学吃饭,他说在等车时听到几个同学在讨论我,说我很厉害、去Google之类的。哈哈,其实我在学校基本不认识几个人,很多人还都只是点赞之交,竟然还有人讨论我,而且还不是坏的方面。这么说来也可以认为我在学校还是小有名气的啊,这大概是因为我参加了GSOC,还被Clojure的某人采访的缘故吧。不过其实别人讨论自己对自己来说也没多大意义,也就只是个话题而已,而且群众们大约也不会去认真地了解一个人,大部分只是跟风而已。这从很多人都误以为我是去Google了就可以看出来,其实就是参加了个比赛,但是群众们就断章取义了。所以出名也就是这么回事罢了。

    技术

    技术方面自我感觉还是有挺多进步的。话说每天大部分时间都对着电脑写代码、看书,都没时间泡妹纸了,要是还没什么进步自己都不好意思了。不过我也觉得我这种生活状态需要些改变了,感觉很多程序员都会这样花大量时间在自己专业上,然后说自己只是感兴趣而已,现在觉得如果时间花在上面太多以至于都破坏生活平衡了还是不好的。这种状态很像玩游戏上瘾一样,因为靠智力去解决一个问题也是很容易上瘾的,所以还是要提醒自己不能因此破坏生活的平衡。

    最近又温习了下ZeroMQ,鉴于之前看到storm对于ZeroMQ是非java实现有抱怨,而且感觉看书和写应用代码仍然不足以让自己明白很多概念,所以自己在借鉴了一些nanomsg的概念的情况下重新发明了下轮子。才刚开始写,所以还只支持REQ/REP,并且要求send前必须connect,见测试例,但是现在至少能跑了。

    这样重新发明轮子后发现ZeroMQ的设计特别科学。比如,它不会对connect()send()做任何保证,甚至不要求send()前connect必须完成,而且这两个调用完全可以异步。现在想想,这样的设计很完美地减少了用户代码的复杂度,因为网络中的通信都是不靠谱的,可能发出的包会被丢弃,可能对方收到但是还没回应就崩溃了,所以对这两个调用做保证没有任何意义,还会让用户代码变得更复杂,不如让它变得廉价——只是将消息放入队列,让后台线程伺机发送,之后用户通过在recv()设置超时来确认消息是否被对方收到就好了。而且ZeroMQ把accept()完全隐去简直做得太妙了,这样就连服务器端的socket也变得非常廉价了,用户就完全不用把它想像成HTTP服务器那样的重型武器,变得很适合分布式组件间通信了。

    貌似这次技术部分写得又跟以前写的《给ZeroMQ做个广告》很像了。不过真心很推荐《ZeroMQ》这书,至少我从这书里学到很多东西。

    夏天了,也送大家一首歌吧。


  2. 给ZeroMQ做个广告

    October 15, 2013 by xudifsd

    接触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。。