Làm thế nào để so sánh akka với Erlang? [đóng cửa]


97

Tôi đã xem akka gần đây và nó khá ấn tượng. Có vẻ như nó có hầu hết các tính năng sát thủ của erlang - tính minh bạch của vị trí, phân cấp giám sát và hơn thế nữa. Có tính năng nào erlang có mà akka không?


Xem phim về erlang này trong thực tế. Quá xấu chẳng có ai về scala youtube.com/watch?v=G0eBDWigORY
mhstnsc

Câu trả lời:


123

Tuyên bố từ chối trách nhiệm: Tôi là PO cho Akka

  • Erlang thực hiện copy-on-send - Akka sử dụng bộ nhớ chia sẻ (các đối tượng bất biến) để gửi trong VM
  • Erlang thực hiện GC cho mỗi quy trình - Akka sử dụng JVM GC
  • Erlang có OTP - Akka tích hợp với toàn bộ hệ sinh thái Java (Apache Camel, JAX-RS, v.v.)
  • Erlang thực hiện lập lịch quy trình cho bạn - Akka cho phép bạn sử dụng nhiều Điều phối viên khác nhau với vô số cơ hội cấu hình
  • Erlang thực hiện tải lại mã nóng - Akka có thể hỗ trợ nó, nhưng nó kém linh hoạt hơn vì tải lớp JVM

Đó là những cái từ trên đỉnh đầu của tôi.

Mặt khác, sử dụng Akka có nghĩa là bạn có thể sử dụng Scala, Java, Groovy hoặc JRuby để viết các ứng dụng của mình.


39
Các đối tượng Erlang cũng không thể thay đổi và mô hình đồng thời không yêu cầu sao chép khi gửi trong cùng một nút. BEAM cho các đối tượng lớn sẽ gửi một tham chiếu. Nguồn: câu trả lời SO này của @rvirdig .
FooF

26
Erlang thực hiện copy-on-send để làm cho GC hiệu quả hơn - nó có thể hoạt động theo từng quy trình. Đây là lý do tại sao không có GC tạm dừng lớn trong các ứng dụng Erlang trái ngược với các ứng dụng JVM / Akka.
andreypopp

4
Vâng, Andrey, điều đó phụ thuộc vào việc bạn đang sử dụng JVM / GC nào. azulsystems.com/products/zing/whatisit
Viktor Klang

4
Erlang có số lượng giảm cho mỗi quy trình, ngay cả khi bạn đang ở trong một vòng lặp tính toán nặng nhọc, Erlang VM có thể tạm dừng quy trình và để các quy trình đói khác thực hiện nhiều chu kỳ CPU hơn. Đó là một tính năng rất quan trọng mà JVM không cung cấp.
Daniel

6
@MaX Erlang thường chậm hơn Java 5x vì thiếu hỗ trợ JIT. Nhưng Erlang không có GC tạm dừng, nó được thiết kế cho đồng thời và các ứng dụng viễn thông 7 * 24, Erlang quan tâm nhiều hơn đến sự công bằng của quy trình, tránh chết đói và bế tắc, nó không được thiết kế cho thông lượng như JVM. Vì vậy, nó thực sự là cam và táo.
Daniel

74

Trong Erlang, các quy trình được đảm bảo sẽ được chuyển đổi khoảng 1000 lần giảm. Trong một khuôn khổ ngây thơ như Scala / Akka agent sở hữu một bộ lập lịch cho đến khi nó hoàn thành công việc nhận. Người kiểm tra. Trò chơi kết thúc. Hasta la vista :) Mọi người, đừng lãng phí thời gian của bạn vào công nghệ giả. Tôi bị sốc khi những người ở đây so sánh Scala với Erlang.

Ngoài ra còn có nhiều cái gọi là "tính năng sát thủ" khác, nhưng đây là lời khuyên của tôi, đừng nghĩ về tính năng, hãy nghĩ về các thành ngữ cho phép ngôn ngữ cụ thể. Scala đánh cắp "tính năng tốt nhất", Erlang cho phép / triển khai cho bạn những thành ngữ phù hợp để xây dựng hệ thống một cách đáng tin cậy, với ngôn ngữ cấp cao được thúc đẩy từ những thành ngữ phù hợp đó. Khi bạn học Erlang, bạn đang xây dựng lại tư duy, cách suy nghĩ của mình về hệ thống đáng tin cậy phân tán, Erlang dạy bạn và nâng cấp cho bạn. Scala chỉ là một ngôn ngữ bắt buộc khác (ồ, xin lỗi, nhiều chữ, từ hài hước) cố gắng ăn cắp các tính năng tốt từ các ngôn ngữ khác.


9
Cách Erlang làm cho tất cả IO không đồng bộ ngầm là rất thanh lịch. Async IO có thể được thực hiện bằng cách sử dụng các API NIO trong Scala, đối với tôi, điều này không giống như đối tác kiểm tra, nhưng là một giải pháp kém thanh lịch hơn.
HRJ

7
Bạn đang nói về cái gì vậy?! Làm thế nào để xử lý 1000 tác vụ liên tục tốt hơn so với lập lịch roundrobin, hoặc thậm chí gần với lập lịch hộp thư nhỏ nhất !!
FUD

