Why Erlang

2011-03-17 04:15

Why Erlang

by yedingding

at 2011-03-16 20:15:26

original http://heikezhi.com/2011/03/16/why-erlang/

In-A-Gist是一个从实时数据流里汇总信息, 并实时地显示信息流行趋势的服务. 目前的主要信息来源是Twitter. 如果你有chrome/safari, 可以访问justinbieber.inagist.com, libya.inagist.com了解一下这个服务. In-A-Gist在他们的官方博客里面介绍了这个应用背后的一些技术, 是用erlang和websocket构建的, 解释了为什么他们选择erlang这个偏冷门的语言. 原文在http://blog.inagist.com/why-erlang?c=1.

轻量级进程

这个服务和其他服务最主要的区别就是如何实时的概括Tweet流. In-A-Gist并不是简单的把所有的tweet都存储下来做分析, 而是每个用户有自己的一个缓存区, 新的tweets会先进入这个区里. 当某个tweet或者其中的关键字被重复了多次以后, 这个tweet就会被提取出来. 这个过程就是Erlang的优势所在. 每个流消费者对应一个Erlang进程, 轻量级并且独立. 这个进程本质上就是一个用户代理, 获取tweets, 存入缓冲区, 最后向服务器提供数据. 从技术上而言, 这个进程是一个gen_server + supervisor的实现. 所以即使某个进程死掉的啊supervisor也会重启启动这个进程, 对其他的进程不会有任何的影响.

消息

那么这个进程和数据流之间是如何结合起来的呢. 这中间就多了一层: tweet处理进程组. 每个进程组维护tweet消费进程, 当从twitter streaming api里得到一个新的tweet后, 就会创建一个新的进程, 解码json流, 然后向下发消息给了之前提到的缓存区维护进程. 由于这种分散的架构, 系统很容易的分布开.

分布式的Erlang

很容易想到如果tweet疯涨的话, 那么跟着每一层的消费进程也需要疯涨, 系统的压力就会增加. 这里Erlang又派上用场了. Erlang是为了分布而生的, 原生就是分布式的. 所以进程组并不需要在同一台机器上, 而是可以跨机器存在. 也就是说每个tweet消费进程是分布在不同机器上的, 很容易地就实现了扩展性. 而且, 即使其中的机器当机了也不会影响集群里的其他机器继续提供服务.

实时传送

为了让消息能实时的显示在客户端, 这里使用了websockets. 当缓存区里tweets被分析出来属于热门消息时, 就会从区里提取出来, 转化为JSON对象, 然后经由WebSocket传送到客户端. 作者发布了一个chrome浏览器插件, 有兴趣的可以看一下.

流搜索

作者在这里还介绍了一下他们是如何用Riak来做存储和搜索系统的. Riak是Erlang写的一个NoSQL系统. 作者在Riak的基础上开发了流搜索功能. 有兴趣的可以看原文.

这片文章主要介绍了Erlang的优势和适合做怎样的系统. 大家有问题可以去博客上留言或者mention @jebui.

无觅猜您也喜欢:

Landing Page进化史

Hello world!

将任何网页变成Katamari Damacy游戏

世界,你准备好了吗?
无觅