Первым уровнем защиты был сам протокол. При отправке файла с клиента на сервер в первый пакет запроса включалась контрольная сумма файла по алгоритму MD5. После отправки последнего пакета клиент ожидал ответа от сервера. Сервер отвечает одним из нескольких кодов: OK, TIMEOUT, FAILED_CHECKSUM или UNKN0WN_ERR0R. При любом ответе, отличном от ОК, клиент отправляет весь файл заново – мы назвали это «быстрым повтором». Клиент делает три быстрых повтора до того, как попытка передачи будет признана неудачной.
Проблемы с передачей файлов делятся на две разновидности. К первой относятся временные проблемы, которые решаются сами собой, – например, сетевые ошибки. Проблемы второго типа требуют человеческого вмешательства. Таким образом, проблема либо исчезает через несколько миллисекунд, либо на ее исправление требуется от нескольких минут до нескольких часов. Нет смысла повторять попытки передачи файлов снова и снова. Если файл не удалось передать с нескольких первых попыток, скорее всего, передача не будет работать в течение некоторого времени.
Следовательно, после исчерпания всех быстрых повторов клиент помещает задание на передачу файла в очередь. Фоновая задача активизируется каждые 20 минут и проверяет наличие незавершенных заданий передачи файлов. Она повторяет каждое задание еще раз, и в случае повторной неудачи возвращает его в очередь. Благодаря поддержке планирования заданий в Spring подобные «медленные повторы» реализуются почти тривиально.
Related posts: