akka는 Erlang과 어떻게 비교됩니까? [닫은]


97

최근에 akka를보고 있는데 꽤 인상적입니다. 위치 투명성, 감독 계층 구조 등 erlang의 킬러 기능 대부분이있는 것 같습니다. erlang이 akka에없는 기능이 있습니까?


실제로 얼랭에 관한이 영화를보세요. 너무 나쁜 스칼라에 대한 것도 없다 youtube.com/watch?v=G0eBDWigORY
mhstnsc은

답변:


123

면책 조항 : 나는 Akka의 PO입니다

  • Erlang은 전송시 복사를 수행합니다. Akka는 VM 내 전송에 공유 메모리 (불변 개체)를 사용합니다.
  • Erlang은 프로세스 별 GC를 수행합니다-Akka는 JVM GC를 사용합니다.
  • Erlang에는 OTP가 있습니다 . Akka는 전체 Java 에코 시스템 (Apache Camel, JAX-RS 등)과 통합됩니다.
  • Erlang이 프로세스 스케줄링을 수행합니다. Akka를 사용하면 무한 구성 기회로 다양한 Dispatcher를 사용할 수 있습니다.
  • Erlang은 핫 코드 재로드를 수행합니다. Akka는이를 지원할 수 있지만 JVM 클래스 로딩으로 인해 유연성이 떨어집니다.

그것들은 내 머리 꼭대기에서 나온 것입니다.

반면에 Akka를 사용한다는 것은 Scala, Java, Groovy 또는 JRuby를 사용하여 애플리케이션을 작성할 수 있음을 의미합니다.


39
Erlang 객체는 또한 불변이며 동시성 모델은 동일한 노드 내에서 복사 중 복사가 필요하지 않습니다. 개체에 대한 BEAM 은 참조를 보냅니다. 출처 : @rvirdig 의이 SO 답변 .
FooF

26
Erlang은 GC를보다 효율적으로 만들기 위해 복사시 복사를 수행합니다. 프로세스별로 작업 할 수 있습니다. 이것이 바로 JVM / Akka 앱과 달리 Erlang 앱에서 GC 일시 중지가없는 이유입니다.
andreypopp

4
글쎄, Andrey, 그런 종류는 사용하는 JVM / GC에 따라 다릅니다. azulsystems.com/products/zing/whatisit
Viktor Klang

4
Erlang은 각 프로세스에 대한 감소 번호를 가지고 있습니다. 바쁜 계산 루프에 있더라도 Erlang VM은 프로세스를 일시 중지하고 다른 배고픈 프로세스가 더 많은 CPU 사이클을 사용하도록 할 수 있습니다. 이것은 JVM이 제공하지 않는 매우 중요한 기능입니다.
다니엘

6
@MaX Erlang은 JIT 지원이 없기 때문에 Java보다 5 배 더 느립니다. 그러나 Erlang은 GC 일시 중지가 없으며 동시성 및 7 * 24 통신 응용 프로그램을 위해 설계되었으며, Erlang은 프로세스 공정성, 기아 및 교착 상태를 방지하는 데 더 많은 관심을 갖고 있으며 JVM과 같은 처리량을 위해 설계되지 않았습니다. 그래서, 정말 오렌지와 사과입니다.
다니엘

74

Erlang에서 프로세스는 약 1000 회 감소 할 때마다 전환됩니다. Scala / Akka와 같은 순진한 프레임 워크에서 에이전트는 수신 작업이 완료 될 때까지 스케줄러를 소유합니다. 장군. 게임 끝. Hasta la vista :) 사람들, 의사 기술에 시간을 낭비하지 마십시오. 여기 사람들이 Scala와 Erlang을 비교하는 것에 충격을 받았습니다.

또한 소위 "킬러 기능"이라고하는 다른 많은 기능이 있지만 여기에 제 조언이 있습니다. 기능에 대해 생각하지 말고 특정 언어를 가능하게하는 관용구에 대해 생각하십시오. Scala는 "최고의 기능"을 훔칩니다. Erlang은 올바른 관용구에서 파생 된 높은 수준의 언어로 시스템을 안정적으로 구축 할 수 있도록 올바른 관용구를 사용 / 구현합니다. 당신이 Erlang을 배울 때 당신은 당신의 마음을 재건하고 있고, 신뢰할 수있는 분산 시스템에 대해 생각하는 방식을, Erlang은 당신을 가르치고 업그레이드합니다. Scala는 다른 언어에서 좋은 기능을 훔치려는 또 다른 명령형 (오, 죄송합니다, 다중 패러다임, 재미있는 단어) 언어입니다.


9
모든 IO를 암시 적으로 비동기로 만드는 Erlang 방식은 매우 우아합니다. 비동기 IO는 Scala에서 NIO API를 사용하여 수행 할 수 있습니다. 이것은 나에게 체크 메이트처럼 보이지 않지만 덜 우아한 솔루션입니다.
HRJ 2011 년

7
도대체 무슨 말을하는거야?! 라운드 로빈 스케줄링보다 1000 개의 연속적인 작업을 처리하는 것이 어떻게 더 나은가, 또는 심지어 가장 작은 메일 박스 스케줄링에 가깝습니다 !!
FUD

