Надежная передача сообщений в socket.io?

API предоставляет механизм обратного вызова emit/send для подтверждения принятых сообщений. Однако этот обратный вызов не запускается в случае отключения или ошибки. Мне кажется, что при отключении вам нужно будет пройти несколько довольно грязных процедур для очистки выданных отправленных сообщений (например, - предположите, что вы предпочитаете хранить сообщения для пересылки позже и т.д.). Любые простые идеи здесь о том, как это сделать? Удивление, если я что-то упустил... Спасибо.

Ответы

Ответ 1

Реальная основная проблема

Эта проблема не ограничивается socket.io. Это хорошо известная проблема, называемая Проблема двух генералов.

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

Вы пытаетесь достичь Общие знания по ненадежной ссылке.

На любом этапе общения через socket.io ссылка может быть сломана, а callback можно отправить, но другая сторона не может быть уверена, что она прибыла.

Что можно сделать

Вам нужно принять факт, что это всегда возможно. Для этого существует нетривиальное решение. Эта проблема и ее обобщение по-прежнему активно изучаются в таких областях, как исследования Multi-Agent Systems.

Что еще можно сделать в вашем конкретном случае

Существуют некоторые общие подходы к смягчению этой проблемы.

То, что я делал при разработке приложения с помощью socket.io, - это прикреплять идентификаторы к сообщениям, если произойдет отключение, а одна сторона попыталась отправить уже отправленное сообщение, принимающая сторона будет знать, что сообщение уже получено.

Обратите внимание, что на практике вам не нужно делать это всюду.

Подробнее о выпуске