2013-07-05 2 views
0

Я читаю о GAE и его хранилище данных. Я столкнулся с этим вопросом и статьей. Поэтому я задаюсь вопросом, могут ли мои пользователи идентифицироваться, например, по электронной почте, было бы разумно использовать один и тот же родитель для всех пользователей и электронную почту в качестве ключа с целью разрешения конфликтов, когда два разных пользователя пытаются использовать тот же адрес электронной почты, что и их идентификаторы? Теоретически, если число пользователей становится большим (например, 10M), может ли это вызвать какие-либо проблемы? С моей точки зрения, все должно быть просто прекрасно, но кладет те, которые заблокированы. Таким образом, если значительно преобладает puts (которые действительно происходят только в момент создания нового пользователя), я не вижу никаких проблем. Но ....Можно ли использовать один и тот же родительский ключ для всех пользователей в хранилище данных Google App Engine для транзакций?

Key parent = KeyFactory.createKey("parent", "users"); 
Key user = KeyFactory.createKey(parent, "user", "[email protected]"); 

When to use entity groups in GAE's Datastore https://developers.google.com/appengine/articles/scaling/contention

ответ

0

Я также столкнулся с уникальным вопросом по электронной почте, и вот что я сделал:

настроить «вид» под названием «Электронная почта» и использовать пользователь вводит электронную почту в виде строкового ключа. Это единственный способ сделать полевой масштаб и уникальным в хранилище данных. Тогда установка другого рода называется "Пользователь" и есть ключ, используя автоматически сгенерированных Id:

Email

ключ: электронная почта, UserKey: datastore.Key

Пользователь

ключ: auto_id, Пароль: string, Имя: строка

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

====================

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

=====================

Как общее правило, то, что весы (например, пользователь), должен быть корневым объектом, чтобы пользоваться преимуществами масштабирования хранилища данных.

+0

также рассмотреть вопрос о применении нижнего корпуса для электронной почты ... если вы не используете [email protected] и [email protected] в разных ключах. (хотя RFC сказал, что пользовательская часть может быть чувствительной к регистру, никто на самом деле не делает этого, так как это путается, чтобы «Джон» и «Джон» были двумя разными учетными записями электронной почты) –

+0

классный. спасибо за понимание. и нижняя шкала - отличная идея. – Schultz9999

+0

Кстати, на данный момент я думал, что перейду по домену электронной почты. Это может быть не идеальным и имеет предвзятость, но по крайней мере устраняет необходимость блокировки пользователей gmail при обработке yahoo или hotmail. – Schultz9999

0

Я думаю, что нашел ответ на мой вопрос. https://developers.google.com/appengine/articles/handling_datastore_errors в разделе «Причины ошибок»:

Первый тип таймаута возникает, когда вы пытаетесь написать в одну группу объектов слишком быстро. Записывается в одну группу объектов , сериализуется хранилищем данных App Engine, и, следовательно, существует ограничение на то, как быстро вы можете обновить одну группу сущностей. В общем случае работает от 1 до 5 обновлений в секунду; хорошим ориентиром является то, что вы должны учитывать перестройку, если вы ожидаете, что группа сущностей будет поддерживать более одного обновления в секунду в течение длительного периода времени. Напомним, что группа сущностей представляет собой набор объектов с одним и тем же предком - таким образом, сущность без детей является своей собственной группой сущностей, и это ограничение распространяется также на записи для отдельных объектов. Подробнее о том, как избежать конкуренции с хранилищем данных, см. В разделе «Предотвращение конкуренции хранилища данных». Ошибки таймаута, возникающие во время транзакции, будут повышаться как appengine.ext.db.TransactionFailedError вместо Timeout.

Смежные вопросы