2011-01-10 25 views

Trả lời

107

Các diễn viên JMS và Scala chia sẻ sự giống nhau về mặt lý thuyết nhưng không nghĩ về chúng nhất thiết phải giải quyết cùng một vấn đề về mặt kiến ​​trúc. Các diễn viên có nghĩa là một sự thay thế nhẹ cho đồng thời dùng chung bộ nhớ, nơi các chủng tộc và deadlocks thường khó tạo ra hơn. JMS là một API tinh vi có nghĩa là span tin nhắn trực tiếp, xuất bản/đăng ký, giao dịch, tích hợp EJB, v.v.

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

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

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

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

Câu hỏi rộng hơn về những gì diễn viên làm mà JMS không thể. Vâng, mà không có xây dựng trong quán rượu phụ hoặc giao dịch có vẻ như các diễn viên trừ từ JMS - và rộng rãi đó là sự thật. Nhưng đây là điều: diễn viên yêu cầu mã rất í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 vặn với JMS và các phụ thuộc của nó hoặc mã nó yêu cầu vv vì vậy tôi sẽ chỉ sinh ra 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 "Tôi sẽ chỉ roi lên một diễn viên và tiếp tục."

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

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

+0

Tôi nghĩ rằng tôi đã bảo hiểm. Tôi đã cập nhật một vài đoạn vă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 của tác nhân. –

+2

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

+7

Tôi nghĩ rằng nó cũng đáng chú ý ở đây nói chung, việc thực hiện 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ó một nhà môi giới bên ngoài.Tất nhiên, nếu bạn muốn nhắn tin nội bộ/quá trình liên kết, bạn sẽ chọn một cách thích hợp. – jasonk

Các vấn đề liên quan