Я разрабатываю высокопроизводительный веб-сервис для своей игры, и он работает на Google App Engine.
В моей игре 5 сложностей, поэтому у меня изначально было 5 досок с записями для каждой (player_login, счет и время). Если игрок предоставил более низкий балл, чем предыдущий, он был отклонен, поэтому для каждого игрока сохраняется только самый высокий балл.
Но чтобы добавить еще больше веселья, я решил включить ежедневные / еженедельные / ежемесячные / ежегодные таблицы рекордов. Итак, я создал 5 досок для каждой сложности, из которых 25 досок. Когда счет отправляется, он сохраняется на каждой доске, и доски должны очищаться каждый день / неделю / месяц / год.
Это происходит при выполнении задания cron, которое удаляет все записи с определенной доски.
Здесь возникает проблема: похоже, что удаление записей из хранилища данных происходит медленно. Из моих тестов ежедневной очистки похоже, что удаление одной записи занимает около 200 мс.
В худшем случае, если игра будет достаточно популярной и будет иметь, скажем, 100 000 игроков, и у каждого из них будет запись на ежегодной доске, это займет 100 000 * 0,012 секунды = 12 000 секунд (3 часа !!), чтобы очистить эту доску. Я думаю, что в App Engine нам разрешено работать до 30 секунд, поэтому это не сработает.
Я удаляю с следующий код (спасибо Нику Джонсону) :
q = Score.all(keys_only=True).filter('b = ',boardToClear)
results = q.fetch(500)
while results:
self.response.out.write("deleting one batch;")
db.delete(results)
q = Score.all(keys_only=True).filter('b = ',boardToClear).with_cursor(q.cursor())
results = q.fetch(500)
Что вы посоветуете мне сделать с этой проблемой?
Один из подходов, который мне приходит в голову, состоит в том, чтобы использовать очередь задач и удалять более старые оценки, чем те, которые разрешены на каждой доске, то есть, которые истекли, но в меньших количествах. Таким образом, я бы не достиг предела ЦП для одной задачи, но очистка не будет (почти) мгновенной, поэтому моя очистка длиной 12 000 секунд будет разделена на 1 200 задач, каждая примерно по 10 секунд.
Но я думаю, что я что-то не так делаю, такого рода операции были бы намного быстрее, когда выполнялись в реляционной базе данных. Возможно, что-то не так с моим подходом к хранилищу данных и оценке, потому что он заблокирован в мышлении RDBMS.