Node.js 이벤트 시스템은 Akka의 행위자 패턴과 어떻게 다른가요?


93

나는 Node.js잠시 동안 함께 일했으며 Java를 꽤 잘 사용한다고 생각합니다. 하지만 방금 발견 Akka했고 즉시 그 배우 패턴에 관심이있었습니다 (내가 이해하는 바에서).

이제 내 JavaScript 기술이 Scala / Java 기술과 동등하다고 가정하고 두 시스템의 실용성에 초점을 맞추고 싶습니다. 특히 웹 서비스 측면에서.

Node가 많은 동시 작업을 처리하는 데 탁월하다는 것을 이해했습니다. 자산 관리 시스템을위한 좋은 Node 웹 서비스가 많은 사용자가 동시에 변경 사항을 제출하는 것을 처리하는 데 탁월 할 것이라고 생각합니다 (대량의 트래픽이 많은 애플리케이션에서).

그러나 Akka의 배우에 대해 읽은 후에는 똑같은 점에서 탁월 할 것입니다. 작업을 한 입 크기로 줄이는 아이디어가 마음에 듭니다. 게다가 몇 년 전에 저는 Erlang에 빠져서 그것이 사용하는 메시지 전달 시스템에 빠져 들었습니다.

저는 복잡한 비즈니스 로직을 다루는 많은 애플리케이션을 작업하고 있으며,이 중 하나에 더 많이 들어가야 할 때라고 생각합니다. 특히 레거시 Struts 및 C # 애플리케이션 업그레이드.

어쨌든 거룩한 전쟁을 피하면서 두 시스템은 근본적으로 어떻게 다른가요? 둘 다 같은 목표를 향한 것 같습니다. Akka의 "자가 치유"아키텍처가 장점을 가지고있을 수 있습니다.

편집하다

가까운 투표를 받고있는 것 같습니다. 이 질문을 "노드 또는 akka 중 어느 것이 더 낫습니까?"로 받아들이지 마십시오. 내가 찾고있는 것은 Node와 같은 이벤트 기반 라이브러리와 Akka와 같은 행위자 기반 라이브러리의 근본적인 차이점입니다.


12
나는 모든 가까운 유권자들에게 "저리"라고 말하도록 투표했습니다. :)
Nerrve

@cbmeeks 당신은 무엇을 선택했고 당신의 선택으로 어떻게 진행되는지 물어볼 수 있습니까?
Jas

답변:


64

세부 사항 (Node.js의 경우에는 거의 알지 못함)으로 들어 가지 않고, 주요 차이점은 Node.js는 병렬 처리없이 동시성을 지원하는 반면 Akka는 둘 다 지원한다는 것입니다. 두 시스템 모두 완전히 이벤트 기반이며 대규모 작업 부하로 확장 할 수 있지만 병렬 처리가 부족하여 Node.js에서 어렵습니다 (즉, 병렬 처리는 여러 노드를 시작하고 그에 따라 요청을 발송하여 명시 적으로 코딩되므로 런타임시 유연성이 떨어짐) , 조정 가능한 다중 스레드 실행 프로그램으로 인해 Akka에서는 매우 쉽습니다. 작은 격리 된 작업 단위 (액터 호출)가 주어지면 Akka는 자동으로 실행을 병렬화합니다.

중요한 또 다른 차이점은 Akka에는 구조화 된 방식으로 실패를 처리하는 시스템이 포함되어 있다는 것입니다 (각 액터가 반드시 부모의 감독을 받도록 함). 반면 Node.js는 작성자가 콜백에서 콜백으로 오류 조건을 전달하는 규칙에 의존합니다. 근본적인 문제는 비동기 시스템이 동기 스택 기반 시스템에서 사용하는 예외의 표준 접근 방식을 사용할 수 없다는 것입니다. 콜백 오류가 발생할 때 "호출"코드가 다른 작업으로 이동하기 때문입니다. 시스템에 결함 처리 기능이 내장되어 있으면 해당 시스템에 구축 된 애플리케이션이 견고 할 가능성이 높아집니다.

위의 내용은 완전한 것이 아니며 더 많은 차이점이 있다고 확신합니다.


1
AKKA를 사용하여 편안한 웹 애플리케이션을 구축하기로 결정한 경우 PLAY-FRAMEWORK 또는 SPRAY를 사용하는 것이 가장 좋은 방법이라고 생각하십니까?
ses

3
예, 둘 다 좋은 선택입니다. Play는 완전히 통합 된 개발 경험을 제공하는 프레임 워크로 적합하지만 Play가 애플리케이션을 실행할 것임을 의미합니다. Akka 애플리케이션에 얇은 REST 레이어를 포함하고 싶다면 스프레이가 더 좋습니다. 스프레이는 다음 달에 akka-http가 될 것입니다.
Roland Kuhn

2
또한 지적하자면, Scala / Java를 사용하여 정적으로 형식화 된 언어의 장점을 모두 얻을 수 있으며 자바 스크립트에서는 콜백 지옥이 없습니다. Java / Scala는 javascript보다 디버그하기 쉽습니다.
Chirdeep Tomar

2
노드와의 병렬성 측면에서 클러스터 코어 API를 사용하여 런타임에 프로세스를 포크 할 수 있다는 점을 언급해야합니다 . 병렬 액터가 의미하는 바를 수행합니다.
커널

2
나에게 2012 년 의이 답변은 특히 Node와 함께 많은 것이 변경되었으므로 이제 매우 오래된 것 같습니다. Node의 npmjs.com/package/webworker-threads 웹 워커 를 보면 차단 작업을 병렬 프로세스로 이동할 수 있습니다 (모두 동일한 노드 프로세스에 있음).
Mark Pieszak-Trilon.io 2015 년

