Защо сега()? (обективизирам)

Защо изобщо бих искал да зареждам обект на Objectify асинхронно? И какво всъщност означава асинхронно зареждане?

Според документация на Objectify относно зареждането, следният начин на зареждане Обектът е асинхронен:

// Simple key fetch, always asynchronous
Result<Thing> th = ofy().load().key(thingKey);

И ако искам натоварването да се изпълнява синхронно, тогава трябва да направя следното:

Thing th = ofy().load().key(thingKey).now(); // added .now()

За мен асинхронно означава, че действието ще се извърши по-късно в някакъв неопределен момент. За спестяване асинхронното има смисъл, тъй като операцията на хранилището за данни може да се нуждае от известно време, за да завърши сама, без да блокира кода на приложението.

Но при зареждане, асинхронното означава ли, че зареждането ще се извърши по друго време? Как е възможно това в Java? Мислех, че променливата Result<Thing> th трябва да се актуализира, когато редът от код Result<Thing> th = ofy().load().key(thingKey); завърши изпълнението.

Като начинаещ ми отне много време да разбера това (вижте например Грешка в Objectify Не можете да създадете ключ за обект с нулев @Id в JUnit).

Така че имам няколко въпроса:

1] Защо изобщо бих искал да зареждам обект на Objectify асинхронно?

2] Какво всъщност означава асинхронно зареждане?

3] Каква е концептуалната връзка между now() за зареждане и now() за запазване?

Синхронно зареждане (източник)

Thing th = ofy().load().key(thingKey).now();

Синхронно запазване (източник)

ofy().save().entity(thing1).now();

4] Защо не е синхронно поведението по подразбиране за запазване и зареждане?


person Michael Osofsky    schedule 19.02.2015    source източник
comment
Също така подаден като билет за поддръжка 05483551 с Google Cloud Support. Ще ви уведомя какво открих.   -  person Michael Osofsky    schedule 19.02.2015


Отговори (3)


Отговор от екипа за поддръжка на Google Cloud на случай за поддръжка 05483551:

„Асинхронно“ в контекста на Java означава използването на „фючърси“ или подобни на бъдеще конструкции. Future в java[1] е обект, който представлява операция, която не е задължително да бъде изпълнена и завършена до момента, в който следващият ред започне да се изпълнява в текущата нишка.

Извикването на асинхронна функция в Java ще върне незабавно бъдеще, представляващо обещанието, че фонова „нишка“ ще работи върху изчислението/мрежовото повикване, докато следващият ред от кода продължава да се изпълнява, без да се нуждае от този резултат все още. Когато методът .get() се извика на обект Future, или резултатът се връща, след като е получен навреме, или нишката ще изчака, докато резултатът бъде получен, предавайки изпълнението на следващия ред след извикването .get(). само веднъж това се случва.

В Objectify фючърсите бяха избегнати и вместо това беше дефиниран интерфейсът за резултати [2] поради причини, свързани с хвърляне на изключения, което направи болезнено разработването на базата на фючърси. Те обаче работят по почти идентичен начин. Когато обикновеният Future има метода .get(), интерфейсът Result (имплементиран от няколко различни конкретни класа в зависимост от това какъв вид Objectify извикване правите) има .now(), който извлича резултата или изчаква нишката, докато стане наличен .

Причината, поради която може да искате да заредите обект асинхронно, е, когато имате манипулатор на заявки или API метод, който се нуждае от обект по-късно във функцията, но трябва да извърши и друго изчисление, което не е свързано с обекта. Можете да започнете натоварването за обекта в първия ред, като получите Резултат, и след това да извикате .now() на Резултата само след като другият ви несвързан код приключи своето изпълнение. Ако сте изчакали моментът, в който извиквате .now(), за да започне действително зареждането, може вашият манипулатор на отговор/API метод просто да чака резултата, вместо да прави полезни изчисления.

И накрая, концептуалната връзка между .now() за зареждане и .now() за запазване е, че и двете операции се случват във фонов режим и са накрая принудени, чакайки нишката за изпълнение, когато .now() се извика на Result- обект, изпълняващ интерфейс, който се връща от извикването на save() или load().

Надявам се, че това е помогнало за обяснението на асинхронните конструкции в Java Objectify за вас. Ако имате допълнителни въпроси или проблеми, не се колебайте да ги включите в отговора си и ще се радвам да помогна.

На Ваше разположение,

Представител на Nick Technical Solutions Поддръжка на облачна платформа

[1] http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

[2] http://objectify-appengine.googlecode.com/svn/trunk/javadoc/com/googlecode/objectify/Result.html

person Michael Osofsky    schedule 25.02.2015

Асинхронните операции стартират мрежово извличане към бекенда и след това оставят вашия код да продължи да се изпълнява. Предимството на асинхронните операции е, че можете да изпълнявате няколко от тях паралелно:

Result<Thing> th1 = ofy().load().key(thingKey1);
Result<Thing> th2 = ofy().load().key(thingKey2);
Result<Thing> th3 = ofy().load().key(thingKey3);
th1.now();
th2.now();
th3.now();

Това се изпълнява значително по-бързо от извикването на now() веднага всеки път. Обърнете внимание, че това е лош пример, защото вероятно бихте използвали пакетно получаване (което също паралелизира операцията), но можете да имате няколко заявки, записвания, изтривания и т.н., изпълнявани едновременно.

now() винаги принуждава синхронно завършване, блокирайки, докато приключи.

person stickfigure    schedule 22.02.2015

Google Cloud Datasore е проектиран да даде на потребителя положително релационно и нерелационно изживяване, по същество най-доброто от двата свята. Google datastore е NoSQL база данни, която предлага евентуална последователност за подобрена мащабируемост, но също така ви дава възможност да изберете силна последователност.

Тази статия от Google, Балансиране Силната и евентуална съгласуваност с Google Cloud Datastore ще изиграе дълъг път за отговор на някои от вашите въпроси. Той обяснява евентуалния модел на съгласуваност, който е ключов за разбирането как работи хранилището за данни под капака във връзка с вашия въпрос.

person elcid    schedule 20.02.2015
comment
Благодаря, полезна статия. Става въпрос обаче за последователност и въпросът ми беше за синхронен срещу асинхронен. - person Michael Osofsky; 20.02.2015