Книга «Проектирование высоконагруженных приложений»
(Designing Data-Intensive Applications)
2017 / 2023
Построение надёжной системы из ненадёжных компонентов
Рисунок 8-1. Если вы отправите запрос и не получите ответ, невозможно отличить, был ли (а) потерян запрос, (б) отключен удалённый узел или (в) потерян ответ.
Рисунок 8-2. Если несколько компьютеров отправляют сетевой трафик одному и тому же адресату, очередь его коммутатора может заполниться. Здесь порты 1, 2 и 4 пытаются отправить пакеты на порт 3.
TCP против UDP
Рисунок 8-3. Запись клиента B логически позднее записи клиента A, но у записи B более ранняя метка времени.
while (true) {
request = getIncomingRequest();
// Убедиться, что аренда всегда имеет не менее 10 секунд
if (lease.expiryTimeMillis - System.currentTimeMillis() < 10000) {
lease = lease.renew();
}
if (lease.isValid()) {
process(request);
}
}
Рисунок 8-4. Неправильная реализация распределённой блокировки: Клиент 1 считает, что у него всё ещё есть действующая аренда, хотя она истекла, и таким образом портит файл в хранилище.
Рисунок 8-5. Обеспечение безопасного доступа к хранилищу с помощью разрешения записи только в порядке увеличения ограничивающих меток.