2014-09-04 2 views
0

У меня есть приложение GAE Golang, которое должно обрабатывать сотни одновременных запросов, и для каждого запроса я делаю некоторую работу на входе, а затем сохраняю его в хранилище данных ,Golang on App Engine Datastore - Использование PutMulti для повышения производительности

Использование очереди задач (appengine/delay lib) Я получаю довольно хорошую производительность, но все же кажется очень неэффективным выполнение однострочных вставок для каждого запроса (даже если вставки откладываются с использованием очереди задач).

Если бы это был не механизм приложения, я бы, вероятно, добавил вывод файла, и каждый раз в то время я бы загружал файл в БД, используя задание cron/какой-либо другой запланированный сервис.

Так что мои вопросы:

  1. Есть ли эквивалентная схема я могу реализовать на App Engine? Я был мышление - возможно, я должен написать некоторые строки в memecache, а , то каждые пару секунд я буду загружать все строки из там и очистить кеш.
  2. Действительно ли это необходимо? Может ли хранилище данных обрабатывать тысячи одновременных записей - запись на HTTP-запрос, которую получает мое приложение ?

ответ

1

Зависит от вашей установки. Вы используете запросы предков? Если это так, то вы ограничены 1-м письмом в секунду PER-предком (и всеми детьми, внуками). У хранилища данных есть естественная очередь, поэтому, если вы попытаетесь написать слишком быстро, он будет стоять в очереди. Это становится проблемой, если вы слишком быстро пишете слишком много. Вы можете прочитать некоторые рекомендации here.

Если вы считаете, что пройдете этот предел, используйте pull queues с async multi puts. Вы помещаете каждую сущность в очередь. С помощью поддерживаемого модуля (10-минутные таймауты) вы можете втягивать записи в партии (10-50-100 ...) и делать с ними put_async в партиях. Он будет обрабатывать их правильную скорость. Пока он работает, вы можете поставить в очередь следующую партию. Просто будьте осторожны с таймаутом.

Смежные вопросы