У меня есть список пользователей, которых только администраторы видят (= немного чтений). Этот список также отображает количество числа пользователей в хранилище данных. Поскольку список мог вырасти, чем 1 000 моих первых мыслей состояли в том, чтобы избежать нормального количества () и вместо этого использовать счетчик черепка.
Однако проблема состоит в том, что у администраторов также есть доступ к различным поисковым фильтрам (в GUI), таким только как просмотр штекерных/розеточных пользователей и так далее. Важно, чтобы количество отразило эти фильтры, так, чтобы они могли получить число розеточных пользователей, штекерных пользователей и несметного числа других комбинаций.
Из-за этого счетчики черепка и высокие счетчики параллелизма без sharding не походят на хорошую идею, потому что я должен был бы создать счетчик для каждой комбинации поисковых фильтров.
Я должен просто создать цикл количества () методы, такой, как описано здесь или являюсь этой очень плохой практикой? Как я сделал бы это иначе?
Обратите внимание, что этот счетчик для администраторского интерфейса и имел бы очень ограниченное количество чтений. Это - действительно случай того, когда я хотел бы пожертвовать некоторой производительностью чтения за гибкость и точность. Хотя это должно смочь вырасти вне 1 000, это, как ожидают, не вырастет, чем 10 000.
«Цикл подсчетов» работает медленно, но в наши дни вы можете немного улучшить его с помощью курсоров . Обычно я бы рекомендовал денормализовать все нужные вам "отфильтрованные" счетчики, но это замедляет добавление и удаление пользователей (а также, вероятно, демографические изменения), поэтому, учитывая ваш конкретный вариант использования с очень низким объемом чтения, вы, вероятно, сможете уйти от подхода "петли счетчиков" (плюс курсоры ;-).
Я пробовал два подхода:
1) Напишите мою собственную задачу, которая запрашивает хранилище данных (запрос - это ключевой нисходящий запрос) с фиксированным лимитом сущностей (скажем, 50). Затем он ставит следующую задачу в очередь, чтобы начать запрос с того места, где она остановилась. Каждая задача ставит в очередь следующую, передавая ей два параметра (там, где она в последний раз остановилась, например, курсор и промежуточный итог количества объектов, которые она увидела).
2) Этот подход намного проще - он заключается в использовании библиотеки mapreduce, предоставленной Google для appengine. Он работает полностью в пользовательском пространстве, поэтому вам просто нужно загрузить и собрать библиотеку и включить ее в свой проект. По сути, он будет обрабатывать итерацию по всем указанным вами объектам и позволяет вам написать обработчик того, что делать с каждой из них (например, увеличение счетчика). См. Подробности здесь: mapreduce.appspot.com - у них даже есть образец приложения, которое делает именно то, о чем вы просите. Единственная проблема с этим состоит в том, что результаты появятся в вашем браузере и не обязательно сохранятся в хранилище данных, если вы не сделаете это сами.