2013-08-06 2 views
0

Я разрабатываю свое первое веб-приложение с помощью Google App Engine и Datastore. Процесс разработки был довольно простым, но у меня есть огромная дилемма. Я хочу создать «похожий» механизм для статуса пользователя (например, нравится «Facebook» Facebook).Обновление сущности параллелизма в хранилище данных GAE

Итак, я создал объект «Статус», обладающий свойством «likeIndex» (просто хочу суммировать общее количество понравившихся). Теперь я хочу убедиться, что, когда несколько пользователей одновременно дают статус, у меня не будет проблемы с параллелизмом.

Has я узнал из моего короткого опыта с Datastore поток выглядит следующим образом:

  1. (по вызову функции обновления) ПользовательЫ и USERB примет ту же версию объекта statusA с likeIndex = 0 - звонки произошли в в то же время.
  2. пользовательA будет делать likeIndex ++;
  3. пользовательА обновит statusA с помощью какIndex = 1.
  4. пользователь будет делать likeIndex ++;
  5. userB обновит статусA likeIndex = 1.

Вместо того, чтобы иметь в объекте statusAat объекта с asIndes = 2, у меня есть объект с likeIndex = 1. Как я могу обработать процесс обновления, чтобы избежать проблемы параллелизма. Это звучит простая и распространенная проблема, поэтому я удивлен, что мне сложно найти решение в Интернете. (я работаю с JPA)

Спасибо!

ответ

2
  1. Вам необходимо прочитать и написать likeIndex в рамках транзакции.

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

К счастью для вас есть учебное пособие, которое объясняет все это шаг за шагом. Удивительно!

https://developers.google.com/appengine/articles/sharding_counters

+0

Я наткнулся на это решение, но я хотел бы пойти с более традиционными сделок один. Вы знаете руководство для транзакций с использованием объекта EntityManager? Большое спасибо! – Ohadza

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