Обмен динамическими данными в памяти между рабочими-оружейниками - PullRequest
0 голосов
/ 02 октября 2018

У меня есть веб-приложение, написанное на Django / Celery / Postgres / Gunicorn / Nginx.

Приложение позволяет выполнять научные моделирования для пользователя.Это моделирование может занять от 5 секунд до 5 минут.Регулярные запросы и быстрое моделирование выполняются со стандартной парадигмой блокировки, в то время как длительное моделирование выполняется в фоновом режиме (некоторые даже передаются нескольким экземплярам AWS Lambda параллельно) с помощью Celery, а затем клиент обновляется с помощью WebSocket.

Когда клиент входит в систему и открывает один из своих проектов, объект Simulation инициализируется и сохраняется в диктовке как {user: Simulation}.Инициализация этого объекта моделирования может занять около 10 секунд, поэтому это делается только в начале.Каждый раз, когда пользователь взаимодействует со своей имитацией на стороне клиента, конкретное представление запрашивает объект Simulation для глобального запроса и применяет любые изменения, извлекает данные, сохраняет имитацию, запускает симуляцию и т. Д.

Проблемаэтот подход заключается в том, что он работает только с 1 рабочим-оружейником, поскольку дополнительные работники не имеют доступа к объектам моделирования внутри глобального диктата.Более того, невозможно предварительно загрузить объекты, поскольку они постоянно меняются пользователем.

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

1 Ответ

0 голосов
/ 03 октября 2018

Я думаю, вам нужен memcache здесь:

https://docs.djangoproject.com/en/2.1/topics/cache/#memcached

Базовый интерфейс установлен (ключ, значение, время ожидания) и получен (ключ):

>>> from django.core.cache import cache
>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'
...