Какие дизайнерские решения будут в пользу актеров в Scala, а не ОМС?
каковы различия в использовании актеров Scala вместо JMS?
например, с точки зрения производительности и масштабируемости, что модель Scala Actor добавляет по сравнению с JMS? В каких случаях имеет смысл использовать акторов, а не JMS, т. е. какие проблемы решают акторы, которые JMS не может охватить?
1 ответ:
актеры JMS и Scala имеют теоретическое сходство, но не считают, что они обязательно решают одни и те же проблемы архитектурно. Актеры должны быть легкой альтернативой параллелизму с общей памятью, где гонки и тупики, как правило, сложнее случайно создать. JMS-это сложный API, который предназначен для прямого обмена сообщениями, публикации/подписки, транзакций, интеграции EJB и т. д.
ближайшим эквивалентом JMS для актера будет сообщение, управляемое боб, который поддерживается непостоянной, нетранзакционной, не-pub/sub очередью. Я назову это "простой Боб JMS".
теперь на ваши вопросы.
производительность-это трудно говорить, так как JMS-это спецификация, а не реализация. Тем не менее, при использовании простого JMS bean я ожидал бы, что производительность будет примерно похожа, возможно, с небольшим преимуществом перед актером во времени и памяти. Как вы добавляете возможности к JMS, такие как паб / sub, транзакции и т. д производительность, естественно, ухудшится еще больше, но тогда вы пытаетесь сравнить яблоки с апельсинами.
Что касается масштабируемости, простые бобы JMS должны масштабироваться почти точно так же, как и актеры. Добавление транзакций в смесь JMS, естественно, повредит масштабируемости на сумму, зависящую от объема транзакций.
более широкий вопрос о том, что делают актеры, что JMS не может. ну, без встроенного суб паба или транзакций казалось бы, что актеры вычитают из JMS - и в целом это правда. Но вот что: актеры требуют так мало кода, что я могу с радостью использовать их для очень мелкозернистого параллелизма. В обычном Java-коде я мог бы сказать: "я не чувствую, что завинчиваю JMS и его зависимости или код, который он требует и т. д., Поэтому я просто создам поток, использую блокировку и разделяю структуру данных."С актерами Scala я гораздо чаще говорю:" я просто подниму актера и пойду дальше."
есть также философская разница в дизайн. У актеров есть простая, встроенная концепция иерархий супервизоров. Актеры обычно используются в дизайне" let it crash". Если актер умирает по какой-то причине, то другой актер отвечает за решение, что с этим делать, например, перезапустить этого актера, убить кучу актеров и перезапустить их всех или убить кучу актеров и себя, чтобы какой-то актер оттер мог справиться с проблемой. Такая вещь может быть добавлена в JMS, но она не является ядром API и должна управляться внешне как-то так.
кстати, для библиотеки Scala actor, которая больше перемещается в области, которые охватывает JMS, см. Акка. Акка также приносит декларативный подход ко многим общим стратегиям иерархии акторов.