`
litaocheng
  • 浏览: 337197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

又有人投入Erlang的怀抱了:37Signals Campfire loves Erlang

阅读更多
就喜欢看这样的东西...

This is so juicy I couldn’t resist blogging about it. 37Signals sysadmin and my good friend Mark Imbriaco replaced the Campfire chat room handler, originally written in C, with an Erlang version. The results?

283. As in 283 lines of Erlang code in toto.

1500. The Erlang poller handles 1200 - 1500 requests per second.

2.8. Average request time in milliseconds.

240. Number of requests, in millions, served since it went into production last friday.

恩,和我遇到的情况差不多呵呵.
几百行代码,分布式架构,几十K/s请求,没有内存泄漏,系统长久运行...

原文:
http://www.37signals.com/svn/posts/1728-nuts-bolts-campfire-loves-erlang
http://weblog.hypotheticalabs.com/?p=490
分享到:
评论
21 楼 whaosoft 2009-05-16  
哎 我都不会用这个
20 楼 Trustno1 2009-05-15  
night_stalker 写道
比 fib 速度请用 C,循环用 goto。C 写的单线程算法就打翻 VM 语言好多个核了。


这不一定,选对了算法javascrpit都会比C快.
首先,单线程的尾递归也好循环也好,最快也是O(n)的,而且无法并行运算.
但是吧fib(n)转换为
0 1
1 1
矩阵的n次幂,那么就可以并行计算,而且不光是并行计算,本身的单线程算法就可以从循环的o(n)下降为o(log(n)).

19 楼 ray_linn 2009-05-15  
Trustno1 写道
ray_linn 写道
Trustno1 写道
ray_linn 写道
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


Axum很简单啊

node1=[(1+√5)/2]^n
node2=[(1-√5)/2]^n

node3=(√5)*{node1-node2 }


Axum代码


 n -<< {node1,node2} &>- node3 ==> print_result

耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出5050.这种算法有精度问题不说,
如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么.


参见方法2,2个线程,各跑一只。




尾递归一个CPU就比你快了,n=100 f(n-1) 99次加法,fun(n-2) 98次加法.这还不算上堆栈和thread的开销.



这当然是和f(n-1)+f(n-2)的算法比,否则有啥可比性?
18 楼 night_stalker 2009-05-15  
比 fib 速度请用 C,循环用 goto。C 写的单线程算法就打翻 VM 语言好多个核了。

不过聊天室的 concurrency 和 parallel 真的没什么联系……
瓶颈不在 cpu,在 io 和锁。所以 C 算得快也没多大帮助。
17 楼 Trustno1 2009-05-15  
ray_linn 写道
Trustno1 写道
ray_linn 写道
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


Axum很简单啊

node1=[(1+√5)/2]^n
node2=[(1-√5)/2]^n

node3=(√5)*{node1-node2 }


Axum代码


 n -<< {node1,node2} &>- node3 ==> print_result

耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出5050.这种算法有精度问题不说,
如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么.


参见方法2,2个线程,各跑一只。




尾递归一个CPU就比你快了,n=100 f(n-1) 99次加法,fun(n-2) 98次加法.这还不算上堆栈和thread的开销.
16 楼 ray_linn 2009-05-15  
Trustno1 写道
ray_linn 写道
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


Axum很简单啊

node1=[(1+√5)/2]^n
node2=[(1-√5)/2]^n

node3=(√5)*{node1-node2 }


Axum代码


 n -<< {node1,node2} &>- node3 ==> print_result

耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出5050.这种算法有精度问题不说,
如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么.


参见方法2,2个线程,各跑一只。


15 楼 Trustno1 2009-05-15  
ray_linn 写道
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


Axum很简单啊

node1=[(1+√5)/2]^n
node2=[(1-√5)/2]^n

node3=(√5)*{node1-node2 }


Axum代码


 n -<< {node1,node2} &>- node3 ==> print_result

耍小聪明是不行滴.....不信你去试试看,让你算f(100),保证你算不出2550.这种算法有精度问题不说,
如果求n=100,递归算法是100次加法,你这个要200次乘法.你要达到递归算法的复杂度得跑两个cpu才行,这不是吃饱了撑的的么.

如果你是普通递归 f(n)=f(n-2)+f(n-1).不管你在几个CPU上跑都不会超过线性的尾递归算法.
如果是尾递归算法,是无法并行的.
14 楼 ray_linn 2009-05-15  
Trustno1 写道
ray_linn 写道
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


你指的是f(n-1)和f(n-2)之后采用并行?


常规的递归和非递归算法都是无法并行的,最好的情况也是o(n)的线性算法.
通项公式可以在一定范围内并行,但是超过一定的n就有很大的精度误差.



让F(n-1)和F(n-2)各在一个线索上跑,至少也可以double一倍(理论上)。

axum如此写

node1=n-1
node2=n-2

node3=f(n)
{ PrimaryChannel::Num1 ==> node1, PrimaryChannel::Num1 ==> node2 } &>- ipJoin -<: { node3, node3 } >>- PrimaryChannel::Sum;    



axum应该还可以通过票据来实现并行。。不过我还没仔细想过。
13 楼 Trustno1 2009-05-15  
ray_linn 写道
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


你指的是f(n-1)和f(n-2)之后采用并行?


常规的递归和非递归算法都是无法并行的,最好的情况也是o(n)的线性算法.
通项公式可以在一定范围内并行,但是超过一定的n就有很大的精度误差.
12 楼 ray_linn 2009-05-15  
Trustno1 写道
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?


Axum很简单啊

node1=[(1+√5)/2]^n
node2=[(1-√5)/2]^n

node3=(√5)*{node1-node2 }


Axum代码


 n -<< {node1,node2} &>- node3 ==> print_result
11 楼 Trustno1 2009-05-15  
Concurrency 是一个trival问题.Parallelism是No-trival的问题,不存在一个可以屏蔽掉所有细节的platform或者API集.换一句话说Parallelism很大程度上不是一个工程问题,更多的是算法问题甚至是数学问题.举个最简单的例子,如何并行计算Fabbonic数列?
10 楼 night_stalker 2009-05-15  
ShiningRay 写道
37signals憋不住了啊
受够rails的苦了吧


你没仔细看,这段东西之前是用 C 写的。
说明作者不喜欢语法像 C 的命令式语言,喜欢没括号没分号的函数式语言。
9 楼 ray_linn 2009-05-15  
litaocheng 写道
ray_linn 写道

litaocheng 写道ray_linn 写道
为了并行,我会选Axum而不是Erlang ..


很好,希望MS一统天下...哈哈


是保护既有资源,如果Axum能够做好并行与分布式,且能兼容你现有的代码,那我何必要Erlang?


呵呵,不好意思,俺没有什么.net现有代码可供保存.
合适的时候使用合适的工具,这个和语言没有关系。
不是说A干瓦工,后来又干木工,A就是全才,就是照顾自己的瓦工技能又追求卓越的木工本领。E来了,他二十年前就学习研究木工,我还是喜欢E。
呵呵,它很直接很纯粹,还有一点它很开放。


这种只是个人态度,不是工程态度。
8 楼 litaocheng 2009-05-15  
argan 写道
ShiningRay 写道

37signals憋不住了啊受够rails的苦了吧

这其实并不是rails不好,只不过是做 campfire这种应用确实是 erlang的强项


37signals,开始喜欢用合适的工具干合适的工作了。哈哈。
作者确实流露出了以前的某种痛苦哈哈。

7 楼 litaocheng 2009-05-15  
ray_linn 写道

litaocheng 写道ray_linn 写道
为了并行,我会选Axum而不是Erlang ..


很好,希望MS一统天下...哈哈


是保护既有资源,如果Axum能够做好并行与分布式,且能兼容你现有的代码,那我何必要Erlang?


呵呵,不好意思,俺没有什么.net现有代码可供保存.
合适的时候使用合适的工具,这个和语言没有关系。
不是说A干瓦工,后来又干木工,A就是全才,就是照顾自己的瓦工技能又追求卓越的木工本领。E来了,他二十年前就学习研究木工,我还是喜欢E。
呵呵,它很直接很纯粹,还有一点它很开放。
6 楼 ray_linn 2009-05-15  
litaocheng 写道
ray_linn 写道

为了并行,我会选Axum而不是Erlang ..


很好,希望MS一统天下...哈哈



是保护既有资源,如果Axum能够做好并行与分布式,且能兼容你现有的代码,那我何必要Erlang?
5 楼 argan 2009-05-15  
ShiningRay 写道

37signals憋不住了啊受够rails的苦了吧

这其实并不是rails不好,只不过是做 campfire这种应用确实是 erlang的强项
4 楼 ShiningRay 2009-05-15  
37signals憋不住了啊
受够rails的苦了吧
3 楼 Arbow 2009-05-15  
大姨妈的回复没打中靶子,litaocheng谈的场景是并发和分布,跟并行没啥瓜葛
2 楼 litaocheng 2009-05-15  
ray_linn 写道

为了并行,我会选Axum而不是Erlang ..


很好,希望MS一统天下...哈哈

相关推荐

    Erlang入门:构建application练习4(进程link的作用)

    在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...

    Erlang入门:构建application练习5(监督树)

    Erlang是一种面向并发的、函数式编程语言,特别适合于构建高可用性和容错性的分布式系统。在Erlang中,"应用"(application)是组织代码的基本单元,它包含了模块、配置文件以及启动和停止应用程序的逻辑。在这个...

    Erlang入门:构建application练习2

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。在本教程中,我们将深入探讨如何使用Erlang构建一个名为"Application"的基本应用程序,这在...

    编写分布式的Erlang程序:陷阱和对策

    总体而言,编写分布式的Erlang程序是一项既富有挑战性又充满机遇的任务。通过深入了解Erlang的分布式特性,识别并避免潜在的陷阱,开发者可以构建出高效、可靠且易于维护的分布式系统。此外,随着技术的进步和社区的...

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

    erlang文献及资料汇总

    erlang文献及资料汇总 入门资料: erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 ...

    Erlang:并行计算和云计算

    孟岩,中国知名的IT专家和作家,对Erlang有深入研究。他的作品《孟岩谈Erlang:并行计算和云计算》详细解读了Erlang在这些领域的应用,涵盖了语言基础、并发模型、分布式系统设计以及实际案例分析,是学习Erlang和...

    《Erlang之父:为什么面向对象很糟糕》PDF

    《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF 《Erlang之父:为什么面向对象很糟糕》PDF

    erlang最新api

    ### Erlang标准库(STDLIB)与I/O协议详解 #### 概述 Erlang是一种功能强大且灵活的编程语言,广泛应用于构建高并发、容错...随着技术的进步和需求的变化,Erlang I/O协议也在不断演进,未来可能会有更多的改进和完善。

    erlang lib of iconv

    Erlang库中的iconv是一个用于字符编码转换的模块,它是Erlang编程语言与不同字符集之间交互的重要工具。Erlang是一种并发性极强、适合构建分布式系统的动态类型语言,而iconv库则提供了在Erlang环境中处理字符串编码...

    Centos7安装RabbitMQ的文档和安装包(包含erlang安装包).rar

    RabbitMQ基于Erlang编程语言,因此在安装RabbitMQ之前,我们需要先安装Erlang环境。本文将涵盖以下几个关键知识点: 1. **Erlang安装**: Erlang是RabbitMQ的基础,因为RabbitMQ是用Erlang编写的。首先,我们需要...

    erlang programming

    这通常需要对Erlang的VM(Virtual Machine)和调度器有深入理解。 8. **Erlang与其他技术的集成**:Erlang可以与其他语言如Java、Python等集成,用于构建混合系统。例如,使用Erlang的Ranch和Cowboy库可以构建高...

    erlang资源

    Erlang是一种面向并发的、函数式编程语言,由瑞典...这两本书结合阅读,将为初学者提供一个全面的Erlang学习路径,从基础语法到高级并发编程技巧,有助于深入理解Erlang语言及其在构建高并发、分布式系统中的强大能力。

    RabbitMQ3.9.13和ErLang24.2版本

    **RabbitMQ 3.9.13与Erlang 24.2 版本详解** RabbitMQ是一款开源的消息代理和队列服务器,它使用AMQP(Advanced Message Queuing Protocol)协议,广泛应用于分布式系统中的消息传递。RabbitMQ 3.9.13是该软件的一...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...

    Erlang list用法

    Erlang是一种并发、分布式、面向进程的编程语言,广泛用于构建高可用性和容错性的系统。在Erlang中,列表是一种基本的数据结构,提供了丰富的操作函数。以下是对标题和描述中提到的Erlang列表函数的详细解释: 1. `...

    erlang_版本24.3.4.4

    - **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    图书:Erlang和OTP实战

    《Erlang和OTP实战》是一本专注于Erlang编程语言和OTP(Open Telecom Platform)框架的专业书籍。这本书深入浅出地介绍了Erlang在分布式系统、并发处理以及高可用性设计中的应用,同时结合 OTP 提供了强大的工具和库...

    Erlang编程

    - **消息传递**:Erlang中的进程通过消息传递来交互,每个进程都有一个消息队列,它只会在接收到消息时才运行。 - **容错性**:Erlang的容错机制包括无共享内存、无锁编程和热代码升级等,使得在部分系统故障时,...

Global site tag (gtag.js) - Google Analytics