Сколько осколков в Google App Engine оштрафовано?

Я прочитал сегодня о оглаженных счетчиках в Google App Engine. В статье говорится, что вы должны ожидать, что максимальная сумма составит около 5/обновлений в секунду для каждого объекта в хранилище данных. Но мне кажется, что это решение не "масштабируется", если у вас есть какой-то способ узнать, сколько обновлений вы делаете в секунду. Например, вы можете выделить 10 черепов, но затем начнете задыхаться при 50 обновлениях в секунду.

Итак, как вы узнаете, как быстро появляются обновления, и как вы можете вернуть это число в число осколков?

Моя догадка заключается в том, что наряду с счетчиком вы можете сохранить некоторые записи о недавней активности, и если вы обнаружите всплеск, вы можете увеличить количество осколков. Как это вообще делается? И если да, то почему это не делается в примере кода? (Этот последний вопрос может быть неопровержимым.) Является ли более распространенной практикой отслеживать активность сайта и обновлять подсчет осколков по мере увеличения трафика, а не делать это автоматически в коде?

Обновление:. Каковы практические последствия воздействия слишком большого количества осколков и удушья? Означает ли это, что веб-сайт становится неактуальным, или можно ли потерять счетные обновления из-за тайм-аутов?


В стороне, этот вопрос говорит о внедрении счетчиков без осколков, но один из ответов предполагает, что даже memcache необходимо отложить, если трафик высок. Поэтому вопрос о распределении и настройке осколков кажется важным.

Ответ 1

Очевидно, что проще вручную отслеживать популярность вашего сайта и увеличивать количество осколков по мере необходимости. Я бы предположил, что большинство сайтов используют этот подход. Выполнение его программно было бы не только сложным, но, похоже, это добавило бы неприемлемое количество накладных расходов, чтобы сохранить запись обо всех последних действиях и попытаться проанализировать его, чтобы динамически корректировать количество используемых вами осколков.

Я бы предпочел более простой подход просто заблудиться на высокой стороне с количеством выбранных вами осколков.

Вы правильно относитесь к практическим последствиям слишком большого количества осколков. Обновление объекта хранилища чаще, чем возможно, из-за чего некоторые запросы потребуют длительного времени (в то время как повторная попытка записи). Если у вас их достаточно, они начнут терпеть неудачу, когда запросят тайм-аут. Это, безусловно, приведет к пропущенным счетчикам. С другой стороны, ваша страница будет настолько медленной, что пользователи должны начать уходить, что должно уменьшить давление на хранилище данных:).

Ответ 2

Чтобы ответить на последнюю часть вашего вопроса: ваши значения memcache не потребуют обхода. Один сервер memcache может обрабатывать десятки тысяч QPS из записок и обновлений, поэтому нет необходимости в большом приложении, чтобы очертить его ключи memcache.

Ответ 3

Почему бы не добавить количество осколков, когда начнут возникать исключения?

Основываясь на этом примере GAE:

try{
  Transaction tx = ds.beginTransaction();
  // increment shard
  tx.commit();           
} catch(DatastoreFailureException e){
   // Datastore is struggling to handle the current load, increase it / double it
   addShards( getShardCount() );

} catch(DatastoreTimeoutException to){
   // Datastore is struggling to handle the current load, increase it / double it 
   addShards( getShardCount() );

} catch (ConcurrentModificationException cm){
   // Datastore is struggling to handle the current load, increase it / double it 
   addShards( getShardCount() );             

}