我想知道使用Erlang的最常见的应用程序/网站/解决方案的列表,成功与否。
解释一下为什么它被用于特定的解决方案,而不是其他编程语言,也会非常受欢迎。
列出BAD Erlang案例研究(误用Erlang的案例)也会很有趣。
Erlang来自爱立信,在他们的一些电信系统中使用。
在电信行业之外,CouchDb(一个面向文档的数据库)可能是迄今为止最著名的Erlang应用程序。
为什么是Erlang ?来自概述(值得完整阅读):
文档、视图、安全和 复制模式,特殊 目的查询语言,效率高 强健的磁盘布局和 并发性和可靠性的性质 Erlang平台都是认真的 一体化为可靠而可靠 高效系统。< / p >
显然,雅虎使用Erlang制作了一个名为Harvester的东西。关于它的文章在这里:http://www.ddj.com/architect/220600332
ejabberd是最著名的erlang应用程序之一,也是我学习erlang的工具。
我认为这是学习erlang最有趣的项目之一,因为它真正建立在erlang的优势之上。(然而,有些人会说这不是OTP,但不用担心,里面仍然有大量优秀的代码……)
为什么?
XMPP服务器(如ejabberd)可以被视为高级路由器,在最终用户之间路由消息。当然还有其他特性,但这是即时消息服务器最重要的方面。它必须同时路由许多消息,并处理许多TCP/IP连接。
所以我们有两个特征:
这些是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.
access
Config
#config
type
这意味着它比链接if/else或switch/case来创建业务规则要容易得多。
if/else
switch/case
总结一下
编写可伸缩的服务器,这就是erlang的全部意义所在。一切都设计得很简单。关于之前的两个功能,我想补充一下:
mnesia
mochiweb
ejabberd
couchdb
webmachine
riak
更少的loc
还有Richard Jones的这篇文章。他将一个应用程序从c++重写为erlang:在erlang中减少了75%的行数。
我在写报告的过程中遇到了这个:声学射线追踪中的Erlang。
这是一个研究小组尝试使用Erlang进行声学射线追踪的经验报告。他们发现这样写程序更容易,bug更少等等。它的可伸缩性更差,执行速度比类似的C程序慢10倍。因此,它可能不太适合的一个地方是CPU密集型场景。
不过要注意的是,写这篇论文的人还处于第一次学习Erlang的阶段,可能还不知道CPU密集型Erlang的正确开发过程。
上面已经介绍了Erlang最常见的应用程序(CouchDb, ejabberd, RabbitMQ等),但我想贡献以下内容。
在这些应用程序中使用它的原因来自Erlang的核心优势:管理应用程序可用性。
Erlang是为电信环境从头开始构建的,该环境要求系统满足至少5x9的可用性(每年99.999%的正常运行时间)。这个数字并没有给一年的停机时间留下太多的空间!主要出于这个原因,Erlang加载了以下特性(非详尽的):
水平可扩展性(能够通过无缝的内部&轻松地跨机器边界分配作业;机器间通信)。内置数据库(Mnesia)也是自然分布的。
垂直可伸缩性(在同一台机器上跨处理资源分配作业的能力):SMP是本地处理的。
Code热插拔:在操作过程中更新/升级代码live
异步:现实世界是异步的,所以Erlang被构建来考虑这个基本性质。促成这一需求的一个特性是:Erlang的“自由”进程(>32000可以并发运行)。
监督:许多不同的进程监督策略,包括重启策略、阈值等。帮助更容易地从极端情况/过载中恢复,同时仍然保持问题的痕迹,以供以后的故障排除,事后分析等。
资源管理:调度策略,资源监控等。注意,默认的进程调度器使用O(1)伸缩。
实时调试:随意“登录”到实时节点的能力有助于故障排除活动。调试可以实时进行,可以完全访问任何进程的运行状态。此外,内置的错误报告工具也非常有用(但有时使用起来有些笨拙)。
当然,我可以谈论它的功能根源,但这方面与主要目标(高可用性)有点正交。在我看来,有助于实现目标的功能性质的主要组成部分是:“不分享任何东西”。这一特性有助于控制“副作用”并减少对昂贵的同步机制的需求。
我想所有这些特性都有助于在关键业务应用程序中使用Erlang。
有一件事Erlang并不擅长:处理大数据块。
从Erlang编程:
alt text http://bks8.books.google.com/books?id=Qr_WuvfTSpEC&printsec=frontcover&img=1&zoom=5&sig=ACfU3U2F4YY4KqO0vCuZ4WEZjdE2yFFvvg
•亚马逊使用Erlang实现SimpleDB,提供数据库服务作为一部分
•雅虎在其社交书签服务Delicious中使用它,该服务有超过 500万用户和1.5亿书签url。
•脸谱网使用Erlang来支持其聊天服务的后端,处理超过 1亿活跃用户。 WhatsApp使用Erlang运行消息服务器,实现每个服务器多达200万连接用户
t - mobile在其SMS和认证系统中使用Erlang。
摩托罗拉在公共安全行业的呼叫处理产品中使用Erlang。
•爱立信在其支持节点中使用Erlang,用于GPRS和3G移动网络 全球。< / p >
•RabbitMQ, AMQP消息传递协议实现。AMQP是新兴的 高性能企业消息传递的标准
Erlang的优势在于它是一种没有共享内存的函数式语言。因此,在我看来,Erlang不适合需要内存操作的应用程序。例如图像编辑。
erlang有什么好处?
http://beebole.com/en/blog/erlang/why-erlang/
http://www.aquabu.com/2008/2/15/erlang-pragmatic-studio-day-3-notes
http://www.reddit.com/r/programming/comments/9q0lr/erlang_and_highfrequency_trading/ (jerf的回答)< / p >
重要的是要意识到Erlang的四个部分:语言本身,vm (BEAM, hipe)标准库(加上github, CEAN等上的模块)和开发环境正在稳步更新/扩展/改进。例如,我记得读到过,当Wings3d的作者意识到它需要改进时,浮点性能得到了改善(我找不到这个来源)。这个人就写了:
http://marian-dan.com/wordpress/?p=324
几年前,Tim Bray的Wide Finder的宣传和所有开始做web应用框架和HTTP服务器的人(至少部分地)导致了改进的正则表达式和二进制文件处理。还有所有集成HiPE和SMP的工作,透析器项目,多单元测试和构建库的涌现,..
困难的是官方文档不能很好地跟上,邮件列表和erlang博客圈的容量正在迅速增长
我们使用Erlang构建了一个博彩交易所(又名预测市场)。我们之所以选择Erlang而不是一些更传统的金融语言(c++、Java等),是因为它具有内置的并发性。市场的功能与电话交换机非常相似。我们的CTO在首席技术官说话上做了一个关于Erlang使用的演讲。
我们还使用CouchDB和RabbitMQ作为我们的堆栈的一部分。
我们正在使用Erlang为我们真正实时的基于浏览器的多人游戏Pixza提供后端肌肉力量。我们不使用Flash或任何其他第三方插件,尽管游戏是实时多人游戏。我们使用纯JS和COMET技术。Erlang支持Pixza的“真正的实时性”。
我就职于wooga,这是一家社交游戏公司,我们将Erlang用于游戏后端(游戏邦注:主要是面向数百万日常用户的http api)以及ios推送通知提供商、支付等辅助服务。
我认为它在与网络相关的任务中非常出色,它使构建和实现简单和复杂的网络服务变得非常简单。分布、容错和性能很容易实现,因为Erlang已经内置了一些关键成分,而且它们在关键的生产基础设施中已经使用了很长时间。所以它不像“0.0.2 alpha的新技术”。
我知道其他游戏公司也在使用Erlang。你们应该可以在幻灯片上找到相关的演示。