Những quyết định thiết kế nào sẽ ủng hộ Scala's Actors thay vì JMS?


81

Sự khác biệt khi sử dụng Scala Actors thay vì JMS là gì?

Ví dụ từ góc độ hiệu suất và khả năng mở rộng, mô hình Scala Actor bổ sung gì so với JMS? Trong những trường hợp nào thì sử dụng Actors hơn là JMS, tức là Actors giải quyết những vấn đề gì mà JMS không thể giải quyết?

Câu trả lời:


112

Các tác nhân JMS và Scala có chung một điểm giống nhau về mặt lý thuyết nhưng không nghĩ rằng chúng nhất thiết phải giải quyết các vấn đề giống nhau về mặt kiến ​​trúc. Các tác nhân được coi là một giải pháp thay thế nhẹ nhàng cho đồng thời bộ nhớ dùng chung, nơi mà các chủng tộc và bế tắc thường khó vô tình tạo ra hơn. JMS là một API phức tạp dùng để mở rộng tin nhắn trực tiếp, xuất bản / đăng ký, giao dịch, tích hợp EJB, v.v.

JMS gần nhất tương đương với một tác nhân sẽ là một bean hướng thông điệp được hỗ trợ bởi một hàng đợi không liên tục, không giao dịch, không phải pub / phụ. Tôi sẽ gọi đó là một "hạt đậu JMS đơn giản".

Bây giờ, câu hỏi của bạn.

Hiệu suất là một điều khó nói vì JMS là một đặc tả hơn là một triển khai. Không hề kém cạnh khi sử dụng JMS bean đơn giản, tôi mong đợi hiệu suất gần như tương tự với một chút lợi thế về thời gian và trí nhớ của diễn viên. Khi bạn thêm các khả năng vào JMS như pub / sub, giao dịch, v.v., hiệu suất tự nhiên sẽ giảm hơn nữa nhưng khi đó bạn đang cố so sánh táo với cam.

Đối với khả năng mở rộng, các bean JMS đơn giản nên mở rộng quy mô khá giống với các diễn viên. Việc thêm các giao dịch vào hỗn hợp JMS đương nhiên sẽ ảnh hưởng đến khả năng mở rộng một lượng tùy thuộc vào phạm vi của các giao dịch.

Câu hỏi rộng hơn là các tác nhân làm gì mà JMS không thể. Chà, nếu không có các giao dịch hoặc phụ của quán rượu được tích hợp sẵn thì có vẻ như các tác nhân sẽ trừ khỏi JMS - và nói chung là đúng. Nhưng đây là vấn đề: các diễn viên yêu cầu quá ít mã để tôi có thể vui vẻ sử dụng chúng cho đồng thời hạt rất tốt. Trong mã Java thông thường, tôi có thể nói "Tôi không cảm thấy thích thú với JMS và các phụ thuộc của nó hoặc mã mà nó yêu cầu, v.v. vì vậy tôi sẽ chỉ tạo một luồng, sử dụng khóa và chia sẻ cấu trúc dữ liệu." Với các diễn viên Scala, tôi có nhiều khả năng nói rằng "Tôi sẽ chỉ cần chọn một diễn viên và tiếp tục."

Ngoài ra còn có một sự khác biệt triết học trong thiết kế. Các diễn viên có một khái niệm đơn giản, được xây dựng trong hệ thống phân cấp của người giám sát. Các diễn viên thường được sử dụng trong thiết kế "để nó sụp đổ". Nếu một diễn viên chết vì một lý do nào đó thì một diễn viên khác có trách nhiệm quyết định phải làm gì với điều đó, chẳng hạn như khởi động lại diễn viên đó, giết một loạt diễn viên và khởi động lại tất cả họ, hoặc giết một loạt diễn viên và chính mình để một số diễn viên khác có thể đối phó với vấn đề. Loại thứ đó có thể được thêm vào JMS, nhưng nó không phải là cốt lõi của API và phải được quản lý bên ngoài bằng cách nào đó.

Nhân tiện, đối với một thư viện Scala diễn viên di chuyển nhiều hơn vào các lĩnh vực mà JMS bao gồm, hãy xem Akka . Akka cũng mang đến cách tiếp cận mang tính khai báo cho nhiều chiến lược phân cấp tác nhân phổ biến.


Tôi nghĩ rằng tôi đã được bảo hiểm. Tôi đã cập nhật một vài đoạn cuối để làm rõ điều đó và tôi cũng giải thích một chút về phân cấp diễn viên.
James Iry

2
Kristian, không chính xác. Diễn viên Akka thường nhẹ cân hơn diễn viên Scala. Tuy nhiên, API và cài đặt cấu hình của chúng phức tạp hơn một chút. Tôi sử dụng các tác nhân Scala khi độ trễ / thông lượng không phải là vấn đề (ví dụ: đối với các tác vụ nhân viên sinh sản) và các tác nhân Akka khi họ đang ở đó hoặc nếu tôi cần giám sát.
Alexander Temerev

8
Tôi nghĩ cũng cần lưu ý ở đây rằng nói chung, việc triển khai JMS sẽ yêu cầu một nhà môi giới bên ngoài, nơi Akka / Actors có thể chạy mà không cần một nhà môi giới bên ngoài. Tất nhiên, nếu bạn muốn nhắn tin liên quá trình / máy chủ lưu trữ, bạn sẽ chọn một cách thích hợp.
jasonk
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.