8
@vjache-동의합니다. 자바 프로그래머로서 수년 동안 저에게 배웠던 것은 언젠가는 당신 아래의 레이어를 조사해야 할 것입니다. Scala / Akka는 다른 많은 레이어 (예 : nio, netty 등) 위에있는 또 다른 레이어로 보이며,이 모든 것을 어느 시점에서 이해해야합니다. 방금 Erlang 작업을 시작했지만 작업을 완료하기 위해 이해해야하는 레이어가 더 적을 것 같습니다. Erlang의 분산 프로그래밍은 Scala / Akka에 비해 훨씬 가벼운 무게를 느낍니다. 아마도 파이썬이 웹 앱용 자바보다 가벼운 대안이었던 것과 비슷할 것입니다.
Chris Snow

@FUD : 그가 1000 개의 Erlang 명령을 의미했을까요? 그는 ... 1000 메시지가 의미가 없습니다
에릭 Kaplun을

2
@ErikAllik 그는 1000 "감소"를 의미했습니다. 감소를 약간의 코드를 실행하기위한 토큰으로 생각하십시오 (그렇지 않지만 설명하는 역할을합니다 ...). 1000 회 감소 후 스케줄러는 다른 프로세스로 전환됩니다. erlang.org/pipermail/erlang-questions/2001-April/003132.html
Aegis

40

거의 아무도 프로세스 격리에 대해 언급하지 않습니다. "당신의 쓰레드는 내 쓰레기를 엉망으로 만들 수 없다"는 보장이 없다면 분산 시스템은 추론하기가 훨씬 더 어렵습니다. (그들은 이미 충분히 어려운 것 얼랑의 프로세스.)

AFAIK (JVM에 대한 나의 제한된 직접적인 경험을 감안할 때 멀지 않음), Erlang만이 실제로 JVM에서 "올바른"프로세스 격리를 얻습니다. Google은 "마이크로 재부팅"기술 ( "복구 지향 컴퓨팅")을 사용하는 연구 시스템에 대해 Fox와 Candea (?)의 연구를 어디서 찾을 수 있는지에 대한 몇 가지 힌트를 줄 수 있습니다. 얼랭 개발자는 그 연구를 읽고 몇 가지를 말합니다.

  1. 클럽에 오신 것을 환영합니다. 왜 그렇게 오래 걸렸나요?
  2. 하지만 JVM은 가입을 끔찍하게, 끔찍하게 어렵게 만듭니다. :-)

프로세스 격리는 정말 훌륭합니다. 그러나 Erlang조차도 잘못된 NIF에 면역이 아닙니다.
빅토르 클랑

14

저에게있어 다운 타임없이 전체 Erlang 클러스터에서 핫 코드 스와핑 (예 make:all([netload]:)은 Erlang 킬러 기능 중 하나입니다.

그러나 당신의 질문을 뒤집어 보겠습니다. Erlang이 가지고 있지 않은 akka는 무엇입니까? 물론 자바에 수십 개의 확장 및 라이브러리 (scala, akka, spring, osgi, ...)를 추가하여 Erlang에 가까워 질 수 있습니다. 그러나 요점은 어디입니까? 요약하면, 이러한 모든 확장은 다운 타임없이 최고의 확장 성을 제공하는 작업을 수행 할 수 있음이 20 년 이상 입증 된 단순한 Erlang 언어를 배우는 것보다 훨씬 더 복잡합니다.


30
IMO, Scala는 Erlang보다 구문 수준에서 훨씬 더 나은 언어입니다. 객체, 특성, 적절한 네임 스페이스, 적절한 유형 안전성, 추악한 레코드 구문 등이 없습니다. 커뮤니티가 더 크고 사용 가능한 모든 Java 도구를 사용할 수 있으며 더 세련되게 느껴집니다.
ryeguy 2010

15
@ryeguy : "구문 수준에서 더 나은 언어"... 흠, "구문"에 대해 "더 나은"을 정의합니다. 내가 언어를 비교할 때 구문은 가장 무관 한 요소입니다 (왜냐하면 그것은 단지 취향이나 당신이 사용하는 것에 대한 문제이기 때문입니다).
Peer Stritzinger 2010

4
@ryeguy 다른 의미론, 다른 구문.
rvirding 2010

3
서로 다른 코드 버전 간의 상태를 유지해야하는 경우 핫 코드 스와핑이 고통되고, 결국 그것은 시작에 종료 과정 및 마이그레이션 상태로 쉽게
OlegYch

4
@ryeguy 프로그래밍 언어의 구문은 무관합니다. 중요한 것은 의미론입니다. Erlang은 기능적 PL이므로 물론 객체가 없습니다. 특성, 유형 안전성 등은 Scala가 강력한 유형의 언어이기 때문이며 Erlang은 동적으로 유형이 지정됩니다. 그것은 디자인 선택입니다. 그럼에도 불구하고 더 현대적인 느낌의 Erlang의 이점을 원한다면 Elixir를 살펴 보도록 권합니다.)
Aegis Aegis

5

아마도 Erlang은 더 큰 분산 시스템 (vjache의 대답에 따름)에 더 좋지만 여러 CPU의 전체 성능을 사용하려는 일반 서버의 경우 Akka가 좋은 선택입니다. 우수한 추상화, 성능 및 Java 에코 시스템과의 통합을 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.