Какие дизайнерские решения предпочтут актеры Scala вместо JMS? - PullRequest
81 голосов
/ 10 января 2011

Чем отличаются актеры Scala вместо JMS?

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

1 Ответ

112 голосов
/ 10 января 2011

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

Ближайшим JMS-эквивалентом для субъекта будет управляемый сообщениями компонент, поддерживаемый непостоянной, нетранзакционной, неопубликованной / подпоследовательностью. Я назову это «простым компонентом JMS».

Теперь к вашим вопросам.

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

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

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

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

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

...