Как стать автором
Обновить

Комментарии 7

Горячий кеш, который падает 300 раз в секунду. Теперь я видел всё!

Шутка...

Шутка-то шутка, но я своими глазами видел, как соседи выставили процессу параметры перезапуска в :infinity и у них что-то стало немного притормаживать.

Процесс запускался, пытался вычитать откуда-то данные, это откуда-то было криво настроено и оно падало, и перезапускалось. Так вот число 300/сек взялось именно оттуда, и если бы не задержка чтения из этого самого откуда-то — было бы несколько десятков тысяч.

Спасибо за контент по Эрлангу и Эликсиру!

Всегда рад.

Я потихоньку начинаю изучать акторную модель. В данный момент не могу понять следующее:

  1. Цитата: Хранить таким образом сумму на банковском счете клиента не сто́ит. А как сто́ит? Либо я бы сделал актора "Аккаунт" и на каждую мутацию делал бы запись в event log / DB. Overhead минимум, потому что только пишем, агрегат собирать не надо как в stateless модели. А как бы сделали вы исходя из вашего опыта?

  2. Еще вопрос по работе с памятью. Предположим эрланг умеет в миллионы процессов. Предположим, что мы разрабатываем что-то типа GitHub. Репозитории за счет картинок, документов и тд могут занимать мегабайты. Получается, это терабайты оперативной памяти на миллион репозиториев. И В GitHub 420 миллионов репозиториев. Понятное дело, что из них активных на запись/чтение только часть (допустим, 10%). Это еще не говоря о других метаданных вроде пользователей, issues, pull requests и тд. Это огромный ресурс. Насколько адекватно модель обрабатывает подобные случаи? Понятно, что хранение в памяти повышает производительность как чтения, как и мутации, но разумно ли держать в памяти так много данных?

  3. С точки зрения гибкости: как работать с мультиязычностью? Например у меня есть Актор, который должен выполнить "ИИ" анализ некоторых данных и держать контекст открытым, пока не придет явный сигнал на закрытие контекста. У меня есть модуль на Python, который умеет это делать - как мне встроить его в Акторную модель Эрланга?

  4. С точки зрения применимости, возникает ощущение, что Акторная модель показывает себя блестяще там, где необходимо обрабатывать данные часто и быстро: например трейдинг, игровые сессии и тд. Т.е. там, где лучшее решение это держать в памяти объекты, что обеспечит возможность поддерживать быстрые мутации. Преимущество Акторной модели по сравнению с тем, чтобы просто насоздавать объектов и положить их в хэшмэп, это: отдельный процессинг луп под Актора, который позволяет Акторам работать конкуретно и минимально влиять друг на друга с точки зрения блокировок, при этом обеспечивая строгий поток выполнения в рамках одного Актора. При этом в Акторах вообще нет смысла в каких-то аналитических задачах, построении отчетов и работе с достаточно статической информацией (типа информация об объектах на Яндекс.Карты).

Добро пожаловать в клуб!

Цитата: Хранить таким образом сумму на банковском счете клиента не сто́ит. А как сто́ит? Либо я бы сделал актора "Аккаунт" и на каждую мутацию делал бы запись в event log / DB. Overhead минимум, потому что только пишем, агрегат собирать не надо как в stateless модели. А как бы сделали вы исходя из вашего опыта?

Так бы и сделал. И я ровно так делаю вот тут. Акторная модель вообще не отменяет базу, а дополняет её. Можно рассматривать акторы — как горячий кэш объектов.

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

Картинки не нужно держать в памяти процесса же, пусть себе лежит на диске. Еще можно (если осторожно) процессы подвергать гибернации (вот тут про :hibernate). Есть такое почти общее правило: в стейте процесса не должно быть больше нескольких килобайт. Остальное — ну пусть себе лежит в хранилищах. Основное преимущество акторной модели — не умение быть горячим кэшем, а умение из коробки корректно обрабатывать высокую конкурентность.

Понятно, что хранение в памяти повышает производительность как чтения, как и мутации, но разумно ли держать в памяти так много данных?

Неразумно, и не нужно. Это не молоток, а всё вокруг — не гвозди.

С точки зрения гибкости: как работать с мультиязычностью? Например у меня есть Актор, который должен выполнить "ИИ" анализ некоторых данных и держать контекст открытым, пока не придет явный сигнал на закрытие контекста. У меня есть модуль на Python, который умеет это делать — как мне встроить его в Акторную модель Эрланга?

Обычно это делают через Port. Еще можно почитать про работу Шона Мориарти и перевести питон на эликсир :)

С точки зрения применимости, возникает ощущение, что Акторная модель показывает себя блестяще там, где необходимо обрабатывать данные часто и быстро: например трейдинг, игровые сессии и тд. Т.е. там, где лучшее решение это держать в памяти объекты, что обеспечит возможность поддерживать быстрые мутации. Преимущество Акторной модели по сравнению с тем, чтобы просто насоздавать объектов и положить их в хэшмэп, это: отдельный процессинг луп под Актора, который позволяет Акторам работать конкуретно и минимально влиять друг на друга с точки зрения блокировок, при этом обеспечивая строгий поток выполнения в рамках одного Актора.

Это так.

При этом в Акторах вообще нет смысла в каких-то аналитических задачах, построении отчетов и работе с достаточно статической информацией (типа информация об объектах на Яндекс.Карты).

А вот это не так. Линейные алгоритмы не нуждаются в акторной модели, это правда; но их обвязки — нуждаются, и еще как. За счет правильного параллелизма у вас из коробки есть инструмент, который позволяет работать со статической информацией (не обязательно тонны оной держать в стейте, как я выше уже говорил) — из разных потоков. Вот есть библиотека Flow, например. Подсуньте её примитивы вместо Stream в чтение гигантского CSV-файла — и вы получите ускорение почти в N раз (где N — число процессоров) вообще без единой строки дополнительного кода (и гарантированно без гонок).

Спасибо большое за развернутый ответ! Хотел задать еще кучу вопросов, но пока решил попробовать разобраться самостоятельно, для начала надо прочитать Ваши статьи. К тому же я из мира .NET, поэтому свой специфики тут тоже достаточно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации