Опроса 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 4

2 ответа:

Мой подход, если решить его самостоятельно (в отличие от использования существующей библиотеки, которая уже обрабатывает это) будет:

  • пусть сервер присваивает уникальный идентификатор (GUID) каждому сообщению по мере его поступления.
  • на клиентах сохраните идентификатор последнего полученного сообщения.
  • при опросе новых сообщений используйте идентификатор последнего успешно полученного сообщения. Затем сервер отвечает, находя это сообщение в своей собственной очереди и воспроизводя все последующие сообщения.
  • для защиты от "отброшенных" сообщений каждое сообщение может также содержать идентификатор непосредственно предыдущего сообщения (что позволяет клиенту выполнять проверку согласованности)

Если повторный вызов приводит к доставке дубликатов с сервера на клиент, наличие уникальных идентификаторов в каждом сообщении делает их устранение тривиальным. Представьте себе очередь сообщений на стороне сервера как поток событий, в котором каждый клиент отслеживает свою позицию последнего чтения. Клиент не делает никаких предположений о соответствующем порядок сообщений, их количество и т. д.-поскольку его состояние полностью состоит из "того, что я видел", существует мало возможностей для выхода из синхронизации.

Поскольку это чат в реальном времени, интервал setInterval, вероятно, достаточно мал, чтобы попросить сервер о новых сообщениях два или три раза одновременно. Убедитесь, что обработчик сервера синхронизирован и игнорирует повторяющиеся запросы от одного и того же пользователя.