Ответ 1
Отвечая на мой вопрос. Просто чтобы поделиться своими мыслями, что я придумала.
Если у нас уже есть работающее веб-приложение, основанное на Servlets/Spring MVC, кажется, что часто нет веской причины переключаться на Actors
/AKKA
(или вводить актеров в существующую систему просто для взлома), если в нашем приложение мы:
- Не имейте: логикурабочих потоков, когда задачи разделяются на фоне. (как правило, типичное веб-приложение не имеет этого), как длинные и длинные вычисления. (параллелизм).
- Иметь: Если у нас есть последовательные вызовы - когда один компонент вызывает другой, то это вызывает другой, где вызовы зависят друг от друга: Контроллеры вызывают Компонент, Компонент сохраняет некоторые данные в некоторый Список (который является изменяемым, но синхронизируется как Synchronized-list).
- Не располагайте свободным временем для замены всех Spring Controllers актерами Akka или использования разных серверов вообще (не Tomcat) (не так много менеджеров/владельцев продуктов, которые позволили бы вам это сделать)
Что плохого в том, что актеры в этой простой системе:
Наличие тонн сообщений (классы, которые переносят команды в/из актеров), которые проходят через компоненты вместо вызова общих методов (используя преимущества OPP, реализуя интерфейсы, имея несколько реализаций - но Актеры обычно
final class
).Иметь сообщения в виде
string
, тоже не очень хорошее решение - так как их сложно отлаживать.В такой системе (например, на сайте MVC) обычно не так много вещей для синхронизации (это уже довольно
stateless
). В каждом контроллере/компоненте есть 0..2mutable shared data
. Что не так сложно синхронизировать (просто приучите синхронизировать все общее и общее в верхней части ваших классов (чтобы состояния были распознаваемыми/локализованными). Иногда вам просто нужноsynchronized collection
или использовать оболочку javaAtomic
типа.
Когда актеры могут быть использованы для существующего приложения. Варианты использования могут быть такими:
- когда у нас есть долгоживущий поиск, он проходит через несколько источников (вид рабочего потока). Наличие нескольких /pull
MasterActor
→SiteSearchActor
(как это было описано для вычисленийPI
здесь). MasterActor имеет окончательный результат. Где SiteSearchActor вычисляет (выполняет поиск по нескольким сайтам) несколько клиентов. - или когда у нас есть какие-либо ветки потоков, из текущих сервлетов
- когда мы точно знаем/выяснили, что наша система будет использоваться миллионами клиентов (даже с простой логикой), мы должны заранее подумать о
scalability
иperformance
(- Актеры хорошо масштабируются - мы можем делегировать одну работу от одного актера к N-тем.
- актеры сохраняют тип процессора при работе с потоками (не нужно 10000 потоков для 10000 клиентов, в большинстве случаев достаточно иметь 4 потока (столько же, сколько позволяет процессорное ядро) говори))
Но в целом я согласен с этой статьей о concurrency
и parallelism
. Если бы у меня была возможность создать приложение с нуля, я бы использовал Akka без контейнера сервлетов и как-то заботился о сообщениях (классы команд) и ООП, когда это необходимо для использования (в общих веб-приложениях OOP
не так много. В любом случае, я бы сказал, но никто не мешает придерживаться бизнес-логики OOP
, актеры - просто клей связи). Это намного лучше/проще, чем, например, использовать JMS.
Но, как я уже сказал:
Актеры/Акка хороша для:
- Сервисы/Контроллеры (вместо Servlet/SpringMVC)
- Работники потоков любят логику
- Особенно для проекта с нуля (когда существующая инфраструктура не делает вас барьерами для применения актера).
Единственный вопрос, который у меня сейчас есть, это performance comparison
. Предполагая, что мы знаем, что:
наличие 10000 потоков в одной JVM с синхронизацией и блокировками для общего доступа изменяемые данные в наших контроллерах/сервисах MVC могут быть очень плохими с точки зрения производительности. Так как есть много возможных замков, потоки, которые являются параллельными (конкурент или конкурент для hared ресурс) друг другу.
Если бы у нас был такой же сценарий для AKKA/Servlets с N (актеры, где N гораздо больше меньше, чем 1000), мы, скорее всего, имели бы гораздо лучшую производительность (поскольку никто не блокировал никого, кроме самой очереди, нет нужно переключаться с одного потока на другой).
Но даже при наличии системы с 10000 клиентами для приложения на основе сервлетов (потоковая модель) с 100 клиентами это может работать очень хорошо. И если у нас есть пул соединений (конечно, у нас есть), он выполняет ту же работу, что и очередь Actor (входящие), планируя доступ клиентов к какой-либо части службы. Это может улучшить нашу производительность в K раз (где K намного больше, чем если бы у нас не было пула - позволяя потоку отчаянно блокировать друг друга).
Вопрос в следующем:
Это хорошая причина, чтобы не применять AKKA для существующих приложений на основе сервлетов?
Принимая это аргумент: даже имея старую систему на серверах, с
connection pool
может улучшить производительность до хорошего уровня. И это уровень, скорее всего, может быть достаточно хорошим, чтобы НЕ применять АККА к существующее приложение сервлета, например, попытка изменить модель сервлета (это должно быть плохо по сравнению с контроллерами на вершине АККА).
Есть ли смысл думать так?
Считайте, что соединение является своего рода INBOX (как в AKKA), планируя команды (соединение).
Даже если модель сервлетов плохая (имеет дело с блокировками в остальном (активном) потоке, который создается соединением, исходящим из пула соединений).
Это может быть достаточно для пула соединений, который забывают при сравнении Akka с сервлетами. Мы все еще можем настроить наше приложение, изменив MAX-CONNECTION в пуле соединений. Обычно мы делаем все возможное, чтобы приложение не сохраняло состояние, поэтому в большинстве случаев мы ничего не синхронизируем.
Но, конечно, плохо иметь только один пул соединений для целого приложения. При сравнении с субъектами каждый субъект имеет каждый собственный пул соединений (почтовый ящик), и каждый субъект может отвечать за прием HTTP-запросов. Эта модель, безусловно, лучше.
Постскриптум В большинстве случаев Future достаточно хороши. Актеры хороши, если вы хотите, чтобы "безопасность" сохраняла в нем состояние (в основном это отличает его от будущего).
UPDATE:
Некоторые люди считают, что вообще нельзя использовать актеров. Что хорошо, так это чисто функциональный подход или что-то, что scalaz уже предлагает (а также, как я полагаю, Haskell
), но пока не для удаленных вызовов.