Каковы недостатки в использовании модели Immutability + Actor для программирования concurrency?

При создании большого многопоточного приложения для индустрии финансовых услуг я использовал неизменные классы и модель Actor для рабочего процесса во всем мире. Я очень доволен результатом. Он использует достаточное количество кучи пространства (его в Java, но Btw), но JVM GC работает очень хорошо с недолговечными неизменяемыми классами.

Мне просто интересно, есть ли какие-либо недостатки для использования такого рода шаблонов в будущем? Когда вы отлаживаете код товарищей по команде, я часто нахожу, что так или иначе рекомендую этот шаблон. Думаю, когда у кого-то есть молоток, все выглядит как гвоздь. Поэтому возникает вопрос: когда эта схема проектирования (парадигма?) Работает плохо?

Моя догадка заключается в том, что использование памяти является большой проблемой или когда ограничения проекта требуют чего-то в строках низкого уровня C и т.д.

Ответы

Ответ 1

Многие коды моделирования науки действительно интенсивно занимают память. Например, для моделей сотовых автоматов быстрый доступ к памяти более важен, чем мощность процессора. В этом случае доступ и изменение на месте изменяемого массива всегда быстрее (по крайней мере, во всех моих испытаниях).

Ответ 2

Все зависит от вашего проекта.

Если у вас есть какой-то ресурс, и многие участники используют его, тогда общая картина заключается в создании аксессуаров-актеров. Затем, когда какой-либо другой актер должен спросить о каком-то ресурсе, он спрашивает об этом актер-актер. Затем ответ копируется через канал сообщений.

Теперь представьте себе - у вас действительно тяжелый ресурс (например, map[String, BigObject]), а другие актеры часто спрашивают о некоторых BigObject, тогда вы теряете свою пропускную способность.
Лучшей идеей было бы разделить ресурс со всеми участниками в режиме readonly и заставить одного актера выполнять записи.

Другим примером может быть соединитель базы данных, который подключается к базе данных с большим количеством данных blob. Когда соединитель базы данных является потокобезопасным (как обычно), лучше использовать ссылку на объект соединителя для всех участников, а затем сконструировать некоторого актера, который обеспечивает доступ.

Все, что вам нужно запомнить, это то, что общение между участниками осуществляется путем копирования сообщений.