Как выжать максимум скорости из БД? 🚀
Ситуация, наши данные хранятся в кластере с несколькими хостами и мы хотим получить максимально быстрый ответ, индексы и SQL-оптимизации уже сделали, но все еще не то, что надо.
Hedged Requests
Вместо ожидания одного конкретного узла, мы отправляем запрос сразу на все реплики параллельно. Кто первый прислал ответ тот и победил. Остальные запросы отменяются.
Как это выглядит на практике?
1. Создадим n независимых горутин на каждый хост
2. Используем общий контекст. Как только первый воркер вернул результат отменяем работу остальных.
3. Результат пишем в буферизированный канал и забираем первый пришедший.
Какие минусы у подхода?
• Нагрузка: Потребление CPU и сетевого трафика растет пропорционально количеству реплик.
• Ложные ошибки: Если у ближайшего хоста отвалилась сеть, он ответит быстрее всех с ошибкой, хотя другие хосты могли дать верный ответ.
Возможное Решение: Игнорировать НЕ бизнес ошибки, ждать ответа остальных хостов.
🔗 [ССЫЛКА НА КОД С РЕАЛИЗАЦИЕЙ]
Ситуация, наши данные хранятся в кластере с несколькими хостами и мы хотим получить максимально быстрый ответ, индексы и SQL-оптимизации уже сделали, но все еще не то, что надо.
Hedged Requests
Вместо ожидания одного конкретного узла, мы отправляем запрос сразу на все реплики параллельно. Кто первый прислал ответ тот и победил. Остальные запросы отменяются.
Как это выглядит на практике?
1. Создадим n независимых горутин на каждый хост
2. Используем общий контекст. Как только первый воркер вернул результат отменяем работу остальных.
3. Результат пишем в буферизированный канал и забираем первый пришедший.
Какие минусы у подхода?
• Нагрузка: Потребление CPU и сетевого трафика растет пропорционально количеству реплик.
• Ложные ошибки: Если у ближайшего хоста отвалилась сеть, он ответит быстрее всех с ошибкой, хотя другие хосты могли дать верный ответ.
Возможное Решение: Игнорировать НЕ бизнес ошибки, ждать ответа остальных хостов.
🔗 [ССЫЛКА НА КОД С РЕАЛИЗАЦИЕЙ]