Я создаю в режиме реального времени веб-приложение типа «лобби», в котором размещается несколько пользователей (по 2–8 одновременно), где состояние лобби распределяется между пользователями. Пользовательский интерфейс построен с React. Каждый пользователь устанавливает соединение веб-сокета с бэкэндом после присоединения к лобби. В настоящее время они получают полное глобальное состояние приложения в виде объекта JSON (его размер не должен превышать несколько килобайт).
У меня возникают трудности с концептуализацией точной схемы поддержания состояния, и мне хотелось бы чтобы услышать ваше мнение об этом, как только я описал ситуацию более подробно.
Лобби предоставляет пользователям ряд конечных пулов ресурсов, доступ к которым имеют все. Пользователи будут перемещать эти ресурсы между собой, а также в пулы и из них. В настоящее время я думаю, что полное состояние лобби и всех его пулов ресурсов хранится и поддерживается исключительно в бэкэнде. Когда пользователь хочет переместить ресурс, например, из пула в себя или наоборот, или изменить видимое состояние ресурса, это делается с помощью сообщений JSON, отправляемых через соответствующие соединения веб-сокетов.
Каждый действие, которое они выполняют, приводит к тому, что подобное сообщение отправляется через сокет (упрощенно):
{
"action": "MOVE",
"source": "POOL1",
"target": "user_id_here",
...metadata...
}
Пользователи отправляют эти сообщения одновременно с произвольным временем и интервалами, а бэкэнд (используя асинхронную Python сервер и хранилище данных, которые еще предстоит определить) получает их последовательно, сверяет каждый из них с глобальным состоянием в порядке их поступления, а затем отправляет полностью обновленное состояние приложения на каждому пользователю через их соединения через веб-сокет, для каждое полученное сообщение . Пользователь, выполнивший действие, которое инициировало обновление состояния, дополнительно получает объект состояния, информирующий его об успешной транзакции, который пользовательский интерфейс может затем указать им.
Когда пользователь отправляет сообщение действия, которое невозможно согласовать (например, другой пользователь исчерпал пул ресурсов непосредственно перед тем, как пришло его сообщение, запрашивающее ресурс из того же пула), приложение по-прежнему отправляет ему полное обновленное состояние приложения, но в него включен объект состояния, содержащий информацию который пользовательский интерфейс использует, чтобы сообщить им, что их действие не может быть выполнено.
Пока все хорошо. Учитывая типы действий, типы пулов ресурсов, количество пользователей и размер ожидаемых объектов состояния, частота обновлений не должна стать проблемой ни с точки зрения использования ресурсов, ни с точки зрения использования полосы пропускания.
Чтобы уточнить: нет действий, которые пользователи выполняют в пользовательском интерфейсе React, каким-либо образом изменяют свое локальное состояние. Каждое действие, которое они выполняют, преобразуется в сообщение JSON, как в примере выше, и результатом этого действия будет получение обновленного полного состояния приложения, которое полностью заменяет предыдущее состояние, которое React использовал для визуализации интерфейса пользователя. , Состояние приложения уровня React является эфемерным, используется только для его рендеринга один раз. Все визуализации происходят исключительно в ответ на обновления состояния через веб-сокеты.
Единственная область, с которой у меня возникают трудности, - это как структурировать это эфемерное состояние на стороне React, чтобы рендеринг обновленного объекта состояния был настолько быстрым и эффективный, насколько это возможно. Я бэкэнд и у меня нет опыта создания приложений React такого типа (в последний раз я использовал его четыре года go по-особенному c, передавая реквизиты глубоко вложенным дочерним компонентам, с состояние хранится повсюду). Я не совсем уверен, какие средства и инструменты использовать.
Например, я мог бы использовать провайдер контекста верхнего уровня с хуком useReducer, который многие называют «заменой Redux» (что технически не таково). «т). Или я мог бы использовать Redux, но действительно ли он добавляет какую-либо ценность в этом случае? Или что-то еще?
Учитывая, что все состояние заменяется в результате каждого действия каждого пользователя, каков наилучший, наиболее эффективный и наименее требующий времени способ структурирования стороны React?