Trước hết, hệ thống thông báo "cũ" (MQ) đã cũ hơn trong việc triển khai nhưng chúng là một ý tưởng kỹ thuật mới hơn về: hàng đợi liên tục giao dịch . Scala Actors và Akka có thể là một triển khai mới hơn nhưng được xây dựng trên một mô hình đồng thời cũ hơn của Actors.
Tuy nhiên, hai mô hình cuối cùng rất giống nhau trong thực tế vì cả hai đều dựa trên thông điệp sự kiện: Hãy xem câu trả lời của tôi cho RabbitMQ vs Akka .
Nếu bạn chỉ viết mã cho JVM thì Akka có lẽ là một lựa chọn tốt. Nếu không, tôi sẽ sử dụng RabbitMQ.
Ngoài ra, nếu bạn là một nhà phát triển Scala, thì Akka hẳn là một người không có trí tuệ. Tuy nhiên, các liên kết Java của Akka không phải là Java-ish và yêu cầu ép kiểu do hệ thống kiểu của Scala.
Ngoài ra, trong Java, mọi người thường không tạo các đối tượng bất biến mà tôi khuyên bạn nên làm để nhắn tin. Do đó, trong Java rất dễ vô tình làm điều gì đó bằng cách sử dụng Akka sẽ không mở rộng quy mô (sử dụng các đối tượng có thể thay đổi cho các thông báo, dựa vào trạng thái gọi lại đóng cửa kỳ lạ). Với MQ, đây không phải là vấn đề vì các tin nhắn luôn được nối tiếp với chi phí tốc độ. Với Akka, họ thường không như vậy.
Akka cũng mở rộng quy mô tốt hơn với lượng người tiêu dùng lớn hơn hầu hết MQ. Điều này là do đối với hầu hết các máy khách MQ (JMS, AMQP) mọi kết nối hàng đợi đều yêu cầu một luồng ... do đó rất nhiều hàng đợi == rất nhiều luồng chạy vĩnh viễn. Đây chủ yếu là một vấn đề của khách hàng. Tôi nghĩ ActiveMQ Apollo có một bộ điều phối không chặn có mục đích khắc phục sự cố đó cho AMQP. Ứng dụng khách RabbitMQ có các kênh cho phép bạn kết hợp nhiều người tiêu dùng nhưng vẫn có vấn đề với số lượng lớn người tiêu dùng có khả năng gây ra bế tắc hoặc kết nối chết vì vậy thường nhiều chủ đề hơn được thêm vào để tránh vấn đề này.
Điều đó được cho là sự hối hận của Akka là khá mới và có lẽ vẫn chưa cung cấp tất cả các đảm bảo tin nhắn và QoS đáng tin cậy mà hàng đợi tin nhắn truyền thống cung cấp (nhưng điều đó đang thay đổi hàng ngày). Nó cũng thường là ngang hàng nhưng tôi có nghĩ rằng hỗ trợ máy chủ-để-ngang hàng thường là những gì hầu hết các hệ thống MQ làm (tức là một điểm lỗi) nhưng có các hệ thống MQ là ngang hàng (RabbitMQ là máy chủ- ngang hàng).
Cuối cùng thì RabbitMQ và Akka thực sự là một cặp ăn ý. Bạn có thể sử dụng Akka làm trình bao bọc đặc biệt cho RabbitMQ vì RabbitMQ không giúp bạn xử lý việc tiêu thụ tin nhắn và định tuyến tin nhắn cục bộ (trong một JVM duy nhất).
Khi nào chọn Akka
- Có nhiều người tiêu dùng (nghĩ đến hàng triệu).
- Cần độ trễ thấp
- Mở cho mô hình đồng thời Actor
Hệ thống ví dụ: Hệ thống trò chuyện thời gian thực tương tác
Khi nào chọn MQ
- Cần tích hợp với nhiều hệ thống khác nhau (tức là không phải JVM)
- Độ tin cậy của tin nhắn quan trọng hơn độ trễ
- Muốn có thêm công cụ và giao diện người dùng quản trị
- Vì những điểm trước đó tốt hơn cho các tác vụ chạy lâu
- Muốn sử dụng một mô hình đồng thời khác với Actors
Hệ thống ví dụ: Hệ thống xử lý hàng loạt giao dịch theo lịch trình
CHỈNH SỬA dựa trên các nhận xét có liên quan
Tôi đã giả định rằng OP quan tâm đến việc xử lý phân tán mà cả Akka và Hàng đợi Thư đều có thể xử lý. Đó là tôi cho rằng anh ta đang nói về Akka phân tán . Sử dụng Akka cho đồng thời cục bộ là một so sánh táo với cam đối với hầu hết các hàng đợi tin nhắn . Tôi nói hầu hết vì bạn có thể áp dụng cục bộ mô hình hàng đợi tin nhắn như một mô hình đồng thời (tức là chủ đề, hàng đợi, trao đổi) mà cả thư viện Reactor và simple-react đều làm.
Chọn đúng mô hình / thư viện đồng thời là rất quan trọng đối với các ứng dụng có độ trễ thấp. Một giải pháp xử lý phân tán như hàng đợi tin nhắn thường không lý tưởng vì việc định tuyến hầu như luôn được thực hiện qua dây, rõ ràng là chậm hơn so với trong ứng dụng và do đó Akka sẽ là một lựa chọn tốt hơn. Tuy nhiên, tôi tin rằng một số công nghệ MQ độc quyền cho phép định tuyến cục bộ. Cũng như tôi đã đề cập trước đó, hầu hết các máy khách MQ khá ngu ngốc về phân luồng và không dựa vào IO không chặn và có một luồng cho mỗi kết nối / hàng đợi / kênh ... trớ trêu thay, io không chặn không phải lúc nào cũng có độ trễ thấp mà nói chung là nhiều tài nguyên hơn Có hiệu quả.
Như bạn có thể thấy chủ đề của lập trình phân tán và lập trình đồng thời là khá lớn và thay đổi hàng ngày nên ý định ban đầu của tôi không gây nhầm lẫn mà là tập trung vào một lĩnh vực cụ thể của xử lý thông điệp phân tán, đó là điều tôi mặc dù OP đã quan tâm. Về mặt đồng thời, người ta có thể muốn tập trung tìm kiếm của họ vào lập trình "phản ứng" (RFP / luồng) là một mô hình "mới hơn" nhưng tương tự với mô hình tác nhân và mô hình hàng đợi tin nhắn mà tất cả các mô hình này nói chung có thể được kết hợp vì chúng dựa trên sự kiện.