8

나는 아직 Akka를 사용하지 않았지만 erlang과 비슷하지만 Java로 보입니다. erlang에서 모든 프로세스는 Akka의 행위자와 같으며 사서함이 있으며 메시지를 보낼 수 있으며 감독자가 있습니다.

Node.js는 협력적인 동시성을 사용합니다. 즉, 허용 할 때 동시성이 있음을 의미합니다 (예 : io 작업 또는 일부 비동기 이벤트를 호출 할 때). 긴 작업 (긴 루프에서 무언가를 계산) 할 때 전체 시스템 블록이 있습니다.

Erlang은 선점 형 작업 전환을 사용합니다. 긴 루프가있는 경우 시스템은 다른 작업을 실행하기 위해 일시 ​​중지하고 잠시 후에 계속할 수 있습니다. 대규모 동시성을 위해 짧은 작업 만 수행하는 경우 Node.js가 좋습니다. 둘 다 수백만 명의 클라이언트를 지원합니다 : http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 100만은 2011 년

자바에서는 동시성을 수행하기 위해 스레드가 필요합니다. 그렇지 않으면 erlang이 수행하는 함수 내에서 실행을 일시 중지 할 수 없습니다 (실제로 erlang은 함수 호출 사이에 일시 중지되지만 이는 모든 함수에 적용됩니다). 메시지 사이에 실행을 일시 중지 할 수 있습니다.


좋습니다. 여러 소스의 로그 파일을 기록해야한다고 가정합니다. 애플리케이션이 로그 항목을 생성 할 때마다 기록을 위해 해당 항목을 다른 애플리케이션으로 보내야합니다. 앱에 DB 시간 초과, http 오류 등이있을 수 있기 때문에 이것이 오래 실행되는 프로세스 일 수 있다고 가정합니다.이 예에서 DB에 쓰기가 중단되면 전체 노드 시스템이 중단됩니까? AKKA가 같은 문제를 겪을까요, ​​아니면 상관 관계를 얻지 못합니까?
cbmeeks

1
db 액세스는 일반적으로 이러한 경우 비동기식으로 구현되므로 둘 다 문제가되지 않습니다. 그러나 어떻게 든 동기식 라이브러리를 만들 수 있다면 둘 다 멈출 것입니다.
yetihehe dec.

감사. 나는 이것을 node vs akka논쟁으로 바꾸지 않기 위해 매우 열심히 노력하고 있지만 해결해야 할 실제 문제가 있습니다. Java / JavaScript 기술은 매우 비슷하지만 Node에 대한 경험이 거의없고 AKKA (또는 Scala)에 대한 경험이 없습니다. 하지만 여러 응용 프로그램 (현재는 내부에 있지만 나중에는 외부에 있음)이 있으며 사람들은 이러한 방대한 로그를 검색하는 방법을 찾고 있습니다. 개인 정보 보호 문제로 인해 외부 타사 옵션을 사용할 수 없습니다. 둘 중 하나가 작업을 처리 할 것 같습니다. 하지만 나는 AKKA의 메시지 전달을 좋아해서 그것을 탐구 할 수있을 것입니다. 플러스 자바는 여기에서 JS보다 더 많이 밀려납니다. 감사.
cbmeeks

방대한 로그를 검색해야하는 경우 logstash 또는 graylog2를 살펴보십시오.
Toddius Zho 2013-08-08

6

이게 공정한 비교인지 모르겠습니다. 나는 "이벤트 기반 시스템이 배우 모델과 어떻게 비교 되는가?"로 더 읽었습니다. Nodejs는 Akka에서 Scala가 수행하는 것처럼 액터 모델을 지원할 수 있습니다. Orleans에서 C #이 수행하는 것처럼 실제로 nactor를 확인하십시오 . 누군가 이미 시도하고있는 것처럼 보입니다.

이벤트 시스템과 액터 모델을 비교하는 방법에 대해서는 현명한 사람들이 설명하도록하겠습니다. 액터 모델에 대한 몇 가지 간단한 요점 :

  • 액터 모델은 메시지 기반입니다.
  • 배우 모델은 분산 시스템 (클러스터)에서 잘 작동하는 경향이 있습니다. 물론 이벤트 기반 시스템도 배포 할 수 있지만 액터 모델에는 계산 배포와 관련하여 배포가 내장되어 있다고 생각합니다. 새로운 요청은 이벤트 기반에서 어떻게 작동하는지 확실하지 않은 다른 사일로의 새로운 행위자에게 라우팅 될 수 있습니다.
  • Actor 모델은 클러스터 1이 다운 될 것으로 예상되면 일반적으로 관찰자가 작업을 수행 할 다른 사일로를 찾을 수 있다는 점에서 실패를 지원합니다.

또한 드라마도 확인하세요 . 또 다른 nodejs 액터 모델 구현입니다.


1
nodejs로 클러스터를 설정해보세요. docker, kubernetees가 필요하고 분산 시스템을 만드세요. 또한 nodejs에서 코어를 1 개 더 사용하도록 설정하십시오. Akka는 그것들을 다룰 예정입니다. 또한 nodejs 자체의 성숙도, 보안 및 무언가를 수행하기 위해 다른 프레임 워크를 필요로하는 코딩 방법은 nodejs 자체를 대규모 분산 시스템에 사용할 수 없지만 최소한 MSA 방식으로 만 사용할 수 있다는 점입니다. 어쨌든 내 의견.
Raffaello
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.