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

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

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

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

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

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

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

편집하다

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



답변

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

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

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


답변

나는 아직 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은 함수 호출 사이에 일시 중지되지만 이는 모든 함수에 적용됩니다). 메시지 사이에 실행을 일시 중지 할 수 있습니다.


답변

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

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

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

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


답변