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.