ejabberd 是最知名的 erlang 应用程序之一,也是我学习 erlang 的工具。
我认为这是学习 erlang 最有趣的项目之一,因为它确实建立在 erlang 的优势之上。 (但是有些人会争辩说这不是 OTP,但不要担心里面仍然有大量出色的代码......)
为什么?
XMPP 服务器(如 ejabberd)可以被视为高级路由器,在最终用户之间路由消息。当然还有其他功能,但这是即时消息服务器最重要的方面。它必须同时路由许多消息,并处理许多 TCP/IP 连接。
所以我们有两个特点:
这些是 erlang 大放异彩的例子。
处理多个连接
使用 erlang 构建可扩展的非阻塞 TCP/IP 服务器非常容易。事实上,它就是为了解决这个问题而设计的。
鉴于它可以产生数十万个进程(而不是线程,它是一种无共享方法,设计更简单),ejabberd 被设计为一组 erlang 进程(可以分布式多台服务器):
- 客户端连接过程
- 路由器进程
- 聊天室进程
- 服务器到服务器进程
他们都在交换消息。
根据消息的某些方面路由消息
erlang 另一个非常可爱的特性是pattern matching。
它在整个语言中都使用。
例如,在下面:
access(moderator, _Config)-> rw;
access(participant, _Config)-> rw;
access(visitor, #config{type="public"})-> r;
access(visitor, #config{type="public_rw"})-> rw;
access(_User,_Config)-> none.
这是access 函数的 5 个不同版本。
Erlang 将根据收到的参数选择最合适的版本。 (Config 是 #config 类型的结构,它具有 type 属性)。
这意味着它比链接if/else 或switch/case 来制定业务规则非常简单和清晰。
总结
编写可扩展的服务器,这就是 erlang 的重点。一切都是为了让这一切变得简单而设计的。关于前两个功能,我要补充:
- 热代码升级
-
mnesia,分布式关系数据库(包含在基本发行版中)
-
mochiweb,大多数 http erlang 服务器都建立在上面
- 二进制支持(解码和编码二进制协议一如既往的简单)
- 一个拥有大量开源项目的优秀社区(
ejabberd、couchdb 以及 webmachine、riak 以及大量易于嵌入的库)
更少的 LOC
还有来自 Richard Jones 的 this article。他将一个应用程序从 C++ 改写为 erlang:erlang 中的行数减少了 75%。