Ответ 1
Реальная основная проблема
Эта проблема не ограничивается socket.io
. Это хорошо известная проблема, называемая Проблема двух генералов.
Две армии, каждая из которых во главе с генералом, готовятся атаковать укрепленный город. Армии расположились недалеко от города, каждый на своем холме. Долина разделяет два холма, и единственный способ общения двух генералов - отправить посланников через долину. К сожалению, долина занята защитниками города, и есть шанс, что любой посланник, посланный через долину, будет захвачен (этот сценарий предполагает, что, хотя оба генерала согласились, что они будут атаковать, они не договорились о времени для атаку, прежде чем заняться своими позициями на своих холмах).
Вы пытаетесь достичь Общие знания по ненадежной ссылке.
На любом этапе общения через socket.io
ссылка может быть сломана, а callback
можно отправить, но другая сторона не может быть уверена, что она прибыла.
Что можно сделать
Вам нужно принять факт, что это всегда возможно. Для этого существует нетривиальное решение. Эта проблема и ее обобщение по-прежнему активно изучаются в таких областях, как исследования Multi-Agent Systems.
Что еще можно сделать в вашем конкретном случае
Существуют некоторые общие подходы к смягчению этой проблемы.
То, что я делал при разработке приложения с помощью socket.io
, - это прикреплять идентификаторы к сообщениям, если произойдет отключение, а одна сторона попыталась отправить уже отправленное сообщение, принимающая сторона будет знать, что сообщение уже получено.
Обратите внимание, что на практике вам не нужно делать это всюду.
Подробнее о выпуске
- Связанный с этим вопрос в SO
- Проблема византийских генералов от Microsoft Research (LESLIE LAMPORT, ROBERT SHOSTAK и MARSHALL PEASE), в которой обсуждается проблема и предлагаются некоторые решения
- "Acclaimed Book" от Yoav Shoham, который рассказывает о системах Multiagent и как они решают эту проблему.
- Сообщение в блоге об этой проблеме в TCP.