Какие дизайнерские решения понравятся Scala Актерам вместо JMS?

Каковы различия с использованием Scala Актеров вместо JMS?

Например, с точки зрения производительности и масштабируемости, что добавляет модель Scala Actor по сравнению с JMS? В каких случаях имеет смысл использовать Актеры, а не JMS, то есть какие проблемы затрагивают актеры, которые JMS не может покрыть?

Ответ 1

JMS и Scala актеры разделяют теоретическое сходство, но не думают о них как о необходимости решения тех же проблем в архитектуре. Актеры должны быть легкой альтернативой памяти с общим объемом памяти concurrency, где, как правило, труднее создавать случайные и тупиковые блоки. JMS - это сложный API, который предназначен для прямого обмена сообщениями, публикации/подписки, транзакций, интеграции EJB и т.д.

Ближайшая JMS, эквивалентная актеру, будет управляться сообщением bean, который поддерживается не-постоянной, не транзакционной, не-pub/sub queue. Я назову это "простой JMS bean".

Теперь, на ваши вопросы.

Производительность трудно обсуждать, поскольку JMS - это спецификация, а не реализация. Тем не менее при использовании простой JMS bean я ожидал бы, что производительность будет примерно одинаковой, возможно, с небольшим краем актера во времени и в памяти. По мере добавления возможностей для JMS, таких как pub/sub, транзакции и т.д. Производительность, естественно, ухудшится еще больше, но затем вы пытаетесь сравнить яблоки с апельсинами.

Что касается масштабируемости, то простая JMS beans должна масштабироваться точно так же, как и субъекты. Добавление транзакций в JMS-микс естественным образом наносит ущерб масштабируемости на сумму, зависящую от объема транзакций.

Более широкий вопрос о том, что делают актеры, что JMS не может. Ну, без встроенных пабов или транзакций казалось бы, что актеры вычитают из JMS - и в целом это правда. Но вот что: актеры требуют так мало кода, что я могу с радостью использовать их для очень мелкозернистого concurrency. В обычном Java-коде я мог бы сказать: "Я не чувствую прикручивания JMS и его зависимостей или кода, который он требует и т.д., Поэтому я просто создаю поток, использую блокировку и разделяю структуру данных". С актерами Scala я с большей вероятностью скажу: "Я просто подниму актера и двигаюсь дальше".

Там также философская разница в дизайне. Актеры имеют простую, встроенную концепцию иерархии супервизора. Актеры обычно используются в дизайне "пусть он падает". Если какой-то актер умирает по какой-то причине, тогда другой актер несет ответственность за решение, что с ним делать, например, перезапустить этого актера, убить группу актеров и перезапустить их всех или убить кучу актеров и себя, чтобы кто-то другой актер мог справиться с этой проблемой. Такие вещи могут быть добавлены в JMS, но это не ядро ​​API и должно управляться извне каким-то образом.

Кстати, для библиотеки актеров Scala, которая больше перемещается в области, которые покрывает JMS, смотрите Akka. Акка также приносит декларативный подход ко многим общим стратегиям иерархии актеров.