Я создаю совместную чертежную доску (например, r/place): есть сетка пикселей, которую пользователи могут изменять в любое время, и обновления пикселей распространяются на всех других пользователей в сети. Я хочу использовать каналы Phoenix для трансляции изменений пикселей.
Мой вопрос о том, как правильно отправить текущее состояние приложения, когда пользователь подключается к службе.
В настоящее время у меня есть таблица ETS, содержащая состояние чертежной доски. Я могу обновить эту таблицу в MyChannel.handle_in/3
перед трансляцией записи любого пикселя.
Я боюсь, что между чтением текущего состояния в MyChannel.join
и подпиской пользователя на канал Phoenix другой процесс обновляет состояние.
Пользователь получит устаревшую версию состояния приложения, и он еще не будет подписан, поэтому он также не получит обновление через канал.
Чтобы решить эту проблему, я думаю, мне нужен способ атомарного чтения текущего состояния, а затем подписки на pubsub, гарантирующий, что никакие сообщения не будут записаны в таблицу ETS или канал за этот период времени. Я думаю, замок? Это Эликсирей или есть другой способ?