Hệ thống sự kiện Node.js khác với mô hình tác nhân của Akka như thế nào?


93

Tôi đã làm việc với Node.jsmột thời gian ngắn và tự cho rằng mình khá giỏi với Java. Nhưng tôi vừa phát hiện raAkka và ngay lập tức hứng thú với mẫu diễn viên của nó (theo những gì tôi hiểu).

Bây giờ, giả sử các kỹ năng JavaScript của tôi ngang bằng với các kỹ năng Scala / Java của tôi, tôi muốn tập trung vào tính thực tế của một trong hai hệ thống. Đặc biệt là trong các điều khoản của dịch vụ web.

Tôi hiểu rằng Node rất xuất sắc trong việc xử lý nhiều hoạt động đồng thời. Tôi tưởng tượng một dịch vụ web Node tốt cho hệ thống quản lý tài sản sẽ xuất sắc trong việc xử lý nhiều người dùng gửi các thay đổi cùng một lúc (trong một ứng dụng có lượng truy cập lớn).

Nhưng sau khi đọc về các diễn viên trong Akka, tôi thấy nó xuất sắc ở điều tương tự. Và tôi thích ý tưởng giảm công việc thành từng miếng vừa ăn. Thêm vào đó, nhiều năm trước, tôi đã tìm hiểu về Erlang và yêu thích hệ thống chuyển tin nhắn mà nó sử dụng.

Tôi làm việc trên nhiều ứng dụng liên quan đến logic nghiệp vụ phức tạp và tôi nghĩ đã đến lúc nên chuyển sang lĩnh vực này hay cách khác. Đặc biệt là nâng cấp các ứng dụng Struts và C # kế thừa.

Dù sao tránh thánh chiến, hai hệ thống căn bản khác nhau như thế nào? Có vẻ như cả hai đều hướng tới cùng một mục tiêu. Với việc có lẽ kiến ​​trúc "tự phục hồi" của Akka có lợi thế hơn.

BIÊN TẬP

Có vẻ như tôi đang nhận được phiếu bầu gần đúng. Vui lòng không coi câu hỏi này là "cái nào tốt hơn, nút hay akka?". Những gì tôi đang tìm kiếm là sự khác biệt cơ bản trong các thư viện hướng sự kiện như Node và các thư viện dựa trên diễn viên như Akka.


12
Tôi đã bỏ phiếu cho bạn để nói "biến đi" với tất cả những cử tri thân thiết đó :)
Nerrve

@cbmeeks, tôi có thể hỏi bạn đã chọn gì và kết quả thế nào với lựa chọn của bạn?
Jas

Câu trả lời:


64

Không đi sâu vào chi tiết (về cái mà tôi biết quá ít trong trường hợp của Node.js), sự khác biệt chính là Node.js chỉ hỗ trợ đồng thời mà không hỗ trợ song song trong khi Akka hỗ trợ cả hai. Cả hai hệ thống đều hoàn toàn theo hướng sự kiện và có thể mở rộng đến tải công việc lớn, nhưng việc thiếu tính song song gây khó khăn trong Node.js (tức là tính song song được mã hóa rõ ràng bằng cách khởi động nhiều nút và gửi yêu cầu tương ứng; do đó, nó không linh hoạt trong thời gian chạy) , trong khi nó khá dễ dàng trong Akka do các trình thực thi đa luồng có thể điều chỉnh được. Với các đơn vị công việc nhỏ biệt lập (lời gọi diễn viên) Akka sẽ tự động thực hiện song song cho bạn.

Một sự khác biệt quan trọng khác là Akka bao gồm một hệ thống xử lý lỗi theo cách có cấu trúc (bằng cách yêu cầu mỗi tác nhân được giám sát bởi cha mẹ của nó, điều này là bắt buộc) trong khi Node.js dựa trên các quy ước để tác giả chuyển các điều kiện lỗi từ gọi lại đến gọi lại. Vấn đề cơ bản là các hệ thống không đồng bộ không thể sử dụng cách tiếp cận tiêu chuẩn về các ngoại lệ được sử dụng bởi các hệ thống dựa trên ngăn xếp đồng bộ, bởi vì mã “gọi” sẽ chuyển sang các tác vụ khác nhau vào thời điểm xảy ra lỗi của lệnh gọi lại. Việc xử lý lỗi được tích hợp trong hệ thống làm cho các ứng dụng được xây dựng trên hệ thống đó trở nên mạnh mẽ hơn.

