Câu hỏi Việc triển khai nhiều diễn viên trong Scala khác nhau như thế nào?


Với việc phát hành Scala 2.9.0, Stack Typesafe cũng đã được công bố, kết hợp ngôn ngữ Scala với khung công tác Akka. Bây giờ, mặc dù Scala có các diễn viên trong thư viện chuẩn của nó, Akka sử dụng thực hiện riêng của nó. Và, nếu chúng ta tìm kiếm các triển khai khác, chúng ta cũng sẽ thấy rằng Lift và Scalaz cũng có triển khai!

Vì vậy, sự khác nhau giữa các triển khai này là gì?


76
2018-05-13 19:47


gốc


Không phải là một câu trả lời trực tiếp cho câu hỏi, nhưng Martin đã đề cập gần đây rằng "Trong các phiên bản tiếp theo, chúng tôi có kế hoạch dần dần sáp nhập Akka với scala.actors": groups.google.com/group/scala-user/browse_frm/thread/… - ebruchez
Có liên quan, vì "Các diễn viên Scala ban đầu hiện không được chấp nhận." trong 2,10 (scala-lang.org/node/27499) - MrDrews


Các câu trả lời:


Câu trả lời này không thực sự là của tôi. Nó được sản xuất bởi Viktor Klang (của Akka nổi tiếng) với sự giúp đỡ của David Pollak (của danh tiếng Lift), Jason Zaugg (của Scalaz nổi tiếng), Philipp Haller (của Scala diễn viên nổi tiếng).

Tất cả những gì tôi đang làm ở đây là định dạng nó (sẽ dễ dàng hơn nếu các bảng hỗ trợ Stack Overflow).

Có một vài nơi tôi sẽ điền sau khi tôi có nhiều thời gian hơn.

Triết lý thiết kế

  • Diễn viên Scalaz

    Độ phức tạp tối thiểu. Tổng quát, mô đun và khả năng mở rộng tối đa.

  • Lift Actors

    Độ phức tạp tối thiểu, Bộ sưu tập rác của JVM thay vì lo lắng về vòng đời rõ ràng, hành vi xử lý lỗi phù hợp với các chương trình Scala & Java khác, lưu lượng bộ nhớ nhẹ / nhỏ, hộp thư, tương tự như Scala Actors và Erlang, hiệu suất cao.

  • Diễn viên Scala

    Cung cấp đầy đủ mô hình diễn viên Erlang trong Scala, trọng lượng nhẹ / bộ nhớ nhỏ.

  • Diễn viên Akka

    Phân phối đơn giản và minh bạch, hiệu suất cao, nhẹ và có khả năng thích ứng cao.

Phiên bản

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Hiện tại ổn định ver. 5 2.1 2.9.0 0.10
Tối thiểu Scala ver. 2.8 2.7.7 2.8
Java tối thiểu ver. 1,5 1,5 1,6

Actor Model Hỗ trợ

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Sinh sản diễn viên mới Có Có Có Có
bên trong của diễn viên
Gửi tin nhắn đến Có Có Có Có
diễn viên nổi tiếng
Thay đổi hành vi Diễn viên là Có Có: lồng nhau Có:
cho thông điệp tiếp theo bất biến phản ứng / nhận được trở thành / unbecome
Giám sát Không được cung cấp Không có diễn viên: Có, Có
(link / trapExit) Lò phản ứng: Không

Mức độ cô lập nhà nước

Nếu người dùng xác định phương pháp công khai trên diễn viên của họ, họ có thể gọi từ bên ngoài?

  • Diễn viên Scalaz: n / a. Diễn viên là một đặc điểm kín.
  • Diễn viên thang máy: Có
  • Diễn viên Scala: Có
  • Diễn viên Akka: Không, diễn viên được bảo vệ sau ActorRef.

Loại diễn viên

  • Diễn viên Scalaz: Actor[A] extends A => ()
  • Diễn viên nâng cao: LiftActor, SpecializeLiftActor[T]
  • Diễn viên Scala: Reactor[T], Actor extends Reactor[Any]
  • Diễn viên Akka: Actor[Any]

Quản lý vòng đời của diễn viên

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Bắt đầu thủ công No No Yes Yes
Dừng thủ công No No No Yes
Khởi động lại-trên-thất bại n / a Có Có Cấu hình cho mỗi cá thể tác nhân
Khởi động lại ngữ nghĩa n / a Diễn viên chạy lại Khôi phục diễn viên về trạng thái ổn định bằng cách phân bổ lại nó và
                                                    hành vi vứt bỏ trường hợp cũ
Khởi động lại cấu hình n / a n / a X lần, X lần trong thời gian Y
Vòng đời được cung cấp Không có vòng đời preStart, postStop, preRestart, postRestart

Chế độ gửi tin nhắn

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Cháy-quên một! tin nhắn diễn viên! msg diễn viên! msg actorRef! thông điệp
                    một thông điệp)
Gửi-nhận-trả lời (xem 1) diễn viên!? msg diễn viên!? msg actorRef !! thông điệp
                                    diễn viên !! thông điệp
Diễn viên gửi-nhận-tương lai (xem 2) !! msg actorRef !!! thông điệp
Gửi kết quả của lời hứa (tin nhắn). future.onComplete (f => to! f.result)
tương lai để (diễn viên)
Soạn diễn viên với diễn viên comap f No No No
chức năng (xem 3)

