Блог

Полезные статьи и новости о жизни WaveAccess

Управление нагрузкой на NoSQL БД с использованием Google Guava RateLimiter на примере информационной системы Bamboo

Средний пользователь Интернет видит в сети около 200 рекламных объявлений в день. Такое количество разнообразных рекламных сообщений создает высокий уровень информационного «шума», от которого опытные пользователи хорошо научились абстрагироваться. Из-за этого эффективность объявлений заметно снижается, приходится постояно искать новые более заметные форматы объявлений, которые способны пробраться сквозь рекламный «шум».

И в поисках новых форматов рекламщики вспомнили про старое доброе «сарафанное радио», которое существует уже не одно столетие. Так в рекламе появились «рекомендации стоматологов», «лучшие ветеринары выбирают...», «протестировано дерматологами» и тому подобные обороты. Но сегодня и они не работают. Пытливые пользователи давно выяснили, что «лучшие ветеринары» могут на поверку оказаться совсем не ветеринарами, и эффективность подобных рекламных сообщений также стала снижаться.

Самый высокий уровень доверия по-прежнему проявляется к рекомендациям от друзей и знакомых – но как эффективно использовать рекомендации в целях продвижения товаров и услуг? Наборы метрик социальных сетей пока не дают полного представления о том, каким путем человек пришел к мысли купить определенный продукт или услугу. Выразить в цифрах эффект, производимый тем или иным рекламным продуктом в Интернет, не предоставляется возможным без создания системы, связывающей каналы дистрибуции, каналы доставки рекламы и каналы общения потенциальных покупателей. И такая система есть – это продукт компании Manumatix под названием Bamboo.

Чтобы привлекать новых покупателей, необходимо предложить существующим клиентам очень простой способ рассказать друзьям о продуктах/услугах компании, к которой они лояльны. Отправить сообщение или приглашение в социальной сети, написать электронное письмо или твит о продукте или услуге (и только в той форме, которую выберет пользователь) – все это, и даже больше, позволяет сделать Bamboo, предоставляя при этом развернутую отчетность о социальных действиях клиентов.

Ключевые возможности приложения – интеграция с самыми популярными социальными сетями (Facebook, Twitter, Google+, Pinterest, Tumblr), возможность детальной конфигурации рекламных продуктов (веб-сайт, встраиваемые объявления, приложение или fan page в Facebook) и, главное, полнейшая отчетность по действиям пользователя от нажатия на ссылку для перехода на сайт до покупки товара в оффлайн магазине. С использованием Bamboo рекламные бюджеты резко сокращаются. Например, на каждую $1000 получается в среднем 20000 кликов ($.05/клик) в отличие от 1000 на баннерах.

В такой системе, казалось бы, должны возникать вопросы о том, как предоставить непрерывный доступ к рекламной информации, ведь поток пользователей сравним с масштабами социальной сети. Но для обслуживания серверов и хранения информации используются продукты компании Amazon. Сама информационная система работает в рамках частного облака EC2 – такой подход позволяет обеспечить максимальную устойчивость к нагрузкам, а географическое распределение ЦОД дает возможность пользователю работать с сервером практически без задержек. Информация о пользователях и их достижениях хранятся в нереляционной базе данных DynamoDB, что также сокращает время выполнения операций на сервере, а значит, и время ожидания пользователя.

Еще одной полезной особенностью DynamoDB является возможность управления пропускной способностью программного интерфейса (ПИ) как через графический интерфейс пользователя (ГИП), так и программно. Предоставление данных настроек в ГИП показано на рисунке ниже.

Представление Данных О Пропускной Способности API 

Рисунок 1. Предоставление данных о пропускной способности API

Через пункт меню “Modify Throughput” вы можете перейти к настройкам данных характеристик. Важная особенность: пропускная способность (ПИ) за одно изменение может быть увеличена не более, чем в два раза, и уменьшена не более, чем на 10%. Меню конфигурации предоставлено на рисунке ниже.

 Меню Конфигурации Настроек Пропускной Способности API

Рисунок 2. Диалог конфигурации настроек пропускной способности API

