Việc triển khai nhiều Diễn viên trong Scala khác nhau như thế nào?


76

Cùng với việc phát hành Scala 2.9.0, Tackafe Stack 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 tác nhân trong thư viện tiêu chuẩn của nó, Akka sử dụng cách triển khai của riêng nó. Và, nếu chúng tôi tìm kiếm các triển khai khác, chúng tôi cũng sẽ thấy rằng Lift và Scalaz cũng có các triển khai!

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


8
Không phải là 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 dự định hợp nhất dần dần Akka với scala.actors": groups.google.com/group/scala-user/browse_frm/thread/…
ebruchez

2
Có liên quan, vì "Các diễn viên Scala ban đầu hiện không được dùng nữa." trong 2.10 ( scala-lang.org/node/27499 )
MrDrews

Câu trả lời:


95

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 Lift danh tiếng), Jason Zaugg (của Scalaz danh tiếng), Philipp Haller (của Scala Actors 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 bảng hỗ trợ Stack Overflow).

Có một vài chỗ tôi sẽ điền sau khi có thêm thời gian.

Triết lý thiết kế

  • Diễn viên Scalaz

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

  • Diễn viên nâng

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

  • Diễn viên Scala

    Cung cấp mô hình diễn viên Erlang đầy đủ trong Scala, dấu chân bộ nhớ 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

                    Diễn viên Scalaz Nâng cao Diễn viên Scala Diễn viên Akka
Phiên bản ổn định hiện tại. 5 2,1 2,9,0 0,10
Phiên bản Scala tối thiểu. 2,8 2,7,7 2,8
Phiên bản Java tối thiểu. 1,5 1,5 1,6

Hỗ trợ người mẫu diễn viên

                    Diễn viên Scalaz Nâng cao Diễn viên Scala Diễn viên Akka
Sinh ra các diễn viên mới Có Có Có Có Có
bên trong của diễn viên
Gửi tin nhắn đến Có Có Có Có Có
diễn viên nổi tiếng 
Thay đổi hành vi Các tác nhân là Có Có: lồng nhau Có:
cho tin nhắn tiếp theo, phản ứng không thay đổi / nhận được trở thành / không thể thay đổi
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 trạng thái

Nếu người dùng xác định các phương thức công khai trên Actors của họ, liệu chúng có thể được gọi từ bên ngoài không?

  • Diễn viên Scalaz: n / a. Diễn viên là một đặc điểm kín.
  • Diễn viên nâng: Có
  • Diễn viên Scala: Vâng
  • Akka Actors: Không, trường hợp diễn viên được che chắn đằng sau ActorRef.

Loại diễn viên

  • Diễn viên Scalaz: Actor[A] extends A => ()
  • Diễn viên Lift: 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 tác nhân

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

Chế độ gửi tin nhắn

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

(1) Mọi hàm f trở thành một tác nhân như vậy:

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

(2) Mọi hàm f trở thành một tác nhân như vậy:

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

(3) contravariant functor: actor comap f. Ngoài ra thành phần Kleisli trong Promise.

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

TBD

                    Diễn viên Scalaz Nâng cao Diễn viên Scala Diễn viên Akka
trả lời-người gửi-trong-tin nhắn
trả lời tin nhắn

Xử lý tin nhắn

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

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

Cơ chế thực thi thông báo

TBD

                    Diễn viên Scalaz Nâng cao Diễn viên Scala Diễn viên Akka
Tên cho Cơ chế Thực thi
Cơ chế Thực thi mới là
có thể cấu hình
Cơ chế thực thi có thể
được chỉ định trên cơ sở mỗi tác nhân
Vòng đời của Cơ chế Thực thi
phải được quản lý rõ ràng
Thực thi luồng cho mỗi tác nhân
cơ chế
Cơ chế thực thi 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 / Tác nhân từ xa

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

Howtos

TBD

                    Diễn viên Scalaz Nâng cao Diễn viên Scala Diễn viên Akka
Xác định một diễn viên
Tạo một phiên bản diễn viên
Bắt đầu một phiên bản diễn viên
Dừng một phiên bản diễn viên

1
viết tốt 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 với liên kết hiện tại? (Tôi không biết gì về Scala, vì vậy tôi muốn trở thành một thẩm phán xấu của 'hiện tại'.)
yzorg

2
@yzorg Tại thời điểm này, tôi chỉ muốn đi với các diễn viên Akka. Các Diễn viên Scala đang bị họ không ủng hộ và Diễn viên Scalaz / Lift chưa bao giờ nổi tiếng bên ngoài sân cỏ của họ.
Daniel C. Sobral

23
  • 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 để tạo ra một triển khai tốt hơn (trong một số trường hợp) và hiệu quả 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, được 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 một nền tảng tốt, một tập hợp các nguyên bản ổn định phải được sử dụng để xây dựng một khuôn khổ cấp cao hơn - vào cuối ngày, bạn sẽ phải viết người giám sát của riêng mình, danh mục các tác nhân, máy trạng thái hữu hạn, v.v. lên trên các tác nhân.

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

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


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.