我想知道一个最常见的应用程序/网站/解决方案的列表,成功与否。
解释一下为什么它被用于特定的解决方案,而不是其他编程语言,也会非常受欢迎。
列出BAD Erlang案例研究(误用Erlang的案例)也会很有趣。
我想知道一个最常见的应用程序/网站/解决方案的列表,成功与否。
解释一下为什么它被用于特定的解决方案,而不是其他编程语言,也会非常受欢迎。
列出BAD Erlang案例研究(误用Erlang的案例)也会很有趣。
当前回答
Erlang来自爱立信,在他们的一些电信系统中使用。
在电信行业之外,CouchDb(面向文档的数据库)可能是迄今为止最著名的Erlang应用程序。
为什么是Erlang ?概述(值得一读):
文档、视图、安全性和 复制模式,特殊 目的查询语言,效率高 强健的磁盘布局和 并发性和可靠性的性质 Erlang平台都是认真的 一体化为可靠而可靠 高效的系统。
其他回答
ejabberd是最著名的erlang应用程序之一,也是我学习erlang的工具。
我认为这是学习erlang最有趣的项目之一,因为它真正建立在erlang的优势之上。(然而,有些人会说这不是OTP,但不用担心,里面仍然有大量优秀的代码……)
为什么?
XMPP服务器(如ejabberd)可以被视为高级路由器,在最终用户之间路由消息。当然还有其他特性,但这是即时消息服务器最重要的方面。它必须同时路由许多消息,并处理许多TCP/IP连接。
所以我们有两个特征:
处理多个连接 给消息的某些方面路由消息
这些是erlang大放异彩的例子。
处理多个连接
使用erlang构建可伸缩的非阻塞TCP/IP服务器非常容易。事实上,它就是为了解决这个问题而设计的。 考虑到它可以生成数十万个进程(而不是线程,它是一种不共享的方法,设计起来更简单),ejabberd被设计为一组erlang进程(可以分布在多个服务器上):
客户端连接流程 路由器进程 聊天室程序 服务器到服务器进程
他们都在交换信息。
给消息的某些方面路由消息
erlang的另一个非常可爱的特性是模式匹配。 它在整个语言中都有使用。
例如,在以下情况中:
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.
这是存取函数的5个不同版本。 Erlang将根据收到的参数选择最合适的版本。(Config是一个类型# Config的结构,它有一个type属性)。
这意味着,与链接if/else或switch/case来创建业务规则相比,它非常简单,也清楚得多。
总结一下
编写可伸缩的服务器,这就是erlang的全部意义所在。一切都设计得很简单。关于之前的两个功能,我想补充一下:
热代码升级 Mnesia,分布式关系数据库(包括在基本发行版中) 大多数HTTP Erlang服务器都构建在Mochiweb上 二进制支持(解码和编码二进制协议一如既往地简单) 一个很棒的社区,里面有很棒的开源项目(ejabberd, couchdb,还有webmachine, riak和一大堆很容易嵌入的库)
更少的 LOC
还有一篇来自理查德·琼斯的文章。他将一个应用程序从c++重写为erlang:在erlang中减少了75%的行数。
Erlang的优势在于它是一种没有共享内存的函数式语言。因此,在我看来,Erlang不适合需要内存操作的应用程序。例如图像编辑。
我是在写报告的过程中遇到的:声学射线追踪中的Erlang。
这是一个研究小组尝试使用Erlang进行声学射线追踪的经验报告。他们发现这样写程序更容易,bug更少等等。它的可伸缩性更差,执行速度比类似的C程序慢10倍。因此,它可能不太适合的一个地方是CPU密集型场景。
不过要注意的是,写这篇论文的人还处于第一次学习Erlang的阶段,可能还不知道CPU密集型Erlang的正确开发过程。
显然,雅虎使用Erlang制作了一个名为Harvester的东西。关于它的文章在这里:http://www.ddj.com/architect/220600332
上面已经介绍了Erlang最常见的应用程序(CouchDb, ejabberd, RabbitMQ等),但我想贡献以下内容。
在这些应用程序中使用它的原因来自Erlang的核心优势:管理应用程序可用性。
Erlang是为电信环境从头开始构建的,该环境要求系统满足至少5x9的可用性(每年99.999%的正常运行时间)。这个数字并没有给一年的停机时间留下太多的空间!主要出于这个原因,Erlang加载了以下特性(非详尽的):
Horizontal scalability (ability to distribute jobs across machine boundaries easily through seamless intra & inter machine communications). The built-in database (Mnesia) is also distributed by nature. Vertical scalability (ability to distribute jobs across processing resources on the same machine): SMP is handled natively. Code Hot-Swapping: the ability to update/upgrade code live during operations Asynchronous: the real world is async so Erlang was built to account for this basic nature. One feature that contributes to this requirement: Erlang's "free" processes (>32000 can run concurrently). Supervision: many different strategies for process supervision with restart strategies, thresholds etc. Helps recover from corner-cases/overloading more easily whilst still maintaining traces of the problems for later trouble-shooting, post-mortem analysis etc. Resource Management: scheduling strategies, resource monitoring etc. Note that the default process scheduler operates with O(1) scaling. Live debugging: the ability to "log" into live nodes at will helps trouble-shooting activities. Debugging can be undertaken live with full access to any process' running state. Also the built-in error reporting tools are very useful (but sometimes somewhat awkward to use).
当然,我可以谈论它的功能根源,但这方面与主要目标(高可用性)有点正交。在我看来,有助于实现目标的功能性质的主要组成部分是:“不分享任何东西”。这一特性有助于控制“副作用”并减少对昂贵的同步机制的需求。
我想所有这些特性都有助于在关键业务应用程序中使用Erlang。
Erlang确实不擅长的一件事是:处理大块数据。