Сколько осколков в 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() );
}