Хорошо, во-первых, вы не можете ничего гарантировать в отношении ненадежной ссылки. Задача двух генералов доказывает это как для детерминированных, так и для недетерминированных протоколов. Все, что вы можете сделать, это смягчить ненадежность до приемлемой степени.
Самый простой способ в вашем случае: как только сервер получает запрос на опрос, он отправляет 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
может быть заспамлен заказами, но так как # отправляется с каждым запросом, это не имеет большого значения. Если мы пропустили это раньше, мы получаем это сейчас. Если мы не получили его раньше, woohoo! У нас есть это сейчас. Система работает! Вы заметите, что в моем примере 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-фреймворков и фальшивых протоколов (обычно они работают поверх HTTP) обвиняют их в том, что они, по сути, заново изобретают колесо — и проблемы колеса — на более высоком уровне абстракции.
Суть в том, что любая система может дать сбой, включая надежные системы обмена сообщениями.
Что касается возможной согласованности, я думаю, вы можете быть сбиты с толку. Согласованность в конечном счете применяется только к распределенным системам хранения, где после Write()
вы не сможете детерминировано получить его с помощью Read()
в течение некоторого времени. Это совсем не похоже на вашу проблему. Я имею в виду, я понимаю, что вы говорите, но в системе eventually consistent
предполагается надежное (достаточно) соединение между узлами. Вы не делаете этого предположения (хотя я думаю, что вы должны .. TCP чертовски надежен).
person
David Titarenco
schedule
03.11.2010