Как Вы разработали бы хранилище данных AppEngine для социального сайта как Твиттер?

Я читал где-нибудь, что умножение более эффективно в C/C++; Никакая идея относительно интерпретируемых языков - различие не, вероятно, незначительна из-за всех других издержки.

, Если это не становится палкой проблемы с тем, что более удобно в сопровождении/читаемо - я ненавижу его, когда люди говорят мне это, но таким образом верный.

28
задан Dan McGrath 2 September 2016 в 22:57
поделиться

2 ответа

Взгляните на Создание масштабируемых сложных приложений на платформе приложений ( pdf ), увлекательный доклад Бретта Слаткина на Google I / O . Он обращается к проблеме создания масштабируемой службы обмена сообщениями, такой как Twitter.

Вот его решение с использованием свойства списка:

class Message(db.Model):
    sender = db.StringProperty()
    body = db.TextProperty()

class MessageIndex(db.Model):
    #parent = a message
    receivers = db.StringListProperty()

indexes = MessageIndex.all(keys_only = True).filter('receivers = ', user_id)
keys = [k.parent() for k in indexes)
messages = db.get(keys)

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

Вот неправильный способ сделать это:

class Message(db.Model):
    sender = db.StringProperty()
    receivers = db.StringListProperty()
    body = db.TextProperty()

messages = Message.all().filter('receivers =', user_id)

Это неэффективно, потому что запросы должны распаковывать все результаты, возвращаемые вашим запросом . Итак, если вы вернули 100 сообщений с 1000 пользователей в каждом списке получателей, вам придется десериализовать 100, 000 (100 x 1000) перечисляет значения свойств. Слишком дорого с точки зрения задержки хранилища данных и процессора.

Сначала все это меня сильно сбило с толку, поэтому я написал краткое руководство по использованию свойства списка . Наслаждайтесь :)

25
ответ дан 28 November 2019 в 03:41
поделиться

Я не знаю, лучший дизайн для социального приложения, но jaiku был перенесен в App Engine ] первоначальным создателем, когда компания была приобретена Google, так что это должно быть разумным.

См. раздел Актеры, тигры и медведи, о боже! в design_funument.txt . Сущности определены в common / models.py , а запросы находятся в common / api.py .

7
ответ дан 28 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

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