Node.js 또는 Erlang


86

처리 할 수있는 동시성 수준과 관련하여 이러한 도구를 정말 좋아합니다.

Erlang / OTP는 훨씬 더 안정적인 솔루션처럼 보이지만 훨씬 더 많은 학습과 기능적 언어 패러다임에 대한 많은 다이빙이 필요합니다. 그리고 Erlang / OTP가 멀티 코어 CPU에 관해서는 훨씬 더 나은 것처럼 보입니다.

그러나 나는 무엇을 선택해야합니까? 단기 및 장기 관점에서 어느 것이 더 낫습니까?

나의 목표는 전통적인 언어보다 더 쉽게 웹 프로젝트를 확장 할 수있는 도구를 배우는 것입니다.



2
@ToddMoses 당신이 올바른 질문에 대한 코멘트를 확실히 했습니까?
Flavien Volken 2014

사과와 오렌지. Node.JS (핵심)는 libevent (C) + Javascript interop입니다. Erlang은 완전히 맞춤화 된 IO 구현입니다. Node.JS는 단일 스레드 앱을 위해 만들어졌습니다. 당신의 delema는 당신이 페이스 북 / 구글에서 일자리를 원합니까, 아니면 킥 애스 소프트웨어를 만들고 싶습니까?
Vans S

답변:


87

나는 Erlang을 시도해 볼 것입니다. 더 가파른 학습 곡선이 될지라도 함수형 프로그래밍 언어를 배우게되므로 더 많은 것을 얻을 수 있습니다. 또한 Erlang은 안정적이고 동시성있는 시스템을 만들도록 특별히 설계되었으므로 확장 성이 뛰어난 서비스를 동시에 만드는 방법에 대해 많은 것을 배울 것입니다.


10
Erlang이 Javascript보다 조금 더 복잡하다고 생각하지 않습니다. Erlang에는 상속 유형이 없으므로 항상 어떤 함수를 호출하는지 확신 할 수 있습니다. Erlang에는 암시 적 유형 변환이 없으므로 어떤 유형의 데이터를 사용하는지 항상 확신 할 수 있습니다. 파괴적인 할당이 없으므로 콜백의 일부 새 코드가 내부 상태를 변경했기 때문에 오래된 코드 조각이 손상되지 않았 음을 항상 확신합니다.
Dmitry Belyaev 2013 년

51

Erlang에 대해 말할 수는 없지만 노드에 대해 언급되지 않은 몇 가지 사항이 있습니다.

  • Node는 Google의 V8 엔진을 사용하여 실제로 자바 스크립트를 기계 코드로 컴파일합니다. 그래서 노드는 실제로 꽤 빠릅니다. 이벤트 기반 프로그래밍 및 비 차단 io가 제공하는 속도 이점에 더합니다.
  • Node에는 꽤 활동적인 커뮤니티가 있습니다. freenode의 IRC 그룹에 들어가면 무슨 뜻인지 알 수 있습니다.
  • 위의 주석이 기능적 프로그래밍 언어를 배우는 것이 유용 할 것이라는 근거로 Erlang을 밀어 붙이는 것을 보았습니다. 기술을 확장하고 그 중 하나를 확보하는 것이 중요하다는 데 동의하지만, 새로운 프로그래밍 스타일을 배우고 싶다는 사실을 바탕으로 프로젝트를 작성해서는 안됩니다.
  • 반면에 Javascript는 이미 작성하기에 편한 패러다임에 있습니다! 또한 자바 스크립트이므로 클라이언트 측 코드를 작성할 때 일관성있는 모양과 느낌을줍니다.
  • 노드 커뮤니티는 이미 수많은 모듈을 펌핑했습니다 ! redis, mongodb, couch 및 무엇을위한 모듈이 있습니다. 살펴볼 또 다른 좋은 모듈은 Express입니다 (노드 용 Sinatra를 생각해 보십시오 ).

실제로 노드를 작성한 사람인 Ryan Dahl의 yahoo 블로그 동영상 을 확인하세요 . 노드가 어디에 있는지, 어디로 가는지 더 잘 알 수있을 것입니다.

노드는 아직 개발 후반 단계에 있으며 이전 코드를 망가 뜨린 변경과 같은 몇 가지 변경 사항을 겪고 있습니다. 그러나 API가 너무 많이 변경되지 않을 것으로 예상 할 수있는 시점에 있습니다. 따라서 재미있는 것을 찾고 있다면 노드가 훌륭한 선택이라고 말하고 싶습니다.


