且听疯吟 如此生活三十年
Thoughts on Erlang and ejabberd

分析 WhatsApp 架构的时候提到了他们使用的 Erlang + ejabberd 架构。看起来非常神奇,但感觉想要直接搬过来也有一些问题。

Erlang

  • 优秀的工程师

    Erlang 看起来语法简单、函数式编程、并发能力强,但就是——会的人太少了,连 Facebook 都找不到足够的优秀 Erlang 程序员,这是为什么呢……反正我们 HR 表示目前连投简历的人都没有 XD
  • 语言本身

    刚接触 Erlang,只能说下初步的感受,也有可能是见识不及,权当一看。
    • 语法简单,特性少。很难说到底是优点还是缺点。Erlang 的语法可能一页纸就能写完。但是带来的是「我应该怎么开始?」这样的问题
    • 学习成本。无论鼓吹者宣扬函数式多么好,语言始终是用来解决问题的。Java 再烂依然大把公司用得很 happy 。大部分程序员是务实的,只有能带来好处才会去原因学习。但是对习惯了面向对象命令式编程的程序员来说,学习和思维转换的成本可能根本比带来的好处要大得多。Golang 比 Erlang 火不是没有理由的
    • 数据类型。比如不存在字符串而是使用 List ,不管从性能或是直觉上来说,总觉得有那么点奇怪
    • 数据抽象能力。用 Erlang 开发的复杂应用实在看得头疼,数据抽象能力弱好处是灵活,但导致的后果就是代码里到处充斥着不知道意义的 tuple 和 record,它们之间可能还层层嵌套,让我感觉脑子时刻准备 StackOverflow
    • 和其他语言的交互。Erlang 处处透露着一股高冷范儿,比如独特的错误恢复机制,自实现的进程等等,很难做到和其他语言合群。但是在自己的领域里,Erlang 做得足够好。

XMPP 协议

  • XMPP 协议实在是太「重」了!XMPP 协议基于 XML ,很大的问题是信息冗余太大,传输数据的很大部分(一般超过 60%)是协议相关,其中既有协议本身繁冗的关系,也有 XML 的原因。
    移动设备来说这将是个很大的问题——更多的流量消耗、以及相关的电量、网络效率等等。
  • XMPP 协议的另一个问题在于扩展的复杂。XMPP 协议本身已经定义了一大堆协议流程,如果想要在基础之上扩展,将会非常麻烦。
    基本上使用 XMPP 协议的服务最后都会改换成自定义协议(比如 WhatsApp),也不是没有原因的。

想要快速开发 Erlang + ejabberd 还是不错的,XMPP 协议本身很开放和完善,各种平台的实现也很多,用来快速原型还是不错的。但是想要实现深度的定制和优化可能就需要更多的时间和精力了,尤其对于移动平台来说。