У меня есть веб-приложение, написанное на Django / Celery / Postgres / Gunicorn / Nginx.
Приложение позволяет выполнять научные моделирования для пользователя.Это моделирование может занять от 5 секунд до 5 минут.Регулярные запросы и быстрое моделирование выполняются со стандартной парадигмой блокировки, в то время как длительное моделирование выполняется в фоновом режиме (некоторые даже передаются нескольким экземплярам AWS Lambda параллельно) с помощью Celery, а затем клиент обновляется с помощью WebSocket.
Когда клиент входит в систему и открывает один из своих проектов, объект Simulation инициализируется и сохраняется в диктовке как {user: Simulation}.Инициализация этого объекта моделирования может занять около 10 секунд, поэтому это делается только в начале.Каждый раз, когда пользователь взаимодействует со своей имитацией на стороне клиента, конкретное представление запрашивает объект Simulation для глобального запроса и применяет любые изменения, извлекает данные, сохраняет имитацию, запускает симуляцию и т. Д.
Проблемаэтот подход заключается в том, что он работает только с 1 рабочим-оружейником, поскольку дополнительные работники не имеют доступа к объектам моделирования внутри глобального диктата.Более того, невозможно предварительно загрузить объекты, поскольку они постоянно меняются пользователем.
Каков наилучший подход для работы с таким глобальным динамическим объектом, который слишком дорог, чтобы его можно было повторно инициализироватькаждый запрос?