Лучший подход для фильтрации большого набора данных в зависимости от хранилища данных - PullRequest
2 голосов
/ 14 декабря 2011

В настоящее время я внедряю веб-сервис, предоставляющий социальные функции игры.Одной из особенностей этой игры является возможность управлять списком друзей.Количество друзей, которых пользователь может добавить, зависит от контактов, которые он имеет во внешней социальной сети по своему выбору (в настоящее время Facebook или Twitter).

Текущее поведение системы следующее:

  • Клиентское приложение использует API социальной сети (Facebook или Twitter) для получения списка контактов игрока.
  • Каждый из этих контактов имеет уникальный идентификатор (а именно, социальная сеть, из которой он происходит,и его идентификатор в этой социальной сети, например, «Tw12345»).
  • Клиент отправляет список всех этих идентификаторов в игровой веб-сервис, размещенный на GAE.
  • Веб-сервис проверяет наличиекаждый идентификатор, если у него есть пользователь, который совпадает с его собственной базой данных.
  • Возвращает список идентификаторов, отфильтрованный так, что он содержит только тех, у кого также есть совпадение в базе данных игры.

Очевидно, что это не работает, потому что список контактов большинства пользователей огромен.Сервер тратит огромное количество времени на проверку базы данных, чтобы отфильтровать, у какого контакта есть подходящая игровая учетная запись.

Теперь мне сложно понять, как мне действовать более эффективно.Поскольку идентификаторы не соответствуют ни одному из указанных порядков, я не могу использовать целочисленные операции для выбора пользователей в базе данных.Кроме того, я не могу полагаться на Twitter или Facebook, чтобы выполнять фильтрацию на их стороне, потому что это не поддерживается их API.

Я думал о системе, использующей какое-то дерево данных memcached для хранения списка«известные» идентификаторы (так как в запросе нужно только знать, что есть совпадающий пользователь, а не какой именно пользователь совпадает), но я боюсь времени, которое потребуется кешу для создания в любое время, когда он очищается.

Если у кого-то из вас есть опыт в подобных проблемах, связанных с сетами, я буду очень рад это услышать!Спасибо!

1 Ответ

2 голосов
/ 15 декабря 2011

Я предполагаю, что это так медленно, потому что вы делаете запрос для каждого пользователя, которого вы ищете.Вы можете избежать необходимости делать это при правильном использовании имен ключей.

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

При отправке списка идентификаторов просто выполните массовую операцию получения для всех имен ключей этогосущность, чтобы определить, если они существуют - например, сделав MyKind.get_by_key_name(key_names).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...