Как работает мультиарендность в App Engine с Objectify?

Как работает мультитенантность с пространствами имен в движке приложений? В моем приложении несколько пользователей, и каждый из них вроде как арендаторы в мультитенантности. Их URL-адрес начинается с domain / customer / companyToken # pageName? Param1 & param2. Итак, из документов Google, если я хочу применить мультитенантность с пространством имен для каждого клиента, вам нужно назначить уникальные идентификаторы для NamespaceManager каждому клиенту. Итак, что-то вроде ниже:

NamespaceManager.set(request.getServerName());

Теперь у меня есть несколько вопросов.

  1. Как на самом деле работает мультитенантность с пространством имен для App Engine?

  2. Как это в целом меняет способ доступа к данным?

  3. Как это меняет способ доступа к данным с помощью Objectify?

  4. Во-первых, мое понимание применения вышеупомянутого приложения к приложению состоит в том, что при извлечении данных все данные, относящиеся к вышеуказанным клиентам (арендаторам), собираются вместе в одном пространстве имен, так как же изменяется способ доступа к данным с помощью Objectify? В настоящее время объект Company является родительским для всех объектов, связанных с клиентами. (Так в случае моей заявки?)

Огромное спасибо заранее.


person user_1357    schedule 07.05.2011    source источник


Ответы (2)


  1. На уровнях хранилища данных пространство имен похоже на идентификатор приложения. Каждое пространство имен, по сути, смотрит на хранилище данных как на другое представление данных приложения. Вот почему такие операции, как запрос, не могут охватывать пространства имен (по крайней мере, на данный момент). Даже диапазоны идентификаторов различаются в зависимости от пространства имен.

  2. Вы должны знать, какое пространство имен вы действительно используете. например После создания объекта его пространство имен не изменяется, поэтому выполнение NamespaceManager.set (...) не повлияет на его ключ. Аналогично с объектом Query. После создания запроса устанавливается его пространство имен. То же самое с MemcacheService. Следовательно, важно знать, какие объекты имеют какие пространства имен, если вы привыкли вызывать NamespaceManager.set чаще, чем с начала запроса.

  3. Трудно понять, как Obectify использует API хранилища данных, поэтому изменение текущего пространства имен несколько раз в одном запросе необходимо выполнять, зная, как Objectify использует API хранилища данных, чтобы гарантировать, что вы случайно не создадите объекты в непредусмотренных пространствах имен.

  4. В общем, вы должны знать, когда Objectify создает объекты Key, Entity и Query низкого уровня, и убедитесь, что текущее пространство имен установлено на пространство имен, которое вы намереваетесь. Это просто, если для каждого запроса используется только одно пространство имен.

person Gianni Mariani    schedule 08.05.2011

  1. Google AppEngine не является открытым исходным кодом, поэтому только Google действительно знает, как это работает внутри. Но есть некоторые общедоступные данные о том, как устроено внутреннее хранилище данных: http://www.youtube.com/watch?v=tx5gdoNpcZM. По сути, все данные AppEngine находятся в одной таблице (да, одна таблица для ВСЕХ приложений AppEngine), распределенных между несколькими компьютерами. У каждой сущности есть Ключ, по которому она однозначно идентифицируется (идентификатор, родительский элемент, который вы можете видеть в своем приложении), но также есть данные, которые говорят, какому приложению принадлежит Сущность. Это внутренние данные AppEngine, и пользователь их не видит. Я предполагаю, что эта часть также расширена за счет включения данных пространства имен.

  2. Это не так. Datastore API учитывает пространство имен, поэтому весь код остается неизменным. Он внутренне знает, к какому пространству имен принадлежит Entity.

  3. Objectify построен на основе низкоуровневого API хранилища данных, поэтому ответ такой же, как 2.

  4. Пространства имен разделяют данные: после того, как вы установите пространство имен, Datastore API будет видеть только Сущности, которые были добавлены в это пространство имен.

person Peter Knego    schedule 08.05.2011
comment
Спасибо за отличный ответ. Я до сих пор не совсем уверен насчет №2. Итак, что на самом деле означает «внутреннее знание», к какому пространству имен принадлежит объект? У него нет никакой информации относительно отношений сущностей (в моем случае Company obj является родительским, а User obj принадлежит этой компании и т. Д.). Поэтому, когда я запрашиваю пользователя для компании, как обычно, используя Objectify, как пространство имен распознает эта компания как материнская компания и пользователи, принадлежащие этой компании, и т. д.? Спасибо. - person user_1357; 08.05.2011
comment
Задайте пространство имен и сохраните несколько сущностей - теперь эти сущности принадлежат этому пространству имен (поскольку Datastore API поддерживает пространство имен). Переключите пространство имен и попробуйте получить те же сущности (с помощью ключа) - они не найдены. - person Peter Knego; 08.05.2011
comment
По сути, осведомленность о пространстве имен означает, что хранилище данных сохраняет данные пространства имен в ключ сущности. Мы просто не видим этого, поскольку это не отображается через общедоступный API. Как уже упоминалось (и это в видео), ключ объекта также содержит идентификатор приложения (также не отображается в API ключей) - именно так GAE узнает, какие объекты принадлежат вашему приложению. - person Peter Knego; 08.05.2011
comment
Ваш ответ на (1) неверен: идентификатор приложения и пространство имен являются частью ключа объекта. - person Nick Johnson; 10.05.2011
comment
Да, я полагаю, что сказал это, но был неверен в том отношении, что идентификатор приложения и пространство имен не являются общедоступными в Key. На самом деле в Java appID не отображается, только пространство имен. - person Peter Knego; 10.05.2011