26
V8 엔진은 JavaScript를 어셈블리가 아닌 기계 코드로 컴파일한다고 생각합니다.
Jonas 2011

10
자바 스크립트에 대해 너무 많은 작업을한다고해서 복잡한 문제를 해결하는 데 언어가 적합하지 않습니다. 언어 자체는 유형 변환의 모든 특수한 경우에 끔찍합니다. 그리고 수백 개의 다른 장소에서 변수가 변경되는 콜백 스타일과 일부 할당이 발생한 장소를 찾는 지옥.
Dmitry Belyaev

15

저는 오랫동안 Erlang 프로그래머이며이 질문으로 node.js를 살펴 보게되었습니다. 꽤 좋아 보인다.

여러 코어를 활용하려면 여러 프로세스를 생성해야하는 것으로 보입니다. 그래도 프로세서 선호도 설정에 대해 아무것도 볼 수 없습니다. 리눅스에서 taskset을 사용할 수 있지만 아마도 매개 변수화하고 프로그램에서 설정해야합니다.

또한 플랫폼 지원이 약간 약할 수 있음을 알았습니다. 특히 Windows 지원을 위해 Cygwin에서 실행해야 할 것 같습니다.

그래도 좋아 보인다.


편집하다

Node.js는 이제 Windows를 기본적으로 지원합니다.


5
이 답변은 조금 오래되었습니다. 현재 Node는 크로스 플랫폼이므로 Windows 용 Cygwin이 필요하지 않습니다. 그리고 Node는 TCP 소켓을 공유하는 하나의 시스템에서 클러스터링을 지원합니다.
파리 드 누리 네샤

9

여러 프로젝트에 대해 동일한 두 가지 대안을 찾고 있습니다.

지금까지 주어진 프로젝트를 위해 그들 사이에서 결정하기 위해 내가 생각 해낸 최고의 면도기는 자바 스크립트를 사용해야하는지 여부입니다. 마이그레이션하려는 기존 시스템 중 하나는 이미 Javascript로 작성되었으므로 다음 버전은 node.js에서 수행 될 가능성이 높습니다. 마이그레이션 할 기존 코드 기반이 없기 때문에 다른 프로젝트는 일부 Erlang 웹 프레임 워크에서 수행됩니다.

또 다른 고려 사항은 Erlang이 여러 코어를 넘어서 전체 데이터 센터로 확장 할 수 있다는 것입니다. 나는 node.js에서 어떤 시스템에 있는지 신경 쓰지 않고 다른 JS 프로세스에 메시지를 보낼 수있는 내장 메커니즘을 보지 못했지만, 그것은 가장 낮은 수준에서 Erlang에 바로 내장되어 있습니다. 문제가 여러 대의 시스템을 필요로 할만큼 크지 않거나 여러 협력 프로세스가 필요하지 않은 경우이 이점은 중요하지 않으므로 무시해야합니다.

