Designe store applikationer til Google App Engine
Af Amy Unruh, Developer, Forfatter, konsulent
Dette indlæg er en del af Who's på Google I / O, en række gæst blogindlæg skrevet af udviklere, der er anført i Developer Sandbox på Google I / O.
Mojo Helpdesk fra Metadot er en RDBMS-baseret Skinner ansøgning om billet sporing og styring, som kan håndtere millioner af billetter. Vi flytter denne ansøgning til at køre på Google App Engine (spil), Java, og Google Web Toolkit (GWT). Vi var motiverede til at tage dette skridt, fordi ansøgningen behov for skalerbarhed i datahåndtering og anmode håndtering af fordele fra adgang til GAE's tjenester og administrative værktøjer, og GWT's støtte til nem udvikling af en rig anvendelse front-end.
I dette indlæg, har vi fokus på GAME og dele nogle teknikker, der har været nyttige i overgangsprocessen.
Opgave fiasko ledelse
Vores ansøgning gør kraftig brug af Task køen, og skal registrere og administrere opgaver, der bliver genbehandlet flere gange, men er ikke lykkes. For at gøre dette, vi udvidede Udskudt, der giver nem opgave definition og implementering. Definerede vi en ny opgave abstraktion, der gennemfører en udvidet fremførbare og kræver, at hver opgave gennemfører en onFailure metode. Vores udvidelse af Udskudt derefter opsiger en task endeligt, hvis den overstiger en tærskel på forsøg, og opfordrer dets onFailure metode.
Dette giver mulighed for permanent opgave manglende pålideligt afsløret som en ansøgning niveau begivenhed, og håndteres korrekt. (Lignende teknikker kan bruges til at udvide den nye officielle Udskudte API).
Fra den eksisterende Mojo Helpdesk: en visning af en brugers tildelte billetter.
Appengine-mapreduce
Mojo Helpdesk skal køre mange typer af batch jobs, og appengine-mapreduce er af stor nytte. Men vi ofte ønsker at kortlægge over en filtreret delmængde af Datastore enheder, og vores kort implementeringer er JDO-baserede (til at håndhæve en ensartet anvendelse semantik), så vi ikke behøver lave niveau Virksomheder prefetched. Så lavede vi to udvidelser til Mapper biblioteker. Først, vi støtter specifikationen af filtre på mapper's Datastore sharding og hent forespørgsler, således at et job ikke behøver gentage over alle enheder ens. For det andet, vores mapper hente gør en taster kun Datastore forespørgsel, men kun de taster, forudsat at kortet metode, så det fulde dataobjekter er opnået via JDO. Disse ændringer lad os køre store JDO-baserede mapreduce job med meget større effektivitet.
Støtte transaktion semantik
Den Datastore understøtter transaktioner kun på enheder i den samme enhed gruppe. Ofte skal operationer på flere enheder skal udføres atomically, men gruppering er umuligt på grund af den påstand, der vil føre. Vi gør kraftig brug af transaktionsbeslutning opgaver at omgå denne begrænsning. (Hvis en opgave er lanceret inden for en transaktion, vil det blive kørt, hvis og kun hvis transaktionen begår). En gruppe af aktiviteter, der udføres på denne måde - det igangsættende metode og dens transaktionsbeslutning opgaver - kan ses som en "transaktionsbeslutning enhed" med fælles semantik.
Vi har gjort dette begreb eksplicit ved at skabe en ramme til støtte definition, påkaldelse, og automatisk logning af transaktionsbeslutning enheder. (Opgaven indvinding ovenfor bruges til at identificere tilfælde, hvor en transaktionsbeslutning opgave ikke lykkes). Alle Datastore-relaterede ansøgning tiltag - både i RPC metoder og \ "offline \" aktiviteter som mapreduce - brug denne ramme. Denne fremgangsmåde har bidraget til at gøre vores ansøgning robuste, ved at håndhæve anvendelsen hele sammenhængen i transaktionen semantik, og i den proces, standardisere de begivenheder og logge som fodrer app's workflow-systemer.
Fra den eksisterende Mojo Helpdesk: En visning af de ikke-tildelte billetter til en arbejdsgruppe.
Enhed Design
For at støtte join-lignende funktionalitet, kan vi udnytte flere værdier Entity egenskaber (liste ejendomme) og forespørgslen støtte, de yder. Indeholder for eksempel en Billet en liste over tilknyttede Tag id'er, og Tag objekter indeholder en liste over Ticket ID'er de er vant til. Det lader os meget effektivt hente, for eksempel, alle billetter markeret med en konjunktion søgeord eller enhver Tags at et sæt af billetter har til fælles. (Vi har fundet brugen af \ "index enheder \" for at være effektive i denne sammenhæng). Vi har også butik afledt tæller og kategoriseringer med henblik på at undvige Datastore restriktioner på forespørgsel formulering.
Disse mønstre har hjulpet os med at bygge en app, hvis komponenter kører effektivt og robust, interagerende i en løst koblet måde.
Kom og se Mojo helpdesken i Developer Sandbox på Google I / O-maj 10-11.
Amy (@ amygdala) har for nylig medforfatter (med Daniel Guermeur) en bog om Google App Engine og GWT applikationsudvikling. Hun har arbejdet hos flere nystartede virksomheder, i den akademiske verden, og i industri F & U-labs, hører og ikke teknisk uddannelse og kursus udvikling i web-teknologier, og er en bidragyder til @ thinkupapp open source-projekt.
Indsendt af Scott Knaster, redaktør
Abonner på:
Kommentarer til indlægget (Atom)
1 kommentar:
Excellent:
http://udumans.blogspot.com/2011/06/excellent.html
Send en kommentar