Erlang 在哪里使用,为啥? [关闭]

Posted

技术标签:

【中文标题】Erlang 在哪里使用,为啥? [关闭]【英文标题】:Where is Erlang used and why? [closed]Erlang 在哪里使用,为什么? [关闭] 【发布时间】:2010-12-10 19:45:28 【问题描述】:

我想知道使用 Erlang 的最常见的应用程序/网站/解决方案的列表,成功与否

也非常感谢解释为什么将它用于特定解决方案而不是其他编程语言。

列出 BAD Erlang 案例研究(滥用 Erlang 的案例)也会很有趣。

【问题讨论】:

BAD 案例研究的问题在于,它们并没有真正出名,也没有见光。 WHATSAPP 使用 Erlang !谷歌了解详情 EMqtt 是一个非常流行的 MQTT 代理,如今在物联网中得到了如此广泛的应用,它是用 erlang 开发的,拥有 100 万用户。 最好的问题和答案因此在 *** 上关闭。叹息。 【参考方案1】:

Erlang 来自爱立信,并在他们的一些电信系统中使用。

在电信之外,CouchDb(一个面向文档的数据库)可能是迄今为止最著名的 Erlang 应用程序。

为什么选择 Erlang?来自overview(值得全文阅读):

文档、视图、安全性和 复制模型,特殊 目的查询语言,高效 和强大的磁盘布局和 并发和可靠的性质 Erlang平台都是用心的 集成为一个可靠和 高效的系统。

【讨论】:

对于他们的一些电信系统。 CouchDB 不是一个面向对象的数据库,它是一个面向文档的数据库。 @我给出了非常糟糕的建议——是的,当然。已更正。我会改变你的绰号:-) 爱立信使用了一种较早的并发语言,称为 PLEX(交换编程语言),它在 80 年代后期一直运行数字电话交换。我认为 erlang 是 PLEX 的改进版。【参考方案2】:

显然,雅虎使用 Erlang 制作了一款名为 Harvester 的东西。关于它的文章在这里:http://www.ddj.com/architect/220600332

【讨论】:

