Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Разработка информационных систем Новый топик    Ответить
 Вопрос по чату  [new]
Swv
Member

Откуда:
Сообщений: 183
Здравствуйте.

Допустим возник такой сценарий.

1. Подключается А
2. Шлёт сообщение в чат Х пользователю Б
3. Сервер через pubsub редиса кидает это сообщение подписчику. По ид чата.
4. Подписчик (тот же сервер) получает сообщение. Смотрит кому и ищет каким то образом подключённого получателя. Не нашёл - отбросил.
5. После сервер кладёт это сообщение в редис в список сообщений диалога

Допустим на этапе 4 каким то образом уже после проверки на наличие получателя , но до отправки сообщения в список редиса, появляется получатель. Шустро. Берет из редиса список сообщений диалога и все. Но список ещё не обновлён на этапе 5.
Получается получатель уверен, что список сообщений корректный. Но последнего сообщения он не получил.
Как разрулить ситуацию?
8 апр 21, 20:20    [22306162]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по чату  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394
Мутексами. Пункт 5 перевесить на пункт 4.
9 апр 21, 14:07    [22306458]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по чату  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65893
Блог
Swv
Не нашёл - отбросил.

Что значит отбросил? Потерял?

Swv
Как разрулить ситуацию?

Можно по-разному, но в целом ситуация выглядит нездоровой архитектурно. Я бы сказал, здоровая архитектура строится так:

1. А шлёт сообщение в чат. Сервер кладёт его в общий список сообщений чата и после этого, возможно, рассылает подключённым подписчикам оповещение "в чате есть новые сообщения, максимальное id = такое-то". Для снятия избыточной нагрузки отправляет только одно оповещение на несколько пришедших реплик, например, откладывая новое оповещение, если с момента предыдущего прошло менее T секунд.

2. Б, получив оповещение, и/или подключившись и/или по таймеру обращается к серверу с запросом "дай мне сообщения из чата X которые были после id = такой-то". Получает пустой или непустой список, отображает его, запоминает у себя id последнего сообщения, чтобы использовать его в следующем запросе.

Всё. Возможности для проблемных ситуаций просто-напросто нет. В частности, сериализовать нужно только попытки одновременно положить сообщение в чат.
9 апр 21, 15:33    [22306543]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по чату  [new]
hVostt
Member

Откуда:
Сообщений: 19317
softwarer,

Если клиент запросит список сообщений только после успешного подключения к брокеру, то и в изначально-костыльной схеме проблем не будет :)
9 апр 21, 22:51    [22306804]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по чату  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65893
Блог
hVostt
Если клиент запросит список сообщений только после успешного подключения к брокеру, то и в изначально-костыльной схеме проблем не будет :)

Ну вот автор их находит. За счёт двух разных путей доставки сообщения и несинхронности работы с ними.
9 апр 21, 23:14    [22306812]     Ответить | Цитировать Сообщить модератору
Все форумы / Разработка информационных систем Ответить