Масштабирование disqus с использованием вспомогательных методов горизонтального и вертикального разбиения Django, пожалуйста, объясните - PullRequest
1 голос
/ 29 октября 2010

http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus

Помощник по вертикальному разделению:

class ApplicationRouter(object)

    def db_for_read(self, model, **hints):

        instance = hints.get('instance')

        if not instance:
            return None

        app_label = instance._meta.app_label

        return get_application_alias(app_label)

Может кто-нибудь объяснить, что это делает?

Теперь это для горизонтального разбиения:

class ForumPartitionRouter(object):

    def db_for_read(self, model, **hints):

        instance = hints.get('instance')

        if not instance:
            return None

        forum_id = getattr(instance, 'forum_id', None)

        if not forum_id:
            return None

        return get_forum_alias(forum_id)

Я вроде понимаю, что они делают, но не уверен, что делают некоторые строки:

instance = hints.get('instance')

1 Ответ

2 голосов
/ 03 ноября 2010

Он обсуждает, как Disqus использует технику маршрутизации базы данных, используемую в Django 1.2 и более поздних версиях, которая позволяет вам подключаться к нескольким базам данных одновременно.В отличие от более ранних версий Django, Django 1.2 и выше используют словарь словарей, ключом исходного словаря которого является токен для предоставления права доступа к базе данных, а ключи внутреннего словаря отображаются на знакомые настройки Django в более старых версиях.

ForumPartitionRouter является более очевидным: разные форумы хранятся в разных базах данных (это интересно , потому что ясно, что у них есть некоторые замечательные инструменты управления, которые позволяют им определять эти разделы для своихСерверы django при запуске серверов обрабатывают каждый экземпляр Django как временный и эфемерный объект своей системы), а сервер использует forum_id для поиска и поиска нужной базы данных, из которой можно получить связанных участников форума (в данном случае,посты).db_for_read () возвращает токен, который указывает на базу данных.

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

Если вы посмотрите пример на странице 23, из его примера ясно:

forum.post_set.all()

... то, что происходит, это то, что object_id форума используется для поиска в таблице где-то, что связывает идентификаторы форума с базами данных (не с таблицами, а с )базы данных ), которые могут находиться где-либо еще в сети.

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

Вы можете посмотреть multi-dbs здесь:

http://docs.djangoproject.com/en/dev/topics/db/multi-db/

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