Опроса AJAX чат получает дубликаты на переднем конце приемника сообщений о быстрый чат
Я разработал JavaScript чат (php на бэкэнде), используя:
1) long-polling to get new messages for the receiver
2) sessionStorage to store the counter of messages
3) setInterval to read new messages and if sessionStorageCounter < setIntervalCounter then the last message is shown to receiver.
4) javascript to create,update and write the chat dialogues
Модуль работает нормально, но когда у пользователей есть быстрый чат, передний конец приемника получает два или три одинаковых сообщения (ни счетчик не отказывает, ни запрос не обеспечивает двойных вставок).
Код кажется правильным (вот почему я не предоставляю код), поэтому задержка интервала может быть причиной (при уменьшении задержки интервала ничего не меняется).
Считаете ли вы, что вышеизложенное схема-это плохая практика, и какая схема, по вашему мнению, устранит ошибки?
2 ответа:
Мой подход, если решить его самостоятельно (в отличие от использования существующей библиотеки, которая уже обрабатывает это) будет:
- пусть сервер присваивает уникальный идентификатор (GUID) каждому сообщению по мере его поступления.
- на клиентах сохраните идентификатор последнего полученного сообщения.
- при опросе новых сообщений используйте идентификатор последнего успешно полученного сообщения. Затем сервер отвечает, находя это сообщение в своей собственной очереди и воспроизводя все последующие сообщения.
- для защиты от "отброшенных" сообщений каждое сообщение может также содержать идентификатор непосредственно предыдущего сообщения (что позволяет клиенту выполнять проверку согласованности)
Если повторный вызов приводит к доставке дубликатов с сервера на клиент, наличие уникальных идентификаторов в каждом сообщении делает их устранение тривиальным. Представьте себе очередь сообщений на стороне сервера как поток событий, в котором каждый клиент отслеживает свою позицию последнего чтения. Клиент не делает никаких предположений о соответствующем порядок сообщений, их количество и т. д.-поскольку его состояние полностью состоит из "того, что я видел", существует мало возможностей для выхода из синхронизации.