Я работаю с akka уже 7-8 месяцев ежедневно. Когда я начинал, я работал над приложениями и замечал, что актеры будут использоваться в любом месте внутри системы акторов для связи между большинством объектов. Я сделал то же самое - раскрутил другого актера за х / у / з.
Мне кажется, что это может быть слишком неразборчиво, добавляя сложность там, где это не нужно - но я не могу найти никаких дискуссий о том, где должны использоваться акторы против простой синхронной или даже асинхронной логики через фьючерсы. Я начал обдумывать свою позицию после того, как мой коллега упомянул нечто подобное. Совсем недавно я реализовал несколько случаев, когда я размышлял над задачей, а затем избегал создания другого действующего лица, потому что я мог бы безопасно достичь того же результата в неизменной реализации - например, что-то вроде получения значений конфигурации из БД или файла где-то, куда вы обращаетесь очень редко и дождаться результата - это фактический вариант использования.
В частности, мне кажется, что в любом случае, когда вы играете с неизменным состоянием, акторы создают сложность и ограничивают пропускную способность - например, чистую функцию в объекте можно вызывать одновременно, без риска при любом уровне параллелизма, однако актер может обрабатывать только одно сообщение за раз. Альтернативное соображение заключается в том, что вы будете парковать поток, если вам нужно дождаться результата, если только вы не начнете использовать фьючерсы, но в тех случаях, когда вам не нужно беспокоиться об асинхронном обмене сообщениями или масштабировании, кажется, что использование актера может оказаться излишним.
Итак, мой вопрос - есть ли плохое время для использования актеров? Мне любопытно, как выглядит Эрланг, и ему бы очень хотелось, чтобы другие люди понимали. Или если есть какие-то принципы использования актера.
источник
ask
актером и просто использованием равниныFuture
.Ответы:
Это вопрос, который меня интересует, и я проводил некоторые исследования. Что касается других точек зрения, см. Этот пост в блоге Ноэля Уолша или этот вопрос о переполнении стека. У меня есть несколько мнений, которые я хотел бы предложить:
Как и Джейсон, я очень хочу услышать мнение других людей здесь. Как я могу решить некоторые из вышеперечисленных проблем и лучше использовать Akka?
источник
Стоит рассмотреть, для чего используется модель актера: модель актера
Это ценно, потому что использование общего состояния из нескольких потоков становится действительно трудным, особенно когда существуют взаимосвязи между различными компонентами общего состояния, которые должны быть синхронизированы. Однако, если у вас есть доменные компоненты, в которых:
тогда модель актера не принесет много (если таковые имеются) выгоды.
Надеюсь, это поможет.
источник
Ваша интуиция верна, ИМХО. Повсеместно использовать актеров - все равно, что иметь молоток и видеть только гвозди.
Лучшая практика Erlang заключается в использовании процессов / действующих лиц для всех действий, которые происходят одновременно. То есть, как в реальной жизни. Иногда трудно найти правильную гранулярность, но в большинстве случаев вы просто знаете, взглянув на смоделированный домен и используя немного здравого смысла. Боюсь, у меня нет лучшего метода, чем этот, но я надеюсь, что это поможет.
источник
В порядке ввода / вывода сообщений:
Недавно я познакомился с приложением, основанным на akka, в котором модель актора фактически вызывала проблемы параллелизма, более простая модель была бы лучше под нагрузкой.
Проблема заключалась в том, что входящие сообщения перемещались по разным «дорожкам» (по разным путям актеров), но в коде предполагалось, что сообщения будут доставлены в конечный пункт назначения в том же порядке, в котором они поступили. До тех пор, пока данные поступали с достаточно большими интервалами, это работало, потому что в пункт назначения направлялось только одно противоречивое сообщение. Когда интервалы уменьшились, они начали выходить из строя и вызывать странное поведение.
Эту проблему можно было бы решить правильно с меньшим количеством актеров, но при злоупотреблении ими легко ошибиться.
источник
На мой взгляд, есть два варианта использования для актеров. Общие ресурсы, такие как порты и тому подобное, и большое состояние. До сих пор обсуждение было хорошо освещено, но значительная причина также является веской причиной.
Большая структура, передаваемая при каждом вызове процедуры, может использовать много стека. Это состояние может быть помещено в отдельный процесс, структура заменена идентификатором процесса, и этот процесс запрашивается по мере необходимости.
Такие базы данных, как mnesia, можно рассматривать как внешнее хранилище данных для процесса запросов.
источник