2. API SERVER
Эффектиные API запросы
и ограничения скорости
Danial Klimkin, Google, Inc.
AdWords API Workshops – All rights reserved
3. План
● Эффективное использование API
● Ограничения скорости по
запросам (rate limiting)
● Примеры реализации очередей
запросов для API
AdWords API Workshops – All rights reserved
5. Объединение операций
AdWords API Workshops – All rights reserved
● Все запросы к API имеют издержки
● Передача по сети, сериализация, авторизация, etc.
● Группировка операция уменьшает издержки
● Метод mutate принимает массив операций
● MutateJobService для асинхронной обработки
AdWords API Workshops – All rights reserved
6. Объединение по целям
● Несколько операций над одной кампанией
выполняются быстре, чем над разными
● Обращение к одной кампании может вызвать ошибки
типа CONCURRENT_MODIFICATION
● Работайте с одной кампанией только из одного потока
● Фоновые сервисы так же работают с объектами
AdWords API Workshops – All rights reserved
7. Отправляйте только изменения
● Изменяете объект?
● Отпарвляйте только изменения!
● Отправка объекта целиком замедляет
процесс
●
Происходит проверка значений, сохранение в БД...
AdWords API Workshops – All rights reserved
8. Кроме того…
● Используйте сжатие gzip для
запросов и ответов.
● Включите в User-Agent “gzip”
● Accept-Encoding: gzip
● Используйте “partial failure”
● Выполяет все операции без ошибок
● Возвращает ошибки для остальных
AdWords API Workshops – All rights reserved
10. Ограничения скорости запросов
● Не фиксированы
● Зависят от нагрузки на сервер
● Различны для разных сервисов
● Меняются во времени
● Разнятся для разных запросов
AdWords API Workshops – All rights reserved
Defining Rate Limits
11. Ошибки “ограничения скорости”
● RATE_EXCEEDED
○ пауза на retryAfterSeconds секунд
● CONCURRENT_MODIFICATIONS
○ увеличивающаяся пауза, повтор
● UNEXPECTED_INTERNAL_API_ERROR
○ 1-2 попытки повторить
○ свяжитесь с нами, сообщите об ошибке
AdWords API Workshops – All rights reserved
Defining Rate Limits
12. Что делать при ограничении?
Careful coding...
AdWords API Workshops – All rights reserved
13. Простой пример
Java
ApiError[] errorArray = apiException.getErrors();
for (ApiError apiError : errorArray) {
if (apiError instanceof RateExceededError) {
int seconds = ((RateExceededError) apiError)
.getRetryAfterSeconds();
// wait the amount of seconds the server asked
Thread.sleep(seconds * 1000);
}
}
AdWords API Workshops – All rights reserved
How to handle Rate Limits
14. Простой пример -- описание
● Ошибка RateExceededError может возникнуть
при выполнении любого запроса
● Важно обрабатывать эту ошибку
● Подождать и повторить -- простейшая
стратегия в этом случае
● Особенно важно при выполнении
нескольких связанных запросов
AdWords API Workshops – All rights reserved
15. Важные замечания по примеру
● Решение -- синхронное
● Вызывающий поток заблокирован
● Нет контроля за скоростью выполнения
● Сложно группировать операции
AdWords API Workshops – All rights reserved
16. Решение на основе очередей
● Очереди сообщений (Message queues)
● Решения для распределения и
управление скоростью (throttling) запросов
● Много готовых решений на рынке
●
ActiveMQ, RabbitMQ, … etc.
● Существуют решения для большинства
платформ / языков
AdWords API Workshops – All rights reserved
17. 1. Одна очередь
Producer
Производитель создает задачи
для выполнения и добавляет из
в очередь
Producer
Consumers
Consumers
Consumers
X
Queue
Throttling
Producer
Logging
Error
Потребитель достает задания из очереди
с заданной скоростью
AdWords API Workshops – All rights reserved
How to handle Rate Limits
18. Первое решение -- за и против
● За:
● Простота реализации
● Одна точка управления скоростью запросов
● Легко обрабатывать ошибки
● Против:
●
●
●
●
Только одна точка управления скоростью запросов
Сложно группировать операции
Некоторые задачи будут долго выполняться
Нужна приоритезация и не везде она эффективна
AdWords API Workshops – All rights reserved
19. 2. Одна очередь с селекторами
Producers
Producers
Производители создают задачи
разных типов и добавляют в
очередь
Producers
Producers
Каждая группа потребителей
обрабатывает задачи ее типа,
со своей скоростью
X
X
X
X
Producers
Producers
Queue
Throttling
Producers
Producers
Producers
Consumer
AdWords API Workshops – All rights reserved
Producers
Consumer
Producers
Consumer
Producers
Consumer
Error
How to handle Rate Limits
20. Второе решение -- за и против
● За:
● Группировка заданий по типу
● Частичный контроль за скоростью выполнения по
сервисам
● Хорошая эффективность -- параллельность запросов
● Против:
●
●
●
●
Только одна очередь -- управление ограничено
Нет общего контроля скорости выполнения
Больше движущихся частей -- сложнее
Протоколирование усложняется
AdWords API Workshops – All rights reserved
21. 3. Несколько очередей
Исполнители выполняют
запрос
Producers
Consumer
Producers
Producers
Producers
Consumer
Throttling
Producers
Producers
Producers
Producers
Producers
Producers
Producers
Consumer
Producers
Executors
Executors
Executors
Producers
Consumer
Queues
Потребители получают задачи
Error
Logging
X
X
X
X
Производители
создают задачи
Throttling
AdWords API Workshops – All rights reserved
How to handle Rate Limits
22. Третье решение -- за и против
● За:
●
●
●
●
●
Полный контроль за скоростью выполнения
Модульность и расширяемость
Возможность управления разными очередями
Масштабируемость
Максимальные параллелизм и эффективность
● Против:
● Сложность реализации
AdWords API Workshops – All rights reserved
23. Очереди сообщений: итого
● Решение зависит от масштаба задачи
● Внедрение -- инвестиция
● Следите за логами, очередями, ошибками
● Нет одного идеального решения
AdWords API Workshops – All rights reserved
24. Полезные ресурсы
API Best Practices - https://developers.google.
com/adwords/api/docs/guides/bestpractices
ActiveMQ - http://activemq.apache.org/
RabbitMQ - http://www.rabbitmq.com/
AdWords API Workshops – All rights reserved