По-перше, "старіші" системи повідомлень (MQ) старші у впровадженні, але вони новіші в інженерній ідеї: стійкі транзакційні черги . Scala Actors та Akka, можливо, новіша реалізація, але побудовані на старій моделі одночасності Actors.
Обидві моделі, однак, на практиці дуже схожі, тому що обидві вони базуються на повідомленні про події: Дивіться мою відповідь на RabbitMQ vs Akka .
Якщо ви збираєтеся кодувати лише JVM, то Akka, ймовірно, хороший вибір. Інакше я б використав RabbitMQ.
Крім того, якщо ви розробник Scala, то Акка повинен бути непродуманим. Однак прив'язки Java до Java не є дуже Java-ish і вимагають лиття завдяки системі типу Scala.
Також на Java люди зазвичай не роблять незмінних об'єктів, які я рекомендую робити для обміну повідомленнями. Отже, в Java дуже просто випадково зробити щось, використовуючи Akka, що не змінює масштаб (використовуючи змінні об’єкти для повідомлень, спираючись на дивний стан зворотного виклику закриття). З MQ це не проблема, оскільки повідомлення завжди серіалізуються ціною швидкості. З Аккою вони взагалі ні.
Akka також краще масштабує велику кількість споживачів, ніж більшість MQ. Це тому, що для більшості клієнтів MQ (JMS, AMQP) для кожного з'єднання черги потрібна нитка ... таким чином, безліч черг == безліч постійно працюючих потоків. В основному це питання клієнта. Я думаю, що ActiveMQ Apollo має незаблокувальний диспетчер, який нібито виправляє цю проблему для AMQP. Клієнт RabbitMQ має канали, які дозволяють об'єднати декількох споживачів, але все ще існують проблеми з великою кількістю споживачів, які потенційно можуть спричинити відмирання тупиків або з’єднань, тому, як правило, додано більше потоків, щоб уникнути цієї проблеми.
Але, скажімо, видалення Акки є доволі новим і, ймовірно, все ще не пропонує всіх надійних гарантій повідомлень та QoS, які надають традиційні черги повідомлень (але це змінюється щодня). Її також взагалі одноранговий, але я думаю, що підтримує сервер-до-одноранговий, що, як правило, робить більшість MQ-систем (тобто, одна точка відмови), але є системи MQ, які є одноранговими (RabbitMQ - це сервер- to-peer).
Нарешті, RabbitMQ та Akka насправді роблять хорошу пару. Ви можете використовувати Akka як обгортку для RabbitMQ, особливо оскільки RabbitMQ не допомагає вам обробляти споживання повідомлень та маршрутизувати повідомлення локально (в одному JVM).
Коли вибрати Акку
- Мають багато споживачів (думають мільйони).
- Потрібна низька затримка
- Відкрийте модель паралельної гри Actor
Приклад системи: інтерактивна система чату в режимі реального часу
Коли вибрати MQ
- Необхідність інтеграції з великою кількістю різних систем (тобто, не JVM)
- Надійність повідомлення важливіша затримка
- Хочеться більше інструментів та інтерфейсу адміністратора
- Через попередні бали краще для тривалих виконання завдань
- Хотіли б використовувати іншу модель одночасності, ніж Актори
Приклад системи: Планова транзакційна система пакетної обробки
EDIT на основі заклопотаних коментарів
Я зробив припущення, що ОП стосується розподіленої обробки, з якою можуть працювати і Акка, і Черги повідомлень. Тобто я припускаю, що він говорив про розподілену Акку . Використання Akka для локальної паралельності - це яблуко-помаранчеве порівняння з більшістю черг повідомлень . Я кажу найбільше, тому що ви можете застосувати модель черги повідомлень локально як модель одночасності (тобто тему, черги, обміни), що і бібліотека Reactor, і проста реакція .
Вибір правильної моделі / бібліотеки одночасності дуже важливий для додатків із низькою затримкою. Розподілене рішення для обробки, таке як черга повідомлень, як правило, не є ідеальним, оскільки маршрутизація майже завжди проводиться по дроту, який, очевидно, повільніше, ніж у межах програми, і тому Akka був би найкращим вибором. Однак я вважаю, що деякі власні MQ технології дозволяють здійснювати локальну маршрутизацію. Крім того, як я вже згадував, більшість клієнтів MQ досить нерозумні щодо нарізування різьби і не покладаються на неблокуючий IO і мають потік на з'єднання / чергу / канал ... За іронією долі, що не блокує io, це не завжди низька затримка, але, як правило, більше ресурсу ефективний.
Як ви бачите, тема розподіленого програмування та паралельного програмування є досить великою і щодня змінюється, тому мій початковий задум не був переплутаним, а зосереджений на одній конкретній області розподіленої обробки повідомлень, що я хоч і стосувався ОП. З точки зору одночасності можна сфокусувати свої пошуки на "реактивному" програмуванні (RFP / потоки), що є "більш новою", але подібною моделлю до акторської моделі та моделі черги повідомлень, з якою всі ці моделі можуть бути об'єднані, оскільки вони на основі подій.