Хорошо, во-первых, вы не можете гарантировать что-либо по ненадежной ссылке. Проблема Двух Генералов доказывает это как для детерминированных, так и для недетерминированных протоколов. Все, что вы можете сделать, это смягчить ненадежность до приемлемой степени.
Самый простой способ, в вашем случае, когда сервер получает запрос на опрос, он отправляет x
количество ответов, все с одинаковым GUID
. Например.
S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...
S
может получать спам с заказами, но, поскольку # отправляется с каждым запросом, это не имеет большого значения. Если мы пропустили это раньше, мы получаем это сейчас. Если мы не получили это раньше, уууу! У нас это есть сейчас. Система работает! Вы заметите, что B
отправляет сообщения 5
раз в моем примере. В реалистичном сценарии вы, вероятно, отправите сообщение сотни или тысячи раз, пока не достигнете желаемой надежности.
Теперь вышеприведенное решение требует интенсивной обработки и пропускной способности, но оно работает. Более умный способ - сделать то, что делает TCP: иметь трехстороннее рукопожатие.
S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
Но .. HTTP уже делает это. Так что если что-то не получится, вы узнаете. Тайм-аут соединения, соединение разорвано и т. Д.
Теперь вы можете переписать эти сценарии на уровне приложения (введите WS-ReliableMessaging), но на самом деле TCP уже надежен. Некоторые критики этих SOAP (ish) фреймворков и поддельных протоколов (они обычно работают поверх HTTP) обвиняют их в том, что они по сути заново изобретают колесо - и проблемы колеса - на более высоком уровне абстракции.
Суть в том, что любая система может выйти из строя, включая надежные системы обмена сообщениями.
Что касается возможной последовательности, я думаю, вы можете быть смущены. Окончательная согласованность применима только к распределенным системам хранения, где после Write()
вы, возможно, не сможете определенным образом извлечь его с Read()
в течение некоторого времени. Это совсем не похоже на твою проблему. Я имею в виду, я понимаю, что вы говорите, но в системе eventually consistent
между узлами предполагается надежное (достаточное) соединение. Вы не делаете этого предположения (хотя я думаю, что вы должны .. TCP чертовски надежен).