(1) Bất kỳ hàm f nào cũng trở thành một diễn viên:

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2) Bất kỳ hàm f nào cũng trở thành một diễn viên:

val a = f.promise
val replyFuture = a(message)

(3) Thư viện Contravariant: actor comap f. Ngoài ra thành phần Kleisli trong Promise.

Chế độ trả lời tin nhắn

TBD

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
thư trả lời người gửi
thư trả lời

Xử lý tin nhắn

Hỗ trợ nhận lồng nhau?

  • Diễn viên Scalaz: -
  • Thang máy diễn viên: Có (với một mã hóa tay nhỏ).
  • Diễn viên Scala: Có, cả dựa trên luồng và phản ứng dựa trên sự kiện.
  • Diễn viên Akka: Không, các nhận làm tổ có thể dẫn đến rò rỉ bộ nhớ và hiệu suất bị suy giảm theo thời gian.

Cơ chế thực thi thông điệp

TBD

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Tên cơ chế thực thi
Cơ Chế Thi Hành bây giờ là
có thể cấu hình
Cơ chế thực hiện có thể là
được chỉ định trên cơ sở mỗi tác nhân
Vòng đời của cơ chế thi hành
phải được quản lý một cách rõ ràng
Thực thi chủ đề cho mỗi diễn viên
cơ chế
Cơ chế thực hiện theo hướng sự kiện
Loại hộp thư
Hỗ trợ hộp thư tạm thời
Hỗ trợ hộp thư liên tục

Phân phối / Diễn viên từ xa

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Điều khiển từ xa trong suốt n / a Không Có Có
diễn viên
Giao thức truyền tải n / a n / a Giao thức từ xa Java Akka
                                                    serialization (Protobuf trên đầu trang của TCP)
                                                    trên đầu trang của TCP
Phân cụm động n / a n / a n / a Trong chào hàng thương mại

Howtos

TBD

                    Scalaz Actors Lift Diễn viên Scala Diễn viên Akka Diễn viên
Xác định một diễn viên
Tạo một cá thể diễn viên
Bắt đầu một cá thể diễn viên
Dừng một cá thể diễn viên

95
2018-05-13 20:53



viết tuyệt vời cảm ơn bạn. Có ai đo dấu chân bộ nhớ và hiệu suất không? - Johan Prinsloo
Liên kết bị hỏng, vui lòng chỉnh sửa liên kết hiện tại? (Tôi không biết gì về Scala, vì vậy tôi sẽ là một thẩm phán tồi tệ của 'hiện tại'.) - yzorg
@yzorg Tại thời điểm này, tôi chỉ đi với các diễn viên Akka. Các diễn viên Scala đang bị phản đối vì lợi ích của họ, và các diễn viên Scalaz / Lift không bao giờ nổi tiếng bên ngoài sân cỏ của họ. - Daniel C. Sobral
Đây là một câu trả lời tuyệt vời. Cảm ơn bạn đã cung cấp điều này! - MEMark


  • scala.actors là nỗ lực nghiêm túc đầu tiên để triển khai đồng thời kiểu Erlang trong Scala, đã truyền cảm hứng cho các nhà thiết kế thư viện khác để làm tốt hơn (trong một số trường hợp) và triển khai thực hiện nhiều hơn. Vấn đề lớn nhất (ít nhất là đối với tôi), là không giống như các quy trình Erlang, bổ sung với OTP (cho phép xây dựng các hệ thống chịu lỗi), scala.actors chỉ cung cấp nền tảng tốt, một tập hợp các nguyên thủy ổn định phải được sử dụng để xây dựng một khung công tác cấp cao hơn - vào cuối ngày, bạn sẽ phải viết giám sát của riêng bạn, danh mục diễn viên, máy trạng thái hữu hạn, v.v. trên các diễn viên.

  • Và đây Akka đi đến giải cứu, cung cấp một ngăn xếp đầy đủ tính năng cho phát triển dựa trên diễn viên: các diễn viên thành ngữ hơn, bộ trừu tượng cấp cao để điều phối (cân bằng tải, hồ bơi diễn viên, vv) và xây dựng hệ thống chịu lỗi (giám sát viên, được chuyển từ OTP, vv), lịch trình dễ dàng cấu hình (điều phối viên), v.v. Xin lỗi, nếu tôi nghe có vẻ thô lỗ, nhưng tôi nghĩ, sẽ không có sự hợp nhất 2,9,0+ - Tôi mong đợi Akka diễn viên để dần dần thay thế thực hiện stdlib.

  • Scalaz. Thông thường, tôi có thư viện này trong danh sách phụ thuộc của tất cả các dự án của tôi và khi nào vì một số lý do, tôi không thể sử dụng Akka, không chặn Lời hứa của Scalaz (với tất cả sự tốt lành, như sequence) kết hợp với các diễn viên tiêu chuẩn đang tiết kiệm trong ngày. Tôi chưa từng sử dụng Scalaz diễn viên như một sự thay thế cho scala.actors hoặc là Akka, Tuy nhiên.


23
2018-05-13 21:13





Diễn viên: Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1

Mã kiểm tra & các kết quả cho độ trễ trung bình và thông lượng trên JVM 1.8.0_x.


2
2018-04-02 10:24



Wow, tôi ngạc nhiên khi thấy rằng Scalaz cạnh tranh với Akka về độ trễ và thông lượng. - Rafael S. Calsaverini