Erlang은 실제로 다이빙하기에 깊은 풀입니다. 웹 앱 빌드를 시작하기 전에 먼저 독립 실행 형 기능 프로그램을 작성하는 것이 좋습니다. 자바 스크립트에 익숙해 보이기 때문에 더 쉬운 첫 번째 단계는보다 기능적인 스타일로 JS를 프로그래밍하는 것입니다. jQuery 또는 Prototype을 사용하는 경우 이미이 경로를 시작했습니다. Erlang의 순수 함수형 프로그래밍이나 그 유사 (Haskell, F #, Scala ...) 중 하나와 함수형 JS 사이를 바운스 해보십시오.

함수형 프로그래밍에 익숙해지면 많은 Erlang 웹 프레임 워크 중 하나를 찾으십시오. inets이 후기 단계 와 같이 저수준에 앱을 직접 작성해서는 안됩니다 . 예를 들어 Nitrogen 과 같은 것을보십시오 .


"Erlang은 전체 데이터 센터로 확장"이라는 점에서 고려해야 할 매우 중요한 몇 가지 사항이 있습니다 (보안은 큰 문제입니다). 여기에 대한 장을 확인하십시오 : learnyousomeerlang.com/distribunomicon
jocull

9

개인적으로 Erlang을 선택하는 동안 JavaScript에 약간 편견이 있음을 인정합니다. 내 조언은 몇 가지 사항을 평가하는 것입니다.

  1. 두 언어 중 하나의 기존 코드를 재사용하고 있습니까 (소스 코드 및 프로그래머 경험 측면에서 모두!)
  2. 응용 프로그램을 중지하지 않고 즉석 업데이트가 필요합니까 / 원합니까? (이는 기본적으로 Erlang이이기는 곳입니다. 런타임은이 경우를 위해 설계되었으며 OTP에는 필요한 모든 도구가 포함되어 있습니다)
  3. 대역폭이 아닌 별도의 동시 작업 측면에서 예상되는 트래픽은 얼마나 큽니까?
  4. 각 요청에 대해 수행하는 작업이 얼마나 "병렬"입니까?

Erlang은 정말 정밀하게 조정 된 동시성 및 네트워크 투명 병렬 분산 시스템을 갖추고 있습니다. 프로젝트가 정확히 무엇인지에 따라 그러한 시스템의 성숙한 구현의 가용성이 새로운 언어 학습과 관련된 문제보다 클 수 있습니다. 또한 사용할 수있는 Erlang VM에서 작동하는 두 가지 다른 언어 인 Ruby / Python과 유사한 ReiaLisp-Flavored Erlang이 있습니다.

또 다른 옵션은 둘 다 사용하는 것입니다. 특히 Erlang이 일종의 "허브"로 사용되는 경우입니다. Node.js에 Foreign Function Interface 시스템이 있는지 확실하지 않지만 만약 있다면 Erlang에는 다른 Erlang 프로세스와 마찬가지로 외부 프로세스가 시스템과 인터페이스 할 수있는 C 라이브러리가 있습니다.


문서에 따르면 Node.js는 외부 애드온에 C 및 C ++를 활용할 수 있습니다. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice

Reia가 죽은 것처럼 보이지만 그 자리에는 엘릭서가 있습니다 . Groovy와 Java를 생각 나게합니다. 여기 Elixir와 Erlang이 있습니다.
stommepoes

@EvanPlaice-그다지 인상적이지 않습니다. 문제는 기본적으로 C ++에서 문제가되는 것을 코딩하고 내장 기능으로 추가한다는 것입니다. FFI는 실제로 에뮬레이터를 확장하는 것이 아닙니다. (좋아요, 개인적인 선호도;)) erlang의 경우 언급 된 외부 라이브러리는 노드로 표시되거나 열린 포트를 통해 통신하는 다른 언어로 비동기 프로세스를 만드는 것입니다 (구조화 된 데이터를 사용하는 양방향 파이프를 생각해보십시오). 이 모든 것이 비동기 작동 모드에 적합합니다. 기본적으로 Node.js가 가지고 있지만 권장하지 않는 NIF도 있습니다.
p_l

1
@p_l 내가 이해하는 바에 따르면 노드 접근 방식은 약간 다릅니다. 노드는 비동기 IO 호출 (예 : 웹 요청)을 매우 잘 처리하지만 단일 스레드 환경에서 실행됩니다. 따라서 디스패치에는 좋지만 CPU 집약적 인 처리에는 그다지 좋지 않습니다. 그 근거를 다루기 위해 네이티브 C / C ++ 코드를 실행하는 다른 프로세스 / 스레드를 분기 할 수 있습니다. 비동기 IO 호출 (예 : IPC | 양방향 파이프) 만 수행하는 경우 node.js가로드를 처리 할 수 ​​있어야합니다. 동기 호출을 기다리는 데 많은 시간을 소비하도록 코딩되지 않는 한.
Evan Plaice 2012 년

5

Erlang은 비교적 저가형 서버 (512MB 4 코어 2.4GHz AMD VM)에 배포 할 때 더 나은 성능을 발휘하는 것 같습니다. 이것은 SyncPad가 가상 화이트 보드 서버 애플리케이션의 Erlang과 Node.js 구현을 비교 한 경험 에서 비롯된 것 입니다.


2
예, node.js에 심각한 메모리 누수 문제가있는 것 같습니다. Node는 다소 새롭고 실험적이며 JavaScript 나 V8 엔진은 이러한 서버 시나리오를 위해 설계되지 않았습니다. 반면에 Erlang은 밑바닥부터 위로 만 설계되었으며 스스로를 다듬고 성숙하는 데 수년이 걸렸습니다.
Rolf

2
그 링크는 죽은 것처럼 보이지만 여기가 WayBackMachine입니다에 web.archive.org/web/20120902014555/http://blog.mysyncpad.com/...
jocull



0

Node.js보다 Erlang을 선호합니다. 동시성을 원한다면 Node는 경량 프로세스로 인해 Erlang 또는 Golang으로 대체 될 수 있습니다.

Erlang은 배우기가 쉽지 않아 많은 노력이 필요하지만 커뮤니티가 활성화되어 도움을받을 수 있습니다. 이것이 사람들이 Node를 선호하는 이유 일뿐입니다.

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