Node.js hoặc Erlang


86

Tôi thực sự thích những công cụ này khi nói đến mức đồng thời mà nó có thể xử lý.

Erlang / OTP trông giống như một giải pháp ổn định hơn nhiều nhưng yêu cầu học hỏi nhiều hơn và nghiên cứu rất nhiều về mô hình ngôn ngữ chức năng. Và có vẻ như Erlang / OTP làm cho nó tốt hơn nhiều khi nói đến CPU đa lõi (hãy sửa cho tôi nếu tôi sai).

Nhưng tôi nên chọn cái nào? Cái nào tốt hơn trong ngắn hạn và dài hạn?

Mục tiêu của tôi là tìm hiểu một công cụ giúp mở rộng các dự án Web của tôi khi tải cao dễ dàng hơn các ngôn ngữ truyền thống.


Bạn có thể sử dụng JavaScript như một ngôn ngữ chức năng với underscorejs.org
Todd Moses

2
@ToddMoses bạn có chắc là mình đã nhận xét đúng câu hỏi không?
Flavien Volken

Táo và cam. Node.JS (cốt lõi của nó) là tương tác tự do (C) + Javascript. Erlang là một triển khai IO hoàn toàn tùy chỉnh. Node.JS được tạo cho các ứng dụng đơn luồng. Điều phù hợp của bạn là bạn muốn một công việc tại Facebook / Google, hay bạn muốn làm phần mềm kickass.
Vans S

Câu trả lời:


87

Tôi sẽ thử Erlang. Mặc dù nó sẽ là một đường cong học tập dốc hơn, bạn sẽ hiểu được nhiều hơn vì bạn sẽ học một ngôn ngữ lập trình chức năng. Ngoài ra, vì Erlang được thiết kế đặc biệt để tạo ra các hệ thống đáng tin cậy, đồng thời cao, bạn sẽ học được nhiều điều về việc tạo các dịch vụ có khả năng mở rộng cao cùng một lúc.


10
Tôi không nghĩ rằng Erlang phức tạp hơn một chút so với Javascript. Không có bất kỳ kiểu kế thừa nào trong Erlang, vì vậy bạn luôn chắc chắn mình gọi hàm nào. Không có chuyển đổi kiểu ngầm trong Erlang, vì vậy bạn luôn chắc chắn loại dữ liệu mình sử dụng. Không có phép gán phá hủy nào vì vậy bạn luôn chắc chắn rằng bạn sẽ không có một số đoạn mã cũ bị hỏng vì một số mã mới trong lệnh gọi lại đã thay đổi trạng thái nội bộ của bạn.
Dmitry Belyaev

51

Tôi không thể nói về Erlang, nhưng một số điều chưa được đề cập về nút:

  • Node sử dụng công cụ V8 của Google để thực sự biên dịch javascript thành mã máy. Vì vậy, nút thực sự khá nhanh. Vì vậy, đó là lợi ích về tốc độ được cung cấp bởi lập trình hướng sự kiện và io không chặn.
  • Node có một cộng đồng khá tích cực. Tham gia nhóm IRC của họ trên freenode và bạn sẽ thấy ý tôi
  • Tôi nhận thấy các ý kiến ​​trên thúc đẩy Erlang trên cơ sở rằng nó sẽ hữu ích để học một ngôn ngữ lập trình chức năng. Mặc dù tôi đồng ý rằng điều quan trọng là phải mở rộng bộ kỹ năng của bạn và có được một trong những bộ kỹ năng của bạn, nhưng bạn không nên đặt dự án dựa trên thực tế là bạn muốn học một phong cách lập trình mới
  • Mặt khác, Javascript đã ở trong một mô hình mà bạn cảm thấy thoải mái khi viết! Thêm vào đó, nó là javascript, vì vậy khi bạn viết mã phía máy khách, nó sẽ trông và cảm thấy nhất quán.
  • cộng đồng của nút đã bơm ra hàng tấn mô-đun ! Có các mô-đun cho redis, mongodb, couch, và những gì có bạn. Một mô-đun tốt khác cần xem xét là Express (nghĩ Sinatra cho nút)

Hãy xem video trên blog yahoo của Ryan Dahl, người thực sự viết nút. Tôi nghĩ rằng điều đó sẽ giúp bạn có ý tưởng tốt hơn về vị trí của nút và nơi nó sẽ đi.

Hãy nhớ rằng nút vẫn đang trong giai đoạn phát triển muộn và do đó đã trải qua một số thay đổi - những thay đổi đã phá vỡ mã trước đó. Tuy nhiên, được cho là ở thời điểm mà bạn có thể mong đợi API không thay đổi quá nhiều. Vì vậy, nếu bạn đang tìm kiếm một thứ gì đó thú vị, tôi muốn nói rằng nút là một lựa chọn tuyệt vời.


26
Tôi nghĩ rằng động cơ V8 biên dịch JavaScript thành mã máy chứ không phải để lắp ráp.
Jonas

