Обновление данных на мобильных устройствах с помощью App Engine (желательно избегать горячих планшетов)

Некоторая справочная информация для контекста: я создаю приложение (iOS + android) примерно с шестью видами основных объектов (User, Kind, Event, Tag, Image и Trust). Пользователи могут создавать новых пользователей, а затем делиться этим новым пользователем с другими пользователями (например, родитель может создать ребенка и пригласить другого пользователя действовать с этим ребенком).

Для каждого пользователя можно (при наличии достаточных прав, представленных объектами Trust) добавлять новые события, содержащие ноль или более тегов и ноль или более изображений. Каждое событие также является частью «класса» (оно имеет определенный «вид», представленный объектами Kind).

События имеют метку времени (java.util.Date), поэтому они могут отображаться пользователю в хронологическом порядке, и все объекты содержат «измененную» метку времени.

Я использую Java в движке приложений, но считаю, что этот вопрос носит общий характер. Кроме того, в другие объекты не встраиваются никакие объекты, только ключи (т. Е. Объект Event имеет список ключей изображения, а не объектов изображения).

Теперь проблема заключается в следующем: как я могу эффективно проверить хранилище данных на наличие обновлений для всех этих типов? Моя наивная реализация прототипа делает следующее: на мобильном устройстве я в настоящее время опрашиваю сервер очень часто (в настоящее время каждые пять минут или всякий раз, когда пользователь отправляет обновление на сервер), проверяю список доверительных отношений, чтобы найти пользователей, которых опросчик может видеть, и для каждого типа (Пользователь, Тип, Событие, Тег, Изображение, Доверие) запросить в хранилище данных объекты, связанные с этим пользователем, у которых дата изменения более поздняя, ​​чем последний раз, когда он опрашивал. Очевидно, что это слишком много обращений к хранилищу данных.

Если в хранилище данных движка приложения есть проблема с "горячими таблетками" (см. http://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/), как я могу эффективно запрашивать обновления у сервера с момента последней проверки? По-видимому, добавление метки времени вызывает узкое место. Тем не менее, я хочу обновить мобильный клиент изменениями, внесенными с момента последнего запроса. (Я знаю, что это узкое место вряд ли повлияет на меня в этом проекте, но в марте у меня есть еще один проект, где это может стать реальной проблемой.)

Подводя итог, возникает вопрос: каковы наилучшие методы обновления мобильных клиентов новыми / измененными данными с помощью движка приложений?

Спасибо, что прочитали мою стену с текстом. Надеюсь, мне удалось передать вопрос и его контекст в несколько понятной форме.

Ex animo,
- Александр.


person yngling    schedule 03.12.2011    source источник
comment
Здесь действительно не нужно беспокоиться о горячих таблетках. Чтобы планшеты, содержащие индексные строки с метками времени, были «горячими», вам придется записывать тысячи - возможно, десятки тысяч - строк в секунду в течение длительного периода.   -  person Nick Johnson    schedule 06.12.2011


Ответы (1)


(Изначально это было частью вопроса, но я отредактировал его, поскольку на самом деле это попытка ответить на его часть.)

Я считаю, что могу использовать курсоры запросов (см. http://code.google.com/appengine/docs/java/datastore/queries.html), чтобы сделать работу немного более эффективной. Он должен содержать ссылку на то место в индексе, которое уже было достигнуто (индекс сортируется по измененной временной метке), чтобы он мог начать поиск в этой точке. Стоимость заключается в хранении и передаче этого курсора для каждого устройства. Комментарии по этому поводу тоже приветствуются (это связано с главным вопросом, как эффективно обновлять клиентов).

person yngling    schedule 03.12.2011