8
@vjache - Tôi đồng ý. Nhiều năm làm lập trình viên java của tôi đã dạy tôi rằng một lúc nào đó bạn sẽ phải điều tra lớp bên dưới bạn. Scala / Akka dường như chỉ là một lớp khác nằm trên rất nhiều lớp khác (Ví dụ: nio, netty, v.v.), tất cả những thứ này bạn sẽ cần phải hiểu tại một số điểm. Mặc dù tôi chỉ mới bắt đầu làm việc với Erlang, nhưng có vẻ như tôi sẽ có ít lớp hơn mà tôi cần hiểu để hoàn thành công việc. Lập trình phân tán trong Erlang cảm thấy nhẹ hơn nhiều so với Scala / Akka, có thể theo cách tương tự như python là giải pháp thay thế nhẹ hơn cho java cho ứng dụng web.
Chris Snow,

@FUD: có thể ý anh ấy là 1000 hướng dẫn Erlang? ông không thể có nghĩa là 1000 thông điệp ...
Erik Kaplun

2
@ErikAllik Ý của anh ấy là 1000 "giảm". Hãy nghĩ về sự giảm thiểu như một mã thông báo để thực thi một đoạn mã (không phải vậy, nhưng nó thực hiện công việc giải thích ...). Sau 1000 lần giảm, bộ lập lịch chuyển sang một quy trình khác. Thông tin khác tại erlang.org/pipermail/erlang-questions/2001-April/003132.html
Aegis

40

Gần như không ai đề cập đến quá trình cô lập. Nếu không có sự đảm bảo về việc "chuỗi của bạn không thể gây rối với rác của tôi", các hệ thống phân tán khó lý giải hơn nhiều. (Họ đã đủ khó với các quy trình của Erlang.)

AFAIK (không xa lắm, với kinh nghiệm trực tiếp hạn chế của tôi với JVM), chỉ Erlang mới thực sự nhận được sự cô lập quy trình "đúng" trên JVM. Ông Google có thể đưa ra một số gợi ý về nơi tìm nghiên cứu của Fox và Candea (?) Về các hệ thống nghiên cứu sử dụng kỹ thuật "khởi động lại vi mô" ("máy tính hướng phục hồi"). Một nhà phát triển Erlang đọc nghiên cứu đó và nói một vài điều:

  1. Chào mừng bạn đến với câu lạc bộ, bạn làm gì lâu vậy?
  2. Tuy nhiên, JVM khiến nó trở nên tồi tệ, rất khó để tham gia. :-)

Quá trình cô lập thực sự là siêu tốt. Tuy nhiên, ngay cả Erlang cũng không miễn nhiễm với NIF đã biến mất.
Viktor Klang

14

Đối với tôi, hoán đổi mã nóng trong toàn bộ cụm Erlang mà không có thời gian chết (ví dụ make:all([netload]:) là một trong những tính năng của kẻ giết người của Erlang.

Nhưng hãy đảo ngược câu hỏi của bạn: Akka có gì mà Erlang không có? Tất nhiên bạn có thể thêm hàng tá tiện ích mở rộng và thư viện (scala, akka, spring, osgi, ...) vào Java để cố gắng tiến gần đến Erlang. Nhưng mấu chốt là ở đâu? Tóm lại, tất cả các tiện ích mở rộng này phức tạp hơn nhiều so với việc học ngôn ngữ Erlang đơn giản, hiện đã được chứng minh trong hơn 2 thập kỷ rằng nó có thể thực hiện công việc cung cấp khả năng mở rộng hàng đầu mà không mất thời gian chết.


30
IMO, Scala là một ngôn ngữ tốt hơn nhiều về cấp độ cú pháp so với Erlang. Nó có các đối tượng, đặc điểm, không gian tên riêng, an toàn kiểu thích hợp, không có cú pháp ghi xấu xí, v.v. Cộng đồng lớn hơn, tôi có thể sử dụng tất cả các công cụ Java có sẵn và nó chỉ cảm thấy bóng bẩy hơn.
ryeguy

15
@ryeguy: "ngôn ngữ tốt hơn ở cấp độ cú pháp" ... hmm, định nghĩa "tốt hơn" cho "cú pháp". Khi tôi so sánh các ngôn ngữ, cú pháp là yếu tố không liên quan nhất (bởi vì nó chỉ là vấn đề sở thích hoặc những gì bạn được sử dụng).
Peer Stritzinger

4
@ryeguy Ngữ nghĩa khác nhau, cú pháp khác nhau.
rvirding

3
nóng đang trao đổi trở thành một nỗi đau nếu bạn cần phải duy trì trạng thái giữa các phiên bản mã khác nhau, cuối cùng nó dễ dàng hơn để tắt quá trình và trạng thái di cư khi khởi động
OlegYch

4
@ryeguy Cú pháp của ngôn ngữ lập trình bên cạnh không liên quan; vấn đề là ngữ nghĩa của nó. Erlang là một PL chức năng nên tất nhiên nó không có đối tượng. Các đặc điểm, an toàn kiểu, v.v. là do Scala là ngôn ngữ được gõ mạnh, trong khi Erlang được gõ động; đó là một sự lựa chọn thiết kế. Tuy nhiên, tôi sẽ mời các bạn hãy nhìn vào Elixir nếu bạn muốn những lợi ích của Erlang với một cảm giác hiện đại hơn;)
Aegis

5

Có lẽ Erlang tốt hơn cho các hệ thống phân tán lớn hơn (theo câu trả lời của vjache) nhưng đối với một máy chủ bình thường khi bạn chỉ muốn sử dụng toàn bộ sức mạnh của nhiều CPU thì Akka là lựa chọn tốt - cung cấp tính trừu tượng, hiệu suất và tích hợp tốt với hệ sinh thái Java.

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.