Описанные настройки позволяют манипулировать так называемой Provisioned Capacity – количеством операций в единицу времени, которое гарантирует Amazon. Но в информационных системах (ИС) с распределенной архитектурой сложно разделить модули таким образом, чтобы каждый работал со своим набором таблиц в БД, - обычно требуется кооперация различных модулей для выполнения задач бизнеса. И в этом случае важную роль играет динамическое управление пропускной способностью ПИ – такую функциональность предоставляет библиотека Google Guava. Рассмотрим программную конфигурацию пропускной способности ПИ в рамках языка программирования Java.

Допустим, для реализации некоторой отчетности в ИС необходимо выполнить расчеты над данными, хранящимися в БД. Предлагается следующая реализация решения поставленной задачи:

  1. Получить установленное значение пропускной способности на чтение;
  2. Воспользоваться инструментом RateLimiter библиотеки Google Guava для ограничения количества вызовов ПИ;
  3. Последовательно просканировать таблицу выборками по 100 записей;
  4. Выполнить требуемые расчеты над полученными записями.

Соответствующий блок кода предоставлен ниже.

// выставляем ограничение в 50% от установленного в ГИП ограничения на
//чтение
float ALLOWED_SCAN_CONSUMPTION_RATIO = 0.5f;
// получаем подключение к таблице
TableDescription tableDescription = dbConnection.describeTable( someTableName ).getTable();
// получаем значение ограничения на чтение
long provisionedReadCapacity = tableDescription.getProvisionedThroughput().getReadCapacityUnits();
// рассчитываем новое ограничение с учетом выставленных ограничений
long allowedConsumption = Math.max( 1, Math.round( provisionedReadCapacity * ALLOWED_SCAN_CONSUMPTION_RATIO ) );
// получаем объект RateLimiter с рассчитанным ограничением
RateLimiter rateLimiter = RateLimiter.create( allowedConsumption );
Map< String, AttributeValue > lastKeyEvaluated = null;
int permitsToConsume = 1;
do {
 // метод acquire остановит поток выполнения, если частота обращения
 // превысит установленное ограничение
rateLimiter.acquire( permitsToConsume );
 // создаем запрос к БД на получение 100 записей
final ScanRequest scanRequest = new ScanRequest()
             .withTableName( someTableName )
             .withLimit( 100 )
             .withExclusiveStartKey( lastKeyEvaluated )
 // важный момент: просим SDK рассчитать нагрузку, оказанную этим запросом
             .withReturnConsumedCapacity( ReturnConsumedCapacity.TOTAL );
final ScanResult scanResult = dbConnection.scan( scanRequest );
for( Map< String, AttributeValue > record : scanResult.getItems() ) {
       // выполняем действия над результатом
}
lastKeyEvaluated = scanResult.getLastEvaluatedKey();
final double consumedCapacity = scanResult.getConsumedCapacity().getCapacityUnits();
 // относительно оказанной нагрузки рассчитываем доступную пропускную
 // способность для следующего запроса
permitsToConsume = ( int )( consumedCapacity - 1.0 );
if( permitsToConsume <= 0 ) {
       permitsToConsume = 1;
}
} while( lastKeyEvaluated != null );

Листинг 1. Обход таблицы выборками по 100 записей с выполнением операций над записями

Как видно из листинга 1, использование новейших технологий в реализации ИС может привести повышению гибкости всей системы и снижению нагрузки на сервер (в том числе, к снижению затрат на содержание сервера, так как, в рамках Amazon AWS, превышение предустановленного количества обращений к БД или пропускной способности ПИ приводит к увеличению счета).

За счет использования передовых технологий в нестандартном подходе к взаимодействию потенциальных покупателей с информационной системой, Bamboo является инновационным решением компании Manumatix. Использование Bamboo позволяет максимально эффективно осваивать рекламный бюджет и приводит к увеличению прибыли за счет социального взаимодействия клиентов.

Заказать звонок

Удобное время:

Отменить

Пишите!

Присоединить
Файл не больше 30 Мб.
Отменить