Ở trên không có nghĩa là toàn bộ, tôi chắc chắn rằng có rất nhiều sự khác biệt.


1
Bạn có nghĩ rằng cách tốt nhất là sử dụng PLAY-FRAMEWORK hoặc SPRAY nếu tôi quyết định sử dụng AKKA để xây dựng ứng dụng web thú vị?
ses

3
Vâng, cả hai đều là lựa chọn tốt. Play phù hợp như một khung cung cấp cho bạn trải nghiệm phát triển tích hợp đầy đủ, nhưng điều đó có nghĩa là Play sẽ chạy ứng dụng của bạn. Xịt sẽ tốt hơn nếu bạn muốn chỉ nhúng một lớp REST mỏng vào ứng dụng Akka của mình. Xin lưu ý rằng Spray sẽ trở thành akka-http trong những tháng tới.
Roland Kuhn

2
Và cũng để chỉ ra rằng, bạn có được tất cả tính tốt của một ngôn ngữ được nhập tĩnh với Scala / Java và không có địa ngục gọi lại trong javascript. Java / Scala sẽ dễ gỡ lỗi hơn javascript.
Chirdeep Tomar

2
Về tính song song với nút, cần đề cập rằng bạn có thể phân nhánh các quy trình trong thời gian chạy với API lõi cụm của nó . Nó sẽ làm những gì bạn muốn nói bởi các tác nhân song song.
kernel

2
Có vẻ như đối với tôi câu trả lời này từ năm 2012 hiện đã rất lỗi thời vì nhiều thứ đã thay đổi, đặc biệt là với Node kể từ khi có chúng. Hãy xem npmjs.com/package/webworker-threads web worker trong Node, bạn có thể chuyển việc chặn công việc xâm nhập sang một quy trình song song (tất cả trong cùng một quy trình Node).
Mark Pieszak - Trilon.io

8

Tôi chưa sử dụng Akka, nhưng có vẻ như nó giống erlang nhưng trong java. Trong erlang, tất cả các quy trình giống như các diễn viên trong Akka, chúng có hộp thư, bạn có thể gửi tin nhắn giữa chúng, bạn có người giám sát, v.v.

Node.js sử dụng đồng thời hợp tác. Điều đó có nghĩa là bạn có đồng thời khi bạn cho phép nó (ví dụ: khi bạn gọi thao tác io hoặc một số sự kiện không đồng bộ). Khi bạn có một số hoạt động dài (tính toán một cái gì đó trong vòng lặp dài), toàn bộ hệ thống sẽ bị chặn.

Erlang sử dụng tính năng chuyển đổi tác vụ phủ đầu. Khi bạn có vòng lặp dài, hệ thống có thể tạm dừng nó để chạy hoạt động khác và tiếp tục sau một thời gian. Đối với đồng thời lớn Node.js là tốt nếu bạn chỉ thực hiện các thao tác ngắn. Cả hai đều hỗ trợ hàng triệu khách hàng: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1 triệu năm 2011 /

Trong java, bạn cần các luồng để thực hiện bất kỳ đồng thời nào, nếu không, bạn không thể tạm dừng thực thi bên trong hàm mà erlang thực hiện (thực tế erlang tạm dừng giữa các lệnh gọi hàm, nhưng điều này mở ra với tất cả các hàm). Bạn có thể tạm dừng thực thi giữa các tin nhắn.


