Вопрос проверяет умение оптимизировать взаимодействие с внешними API, чтобы снизить нагрузку и избежать превышения лимитов запросов.
Буферизация запросов — это техника, при которой вместо немедленной отправки каждого отдельного запроса к внешнему сервису (например, API аналитики, платежного шлюза или сервиса уведомлений) запросы накапливаются в буфере (очереди) в течение короткого промежутка времени, а затем отправляются одной пачкой. Это особенно полезно, когда внешний сервис имеет строгие ограничения на частоту запросов (rate limits), или когда нужно минимизировать сетевые издержки и нагрузку на обе системы.
Для реализации буферизации обычно используется следующий подход:
Рассмотрим простую реализацию буферизации с использованием массива в памяти и таймера.
class RequestBuffer {
constructor(batchIntervalMs = 5000, maxBatchSize = 10) {
this.buffer = [];
this.batchIntervalMs = batchIntervalMs;
this.maxBatchSize = maxBatchSize;
this.timer = null;
this.startTimer();
}
addRequest(requestData) {
this.buffer.push(requestData);
// Если буфер заполнен, отправляем немедленно
if (this.buffer.length >= this.maxBatchSize) {
this.flush();
}
}
startTimer() {
this.timer = setInterval(() => {
if (this.buffer.length > 0) {
this.flush();
}
}, this.batchIntervalMs);
}
async flush() {
if (this.buffer.length === 0) return;
// Копируем текущий буфер и очищаем его
const batchToSend = [...this.buffer];
this.buffer = [];
try {
// Отправляем пачку запросов на внешний сервис
await this.sendBatchToExternalService(batchToSend);
console.log(`Batch of ${batchToSend.length} requests sent successfully.`);
} catch (error) {
console.error('Failed to send batch:', error);
// Можно добавить логику повторной попытки или возврата в буфер
}
}
async sendBatchToExternalService(batch) {
// Здесь реализация отправки, например, один POST-запрос с массивом данных
// fetch('https://api.example.com/batch', { method: 'POST', body: JSON.stringify(batch) })
}
}
// Использование
const buffer = new RequestBuffer(5000, 10);
// Вместо немедленного вызова API:
// externalApi.sendEvent(event);
// Добавляем в буфер:
buffer.addRequest({ userId: 1, action: 'click' });
buffer.addRequest({ userId: 2, action: 'view' });
// Через 5 секунд или при накоплении 10 событий они отправятся пачкой.Эта техника широко используется в следующих сценариях:
Вывод: Буферизацию запросов стоит применять, когда нужно снизить нагрузку на внешний сервис, соблюсти его лимиты по RPS (requests per second) или оптимизировать сетевые издержки при высокой частоте обращений. Это простой, но эффективный паттерн для повышения отказоустойчивости и эффективности интеграций.