从文章中读到:“虽然 Harvester 最初是用 Perl 编写的,但 Erlang 的高级并发构造 - 以及 OTP 设计原则 - 使其成为构建可靠、容错和像 Harvester 这样的可扩展应用程序。由此产生的服务更具可扩展性、可用性、可靠性,并且能够在更轻的代码库和更便宜的开发工作上遵守更严格的服务级别协议 (SLA)。”。非常感谢:)【参考方案3】:

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, #configtype="public")->  r;
access(visitor, #configtype="public_rw")->  rw;
access(_User,_Config)->  none.

这是access 函数的 5 个不同版本。 Erlang 将根据收到的参数选择最合适的版本。 (Config#config 类型的结构,它具有 type 属性)。

这意味着它比链接if/elseswitch/case 来制定业务规则非常简单和清晰。

总结

编写可扩展的服务器,这就是 erlang 的重点。一切都是为了让这一切变得简单而设计的。关于前两个功能,我要补充:

热代码升级 mnesia,分布式关系数据库(包含在基本发行版中) mochiweb,大多数 http erlang 服务器都建立在上面 二进制支持(解码和编码二进制协议一如既往的简单) 一个拥有大量开源项目的优秀社区(ejabberdcouchdb 以及 webmachineriak 以及大量易于嵌入的库)

更少的 LOC

还有来自 Richard Jones 的 this article。他将一个应用程序从 C++ 改写为 erlang:erlang 中的行数减少了 75%。

【讨论】:

公平地说,几乎所有用现代语言重写的 C++ 代码都会减少 LOC。【参考方案4】:

我在写报告的过程中发现了这个:Erlang in Acoustic Ray Tracing。

这是一个研究小组尝试使用 Erlang 进行声学射线追踪的经验报告。他们发现,虽然编写程序更容易,错误更少等。它的扩展性更差,并且执行速度比同类 C 程序慢 10 倍。因此,它可能不太适合的一个地方是 CPU 密集型场景。

但请注意,撰写本文的人正处于第一次学习 Erlang 的阶段,并且可能不知道 CPU 密集型 Erlang 的正确开发过程。

【讨论】:

这篇论文读起来很有趣。它没有直接对适用性进行概括,它表明如果您尝试在 Playstation 3 中的 IBM Cell BE 处理器上部署,他们发现 Erlang 不适合。它还指出他们对 Erlang 缺乏经验。有了更多的经验和合适的硬件,他们可能得出了不同的结论。我的印象是他们的代码可能包含了非尾递归函数的使用;如果是这样,那么它可能会在某种程度上解释他们在内存、垃圾收集、崩溃和性能方面的问题。 我认为您误读了这篇文章。不幸的是,无法在 Cell 处理器上运行,但这只是一个侧面说明。在 x86 平台上运行的 C++ 和 Erlang 实现之间 12 倍的性能差异是真正的问题,而且它不能线性扩展。也就是说,他们是这门语言的新手,可能采取了一些不明智的代码路径……这就是生活。不过我对非线性缩放很好奇。 关于 Intel 与 Cell 的 12 倍性能问题我已得到纠正,但我坚持认为 Erlang 可以非常适合 CPU 具有挑战性的场景。这并不是说他们不对:这确实可能是一个好的 C++ 解决方案总是会击败好的 Erlang 解决方案的问题。也许这确实在某种程度上提醒了一些人,Erlang 和任何其他技术一样,不是灵丹妙药,只有在正确的地方以正确的方式使用它才会发光。【参考方案5】:

已涵盖的 Erlang 最常见应用程序列表(CouchDb、ejabberd、RabbitMQ 等),但我想贡献以下内容。

之所以在这些应用程序中使用它,来自于 Erlang 的核心优势:管理应用程序可用性

Erlang 专为电信环境而构建,要求系统至少满足 5x9 的可用性(每年 99.999% 的正常运行时间)。这个数字在一年内不会给停机留下太多空间!主要出于这个原因,Erlang 加载了以下特性(并非详尽无遗):

水平可扩展性(通过机器内部和机器间的无缝通信轻松跨机器边界分配作业的能力)。内置数据库(Mnesia)也是自然分布的。

垂直可扩展性(在同一台机器上跨处理资源分配作业的能力):SMP 是本地处理的。

代码热交换:在操作期间实时更新/升级代码的能力

异步:现实世界是异步的,所以 Erlang 的构建就是为了解释这种基本性质。促成这一要求的一个特性:Erlang 的“免费”进程(>32000 可以同时运行)。

监督:许多不同的流程监督策略,包括重启策略、阈值等。有助于更轻松地从极端情况/重载中恢复,同时仍保留问题的痕迹以供日后故障排除,事后分析等。

资源管理:调度策略、资源监控等。请注意,默认进程调度程序以 O(1) 缩放运行。

实时调试:随意“登录”到实时节点的能力有助于排除故障。可以在完全访问任何进程的运行状态的情况下实时进行调试。内置的错误报告工具也非常有用(但有时使用起来有些尴尬)。

当然,我可以谈论它的功能根源,但这方面与主要目标(高可用性)有些正交。对目标目标做出慷慨贡献的功能性质的主要组成部分是,IMO:“不分享任何东西”。此特性有助于控制“副作用”并减少对昂贵同步机制的需求。

我想所有这些特性都有助于扩展在关键业务应用程序中使用 Erlang 的案例。

Erlang 不擅长的一件事:处理大块数据。

【讨论】:

您能否解释一下以下内容:“Erlang 不太擅长的一件事是:处理大块数据。” 他的意思是解码 mpeg 数据。 Erlang 没有针对太多的数值计算进行优化。如果处理只是涉及将大块数据从一个地方移动到另一个地方,那么 Erlang 就非常擅长。 (文件到 TPC 套接字等) 您无法更新共享数据块(Erlang 中没有指针),因此数据必须在进程之间穿梭,这反过来又会导致效率低下。 顺便说一句,我相信爱立信说 Erlang 实现了 9x9 的可用性。 我们正在 contemplating 改进此处引用的 Erlang 的弱点。【参考方案6】:

来自Erlang 编程

alt text http://bks8.books.google.com/books?id=Qr_WuvfTSpEC&printsec=frontcover&img=1&zoom=5&sig=ACfU3U2F4YY4KqO0vCuZ4WEZjdE2yFFvvg

许多公司在他们的生产系统中使用 Erlang:

Amazon使用Erlang实现SimpleDB,作为一部分提供数据库服务 Amazon 弹性计算云 (EC2)。

Yahoo! 在其社交书签服务 Delicious 中使用它,该服务拥有超过 500 万用户和 1.5 亿个书签 URL。

Facebook 使用 Erlang 为其聊天服务的后端提供支持,处理超过 1亿活跃用户。 • WhatsApp 使用 Erlang 运行消息服务器,每台服务器可连接多达 200 万用户。

T-Mobile 在其 SMS 和身份验证系统中使用 Erlang。

摩托罗拉正在公共安全行业的呼叫处理产品中使用 Erlang。

爱立信在其支持节点中使用 Erlang,用于 GPRS 和 3G 移动网络 全世界。

最流行的开源 Erlang 应用程序包括:

• 3D 细分建模器Wings 3D,用于建模和纹理多边形 网格。

Ejabberd 系统,它提供了可扩展的消息传递和状态协议 (XMPP) 基于即时消息 (IM) 的应用服务器。

CouchDB“无模式”面向文档的数据库,提供可扩展性 跨多核和多服务器集群。

MochiWeb 库,支持构建轻量级 HTTP 服务器。 它用于为 MochiBot 和 MochiAds 等服务提供动力,这些服务提供 每天为数百万观众动态生成内容。

RabbitMQ,一种 AMQP 消息传递协议实现。 AMQP 是一个新兴的 高性能企业消息传递的标准。

【讨论】:

facebook 离开了 erlang:facebook.com/notes/facebook-engineering/… 和 quora.com/… 你能更新这本书的失效链接吗?【参考方案7】:

Erlang 的优势在于它是一种没有共享内存的函数式语言。因此,IMO,Erlang 将不适合需要就地内存操作的应用程序。例如图像编辑。

【讨论】:

【参考方案8】:

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/ (杰夫的回答)

重要的是要意识到 Erlang 的 4 个部分:语言本身、VM(BEAM、hipe)标准库(加上 github、CEAN 等上的模块)和开发环境正在稳步更新/扩展/改进。例如,我记得当 Wings3d 的作者意识到它需要改进时,浮点性能得到了改进(我找不到这方面的来源)。而这个人刚刚写过:

http://marian-dan.com/wordpress/?p=324

几年前,蒂姆·布雷 (Tim Bray) 的 Wide Finder 宣传以及所有开始开发 Web 应用程序框架和 HTTP 服务器的人导致(至少部分)改进了正则表达式和二进制文件处理。集成 HiPE 和 SMP、透析器项目、多单元测试和构建库的所有工作如雨后春笋般涌现,..

所以它的甜蜜点正在扩大,困难的是官方文档跟不上,邮件列表和erlang博客圈的数量正在迅速增长

【讨论】:

【参考方案9】:

我们使用 Erlang 构建了一个betting exchange(又名预测市场)。由于内置的​​并发性,我们选择了 Erlang 而不是一些更传统的金融语言(C++、Java 等)。市场的功能与电话交换非常相似。我们的 CTO 在CTO talk 上发表了关于我们使用 Erlang 的演讲。

我们还使用 CouchDB 和 RabbitMQ 作为我们堆栈的一部分。

【讨论】:

请注意,您的演讲链接现在是私密的。【参考方案10】:

我们正在使用 Erlang 为我们基于浏览器的实时多人游戏 Pixza 提供后端肌肉力量。尽管游戏是实时多人游戏,但我们不使用 Flash 或任何其他第三方插件。我们改用纯 JS 和 COMET 技术。 Erlang 支持 Pixza 的“真正实时性”。

【讨论】:

【参考方案11】:

我在 wooga 工作,这是一家社交游戏公司,我们将 Erlang 用于我们的一些游戏后端(基本上是为数百万日常用户提供的 http api)和辅助服务,如 ios 推送通知提供程序、支付等。

我认为它确实在网络相关任务中大放异彩,并且可以直接在其中构建和实现简单和复杂的网络服务。分发、容错和性能很容易实现,因为 Erlang 已经内置了一些关键成分,并且它们在关键的生产基础设施中使用了很长时间。所以它不像“新的时髦技术 0.0.2 alpha”。

我知道其他游戏公司也使用 Erlang。您应该能够在 slideshare 上找到有关此的演示文稿。

【讨论】:

以上是关于Erlang 在哪里使用,为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ的安装

Windows10RabbitMq安装

Erlang 语言中的进程与并发

在 CentOS 7 上安装 RabbitMQ

RabbitMQ的下载安装

rabbitmq的安装