OK, vì vậy giả sử tôi cần ghi lại các tệp nhật ký từ nhiều nguồn khác nhau. Mỗi khi ứng dụng tạo mục nhập nhật ký, tôi cũng cần gửi mục nhập đó đến ứng dụng khác để ghi lại. Tôi cho rằng đây có thể là một quá trình chạy lâu vì ứng dụng có thể bị hết thời gian chờ của DB, lỗi http, v.v. Vì vậy, trong ví dụ này, lỗi viết thư cho DB sẽ khiến toàn bộ hệ thống Node của tôi bị treo? AKKA sẽ gặp phải vấn đề tương tự hay tôi không nhận được sự tương quan?
cbmeeks 17/12/12

1
Cũng không ảnh hưởng gì, vì quyền truy cập db thường được triển khai không đồng bộ trong những trường hợp như vậy. Nhưng nếu bạn bằng cách nào đó quản lý để làm cho thư viện đồng bộ làm điều đó, cả hai sẽ bị đóng băng.
yetihehe 17/12/12

Cảm ơn. Tôi đang rất cố gắng để không biến điều này thành một node vs akkacuộc tranh luận nhưng tôi có một vấn đề thực sự cần giải quyết. Tôi có thể nói rằng các kỹ năng Java / JavaScript của tôi khá gần nhưng tôi có rất ít kinh nghiệm với Node và không có bằng AKKA (hoặc Scala). Nhưng tôi có một số ứng dụng (nội bộ bây giờ nhưng bên ngoài sau này) và mọi người đang tìm cách tìm kiếm các bản ghi khổng lồ này. Không thể sử dụng các tùy chọn của bên thứ 3 bên ngoài do các vấn đề về quyền riêng tư. Có vẻ như một trong hai sẽ giải quyết công việc. Nhưng tôi thích thông điệp của AKKA nên tôi có thể khám phá điều đó. Thêm vào đó, Java được đẩy vào đây nhiều hơn JS. Cảm ơn.
cbmeeks

Nếu bạn cần tìm kiếm các bản ghi lớn, hãy thử xem logstash hoặc graylog2.
Toddius Zho

6

Tôi không chắc đây là một so sánh công bằng để rút ra. Tôi đọc điều này nhiều hơn là "làm thế nào để một hệ thống dựa trên sự kiện so sánh với một mô hình diễn viên?". Nodejs có thể hỗ trợ mô hình diễn viên giống như Scala làm ở Akka, hoặc C # làm ở Orleans, trên thực tế, hãy kiểm tra nactor , ai đó dường như đã thử nó.

Đối với cách so sánh giữa hệ thống sự kiện và mô hình diễn viên, tôi sẽ để những người khôn ngoan hơn mô tả nó. Vài nét sơ lược về mô hình Diễn viên:

  • Mô hình diễn viên dựa trên thông điệp
  • Các mô hình tác nhân có xu hướng hoạt động tốt với các hệ thống phân tán (cụm). Chắc chắn các hệ thống dựa trên sự kiện có thể được phân phối, nhưng tôi nghĩ rằng mô hình tác nhân đã tích hợp phân phối liên quan đến việc phân phối các phép tính. Một yêu cầu mới có thể được chuyển đến một tác nhân mới trong một silo khác, không chắc chắn cách này sẽ hoạt động như thế nào trong trường hợp dựa trên.
  • Mô hình Actor hỗ trợ thất bại ở chỗ, nếu cụm 1 này không hoạt động, người quan sát thường có thể tìm thấy một silo khác để thực hiện công việc

Ngoài ra, hãy xem phim truyền hình . Đây là một mô hình diễn viên nodejs khác.


1
hãy thử thiết lập một cụm với nodejs, bạn cần docker, kubernetee và tạo ra hệ thống phân tán. Cũng cố gắng thiết lập việc sử dụng thêm 1 lõi trong nodejs. Akka nó muốn đối phó với những điều đó. cũng là sự trưởng thành của bản thân nodejs, tính bảo mật và cách viết mã yêu cầu một khung công tác khác thực hiện điều gì đó, là một điểm mà bản thân nodejs không thể được sử dụng cho hệ thống phân tán lớn, mà ít nhất là theo kiểu MSA. Ý kiến ​​của tôi anyway.
Raffaello
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.