10
Có quá nhiều việc phải làm xung quanh Javascript không làm cho ngôn ngữ này trở nên phù hợp để giải quyết các vấn đề phức tạp. Bản thân ngôn ngữ này thật tệ với tất cả những trường hợp đặc biệt trong việc chuyển đổi kiểu. Và kiểu gọi lại nơi các biến được thay đổi ở hàng trăm nơi khác nhau và việc tìm kiếm vị trí mà một số nhiệm vụ đã xảy ra.
Dmitry Belyaev

15

Tôi là một lập trình viên Erlang lâu năm, và câu hỏi này đã thúc đẩy tôi xem qua node.js. Nó trông khá đẹp.

Có vẻ như bạn cần tạo ra nhiều quy trình để tận dụng lợi thế của nhiều lõi. Mặc dù vậy, tôi không thể thấy bất cứ điều gì về việc thiết lập mối quan hệ của bộ xử lý. Bạn có thể sử dụng tập tác vụ trên linux, nhưng có lẽ nó phải được tham số hóa và thiết lập trong chương trình.

Tôi cũng nhận thấy rằng hỗ trợ nền tảng có thể yếu hơn một chút. Cụ thể, có vẻ như bạn sẽ cần chạy dưới Cygwin để được hỗ trợ Windows.

Có vẻ tốt mặc dù.


Biên tập

Node.js hiện đã hỗ trợ riêng cho Windows.


5
Câu trả lời này hơi cũ. Ngay bây giờ Node là đa nền tảng, không cần phải có Cygwin cho windows. Và Node có hỗ trợ tích hợp cho việc phân cụm trong một máy, chia sẻ các socket TCP.
Farid Nouri Neshat,

9

Tôi đang xem xét hai lựa chọn thay thế giống như bạn, gotts, cho nhiều dự án.

Cho đến nay, dao cạo tốt nhất mà tôi nghĩ ra để quyết định giữa chúng cho một dự án nhất định là liệu tôi có cần sử dụng Javascript hay không. Một hệ thống hiện có mà tôi đang tìm cách di chuyển đã được viết bằng Javascript, vì vậy phiên bản tiếp theo của nó có thể sẽ được thực hiện trong node.js. Các dự án khác sẽ được thực hiện trong một số khuôn khổ web Erlang vì không có cơ sở mã hiện có để di chuyển.

Một cân nhắc khác là Erlang có thể mở rộng ra ngoài chỉ nhiều lõi, nó có thể mở rộng đến toàn bộ trung tâm dữ liệu. Tôi không thấy cơ chế tích hợp sẵn trong node.js cho phép tôi gửi một thông báo cho quá trình JS khác mà không cần quan tâm đến máy nào, nhưng nó được tích hợp ngay vào Erlang ở các cấp thấp nhất. Nếu vấn đề của bạn không đủ lớn để cần nhiều máy hoặc nếu nó không yêu cầu nhiều quy trình hợp tác, thì lợi thế này có thể không thành vấn đề, vì vậy bạn nên bỏ qua nó.

Erlang thực sự là một vực sâu để lặn vào. Tôi khuyên bạn nên viết một chương trình chức năng độc lập trước khi bạn bắt đầu xây dựng các ứng dụng web. Bước đầu tiên thậm chí còn dễ dàng hơn, vì bạn có vẻ thoải mái với Javascript, là thử lập trình JS theo một phong cách chức năng hơn. Nếu bạn sử dụng jQuery hoặc Prototype, bạn đã bắt đầu theo con đường này. Hãy thử chuyển đổi giữa lập trình chức năng thuần túy trong Erlang hoặc một trong những họ hàng của nó (Haskell, F #, Scala ...) và JS chức năng.

Khi bạn đã cảm thấy thoải mái với lập trình chức năng, hãy tìm kiếm một trong nhiều khung công tác web Erlang; bạn có thể không nên viết ứng dụng của mình trực tiếp vào một thứ gì đó cấp thấp như inetsở giai đoạn cuối này. Ví dụ, hãy xem một thứ như Nitrogen .


Thường không đề cập đến điểm "Erlang quy mô đến toàn bộ trung tâm dữ liệu" có một số điểm rất quan trọng cần xem xét (bảo mật là một vấn đề lớn). Kiểm tra chương về điều này tại đây: learningnyousomeerlang.com/distribunomicon
jocull

9

Trong khi cá nhân tôi muốn sử dụng Erlang, tôi sẽ thừa nhận rằng tôi hơi thiên vị JavaScript. Lời khuyên của tôi là bạn đánh giá một số điểm:

  1. Bạn có đang sử dụng lại mã hiện có bằng một trong hai ngôn ngữ đó không (cả về mã nguồn và kinh nghiệm của lập trình viên!)
  2. Bạn có cần / muốn cập nhật tức thì mà không cần dừng ứng dụng (Đây là nơi Erlang giành chiến thắng theo mặc định - thời gian chạy của nó được thiết kế cho trường hợp đó và OTP chứa tất cả các công cụ cần thiết)
  3. Lưu lượng dự kiến ​​lớn đến mức nào, xét về các hoạt động riêng biệt, đồng thời, không phải băng thông?
  4. Làm thế nào "song song" là các hoạt động bạn thực hiện cho mỗi yêu cầu?

Erlang đã thực sự tinh chỉnh hệ thống phân phối song song đồng thời và mạng trong suốt. Tùy thuộc vào dự án chính xác là gì, tính khả dụng của việc triển khai thuần thục hệ thống như vậy có thể vượt trội hơn bất kỳ vấn đề nào liên quan đến việc học một ngôn ngữ mới. Ngoài ra còn có hai ngôn ngữ khác hoạt động trên Erlang VM mà bạn có thể sử dụng, Reia giống Ruby / Python và Lisp-Flavored Erlang .

Tuy nhiên, một lựa chọn khác là sử dụng cả hai, đặc biệt là với Erlang được sử dụng như một loại "trung tâm". Tôi không chắc Node.js có hệ thống Giao diện Chức năng Ngoại không, nhưng nếu có, thì Erlang có thư viện C cho các quy trình bên ngoài để giao tiếp với hệ thống giống như bất kỳ quy trình Erlang nào khác.


Theo tài liệu, Node.js có thể tận dụng C và C ++ cho các addon bên ngoài. nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice,

Có vẻ như Reia đã chết, nhưng thay vào đó là thần dược ... nó khiến tôi nhớ đến Groovy và Java; ở đây nó sẽ là Elixir và Erlang.
stommepoes

@EvanPlaice - Điều đó không gây ấn tượng với tôi nhiều. Vấn đề là, về cơ bản bạn đang mã hóa một thứ có vấn đề trong C ++ và thêm chúng dưới dạng tích hợp sẵn. Không có nhiều FFI là những gì bạn thực sự đang làm là mở rộng trình giả lập. (Được rồi, sở thích cá nhân;)) Thư viện bên ngoài được đề cập trong trường hợp của erlang là tạo các quy trình không đồng bộ bằng các ngôn ngữ khác hiển thị dưới dạng các nút HOẶC nói chuyện qua một cổng mở (nghĩ là đường ống hai chiều, với dữ liệu có cấu trúc). Tất cả điều đó vừa vặn với chế độ hoạt động không đồng bộ. Ngoài ra còn có NIF, về cơ bản là những gì Node.js có, nhưng không được khuyến khích.
p_l

1
@p_l Theo những gì tôi hiểu, cách tiếp cận nút hơi khác. Mặc dù nút rất tốt trong việc xử lý các lệnh gọi IO không đồng bộ (tức là các yêu cầu web), nó chạy trong môi trường đơn luồng. Vì vậy, nó rất tốt trong việc điều phối nhưng không quá tốt trong việc xử lý nhiều CPU. Để giải quyết vấn đề đó, bạn có thể tách một quy trình / luồng khác chạy mã C / C ++ gốc. Nếu tất cả những gì bạn đang làm là các lệnh gọi IO không đồng bộ (ví dụ: IPC | đường ống hai chiều) thì node.js sẽ có thể xử lý tải. Miễn là nó không được mã hóa để mất nhiều thời gian chờ đợi các cuộc gọi đồng bộ.
Evan Plaice

5

Có vẻ như Erlang hoạt động tốt hơn để triển khai trong một máy chủ tương đối thấp (máy ảo AMD 512MB 4 nhân 2,4GHz). Đây là từ kinh nghiệm của SyncPad khi so sánh việc triển khai Erlang và Node.js của ứng dụng máy chủ bảng trắng ảo của họ.


2
Có, node.js dường như đang gặp sự cố rò rỉ bộ nhớ khó chịu. Node khá mới và mang tính thử nghiệm và cả JavaScript cũng như động cơ V8 đều không được thiết kế cho các tình huống máy chủ như vậy. Mặt khác, Erlang được thiết kế chỉ cho mục đích đó từ dưới lên và có nhiều năm để hoàn thiện bản thân và trưởng thành.
Rolf

2
Liên kết mà dường như đã chết nhưng ở đây nó được trên WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/...
jocull

4

Có một ngôn ngữ nữa trên cùng một máy ảo đó là erlang -> Elixir

Đó là một sự thay thế rất thú vị cho Erlang, hãy xem cái này.

Ngoài ra, nó có một khuôn khổ web phát triển nhanh dựa trên nó-> Phoenix Framework



0

Tôi sẽ thích Erlang hơn Node. Nếu bạn muốn đồng thời, Node có thể được thay thế bằng Erlang hoặc Golang vì các quy trình nhẹ của chúng.

Erlang không dễ học nên đòi hỏi nhiều nỗ lực nhưng cộng đồng của nó rất tích cực nên có thể nhận được sự giúp đỡ từ đó, đây chỉ là lý do tại sao mọi người thích Node hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.