Начнем с того, что переменная sequence
в коде по сути является идентификатором сообщения. Есть два способа, при которых одна попытка запроса может потерпеть неудачу:
- Сообщение запроса может просто никогда не отправляться
- Сообщение запроса отправляется, но клиент устает ждать и истекает, прежде чем ответ вернется к нему.
Во втором случае, если у вас нет числа sequence
, вы не знаете, какой из ваших запросов на самом деле был успешным.
Рассмотрим эту историю клиента:
- Отправить запрос №1
- Тайм-аут
- Отправить запрос №2
- Тайм-аут
- Отправить запрос №3
- Получить ответ
Какой запрос вызвал ответ? Это может быть любой из трех запросов из-за второго типа отказа запроса, упомянутого выше. С числом sequence
в ответе мы можем точно знать, какой запрос обрабатывается сервером.
Идея «Искаженного ответа от сервера» в образце клиента заключается в том, что если клиент находится на запросе № 3 (с истечением времени ожидания на запросы № 1 и № 2), он отбрасывает ответы № n (где n ‹ 3) пока не дойдет до ответа №3, который он принимает.
Чтобы отправить больше, чем порядковый номер, используйте формат сериализации и отправьте объект целиком.
Например, я мог бы определить class MyRequest { int sequence; string text; }
, а затем отправить это как JSON на сервер.
Бесконечно увеличивающуюся переменную sequence
можно заменить на int64, и тогда все будет в порядке, или вы можете сделать что-то вроде использования GUID в качестве идентифицируемого запроса.
26.04.2013