Поскольку данная тема всплыла, то ознакомился со статьей "Don't use Actors for concurrency", на которую давали ссылку.
На мой далеко не беспристрастный взгляд из этой статьи, а так же из аналогичных аргументов человека на RSDN, отнюдь не следует, что модель акторов -- это антипаттерн. Более того, Chris Stucchio, автор статьи от 2013-го года явно указывает, что все его соображения являются наездами на Scala и Akka: "Let me emphasize that this is a very scala-specific rant."
Собственно, всю дискуссию можно закрывать на первом же примере из обсуждаемой статьи. Там автор говорит, что FooActor не имеет состояния, но Akka все равно сериализует все запросы к нему так, чтобы запросы обрабатывались в один поток, на одной нити. И что это убивает конкурентность. А вот Future -- нет.
Ну да, в Akka так. Впрочем, в Java/Scala мире много сирого и убогого, ну да тема не о том :)
А вот в SObjectizer не так. Начиная с версии 5.4.0, т.е. уже год как, у агентов могут быть как not-thread-safe обработчики событий (меняют состояние агента), так и thread-safe (не меняют состояния). И диспетчер adv_thread_pool позволяет одновременно запускать несколько thread-safe обработчиков на разных нитей. Т.е. в SO-5 такой проблемы с FooActor не было бы в принципе.
Уж не знаю, разрешает ли каноническая модель акторов (если таковая существует) параллельную обработку сообщений одним актором. Но, как я говорил ранее, есть теория, а есть конкретные инструменты, с которыми приходится иметь дело на практике. Один инструмент позволяет параллельную обработку сообщений и в этом случае модель акторов не ущербна. Второй инструмент не позволяет, откуда следует вывод, что модель акторов отстой антипаттерн :)
Комментариев нет:
Отправить комментарий