Высокий параллелизм противостоит без sharding

Этот вопрос касается двух реализаций счетчиков, которые предназначаются для масштабирования без sharding (с компромиссом, что они могли бы неполный учет в некоторых ситуациях):

  1. http://appengine-cookbook.appspot.com/recipe/high-concurrency-counters-without-sharding/ (код в комментариях)
  2. http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

Мои вопросы:

  • Относительно № 1: Выполнение memcache.decr() в задержанной, транзакционной задаче походит на излишество. Если memcache.decr() сделан вне транзакции, я думаю, что худший случай является сбоями транзакции, и мы избегаем рассчитывать независимо от того, что мы постепенно уменьшились. Я пропускаю некоторую другую проблему, которая могла произойти путем выполнения этого?
  • Каковы significiant компромиссы между этими двумя реализациями?

Вот компромиссы, которые я вижу:

  • 2 не требует транзакций хранилища данных.

  • Для получения значения счетчика № 2 требует выборки хранилища данных, в то время как с № 1 обычно только должен сделать a memcache.get() и memcache.add().
  • При постепенном увеличении счетчика, обоих вызовов memcache.incr(). Периодически, № 2 добавляет задачу к очереди задачи, в то время как № 1 транзакционно работает, хранилище данных получают и помещают. № 1 также всегда работает memcache.add() (чтобы протестировать, пора ли сохраниться в противоречии с хранилищем данных).

Заключения

(на самом деле не выполняя тестов производительности):

  • 1 должно обычно быть быстрее при получении счетчика (#1 кэш-память по сравнению с хранилищем данных № 2). Хотя № 1 должен выполнить дополнительное memcache.add() также.

  • Однако № 2 должен быть быстрее при обновлении счетчиков (#1, хранилище данных get+put по сравнению с № 2 ставят в очередь задачу).
  • С другой стороны, с № 1 необходимо быть немного более осторожными с интервалом обновления, так как квота очереди задачи почти 100x меньше или, чем хранилище данных или, чем API кэш-памяти.

14
задан David Underhill 5 May 2010 в 00:57
поделиться

2 ответа

Memcache краснеет, вы теряете свой счетчик. ОЙ. Использование базы данных mysql или решения NOSQL решит эту проблему с возможным ударом по производительности. (Redis, Tokyotyrant, MongoDB и т.д.) может не иметь этого удара производительности.

Имейте в виду, что вы можете выполнить 2 действия:

  1. держите счетчик memcache только по причинам высокой производительности.
  2. Ведите журнал, а затем получайте из него более точные метрики.
-2
ответ дан 1 December 2019 в 17:09
поделиться

Обращение к хранилищу данных, вероятно, будет дороже, чем обращение к memcache. Иначе memcache не был бы настолько полезен в первую очередь :-)

Я бы рекомендовал первый вариант.

Если у вас разумная частота запросов, вы можете реализовать его еще проще:

1) update the value in memcache
2) if the returned updated value is evenly divisible by N
2.1) add N to the datastore counter
2.2) decrement memcache by N

Это предполагает, что вы можете установить достаточно длительный тайм-аут для вашего memcache, чтобы прожить между последовательными событиями, но если события настолько редки, что ваш memcache не успевает, есть шанс, что вам не понадобится счетчик "высокого параллелизма": -)

Для больших сайтов, полагаясь на один memcache для таких вещей, как подсчет общего количества просмотров страниц, вы можете попасть в беду; в этом случае, вы действительно хотите разделить ваши memcache, и обновлять случайный экземпляр счетчика; объединение счетчиков произойдет при обновлении базы данных.

При использовании memcache, однако, следует помнить, что некоторые клиентские API будут считать, что тайм-аут в одну секунду означает, что значения нет. Если пакет TCP SYN к экземпляру memcache будет отброшен, это означает, что ваш запрос будет ошибочно считать, что данных нет. (Аналогичные проблемы могут возникнуть с UDP для memcache)

1
ответ дан 1 December 2019 в 17:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: