Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Këshilla
  • Zhvillimi i anës së serverit të aplikacioneve celulare. Zhvillimi i anës së serverit të aplikacioneve celulare Ana e serverit të aplikacioneve si funksionon

Zhvillimi i anës së serverit të aplikacioneve celulare. Zhvillimi i anës së serverit të aplikacioneve celulare Ana e serverit të aplikacioneve si funksionon

488 Pjesa IV. Ajax me shembull

bots dhe thërret serverin, i cili në mënyrë dinamike do të krijojë të dhëna përgjigjeje bazuar në vlerën e vargut të pyetjes së dërguar. Parametri i parë i funksionit LoaciXMLXSLTDoc () është URL-ja e faqes PHP që gjeneron dokumentin XML, i lidhur me një varg pyetësor të referuar në vlerat e fushës HTML të formës O. Parametri i dytë është emri i XSLT © skedari i përdorur në transformimin e të dhënave XML. Parametri i tretë i kërkuar nga funksioni LoadXMLXSLTDoc () është identifikuesi për elementin div në të cilin vendosen rezultatet e kërkimit. Identifikuesi është emri i vargut të elementit dalës, jo një referencë objekti; në këtë rast, vargu "rezultat" përdoret si identifikues.

Në hapin tjetër, ne përdorim metodat DOM për të shtuar një imazh tregues në faqen e internetit. Krijohet një element i imazhit © dhe vendoset atributi i burimit të imazhit O. Ky element i krijuar i shtohet elementit © div të rezultateve. Në këtë mënyrë, kur funksioni ynë thirret nga mbajtësi i ngjarjeve onsubmit të formularit, një skedar imazhi vendoset në faqe. Në përgjithësi, është e rëndësishme që përdoruesi të krijojë reagime vizuale - një mesazh ose imazh - që tregon se përpunimi është në progres. Kjo e pengon përdoruesin të klikojë vazhdimisht butonin e handikapit duke menduar se asgjë nuk po ndodh (mos harroni, procesi i Ajax është "i padukshëm").

Faza e fundit është një thirrje për funksionin LoadXMLXSLTDoc () ®, i cili fillon procesin e dërgimit të informacionit në server. Funksioni LoadXMLXSLTDoc (), i përshkruar në seksionin 12.4, trajton thirrjen për objektin ContentLoader (), i cili kërkon dokumente nga serveri. Duke specifikuar një pozicion daljeje si parametër (në vend që të kodojmë me forcë vlerën në funksionin LoadXMLXSLTDoc ()), ne mund ta ripërdorim funksionin në të njëjtën faqe pa kërkuar procedura të shumta ose deklarata if për të ndarë funksionalitetin. Prandaj, ne i ridrejtojmë rezultatet e pyetjeve të ndryshme të kërkimit në pjesë të ndryshme të faqes. Sidoqoftë, përpara se t'i bëjmë të gjitha këto, le të hedhim një vështrim se si të krijojmë dokumente XML dhe XSLT në server.

12.3. Kodi i anës së serverit: PHP

V në këtë seksion, ne do të krijojmë një dinamikë për projektin Dokument XML duke përdorur PHP - një gjuhë popullore skriptimi me burim të hapur (siç e dini, korniza Ajax është e pajtueshme me çdo gjuhë ose platformë nga ana e serverit). Dokumenti XML gjenerohet në mënyrë dinamike nga grupi i rezultateve të marra në përgjigje të një kërkese të klientit në bazën e të dhënave. Përveç kësaj, ne do t'ju tregojmë se si të krijoni një dokument XSLT statik që mbahet në server dhe merret sa herë që kërkohet një skedar dinamik. Të dy këto dokumente i kthehen klientit në mënyrë të pavarur kur objekti ContentLoader kërkohet në dy kërkesa të veçanta (Lista 12.7). Kodi XSLT transformon dokumentin tonë dinamik XML në anën e klientit dhe krijon një tabelë HTML që i shfaqet përdoruesit.

Kapitulli 12 Kërkimi i drejtpërdrejtë duke përdorur XSLT 489

12.3.1. Krijimi i një dokumenti XML

Meqenëse po përdorim XSLT, na duhet një dokument i strukturuar XML, i cili është një regjistrim i thjeshtë informacioni në mënyrë që skedari XSL të mund të kryejë një transformim standard. Në këtë projekt, ne do të krijojmë një skedar dinamik XML kur klienti kërkon një skedar PHP.

Zhvillimi i strukturës XML

Para se të fillojmë të krijojmë skedarin XML, duhet të krijojmë një shabllon për të. Ky shabllon duhet të pasqyrojë strukturën e të dhënave të kthyera nga kërkimi. Në formulimin e problemit të zgjedhur (libri i telefonit), ne do të kthejmë emrin e kompanisë, emrin e kontaktit, vendin dhe numrin e telefonit. Lista 12.3 tregon një shabllon bazë XML me katër fusha.

Listimi 12.3. Skedari bazë XML

Emri i Kompanise Emri i kontaktit Emri i vendit Numri i telefonit

Artikulli i parë është libri i telefonave. Tjetra është një element hyrje që përmban nën-elemente me të gjitha detajet që lidhen me të gjithë numrat e kontaktit që gjenden në kërkesë. Nëse kemi pesë rezultate, do të ketë pesë elemente hyrëse në dokumentin XML. Emri i kompanisë shfaqet në elementin e kompanisë. Përveç kësaj, ne kemi shtuar emrin e personit të kontaktit, emrin e shtetit dhe numrin e telefonit. Ne nuk jemi të kufizuar vetëm në fushat e specifikuara; fushat mund të shtohen ose hiqen në varësi të informacionit që duhet të shfaqet.

Nëse nuk gjenden rezultate, në vend që të shfaqni një mesazh paralajmërues, mund të krijoni një artikull që shfaq këtë informacion tek përdoruesi. STO do ta bëjë më të lehtë për ne kthimin e rezultatit te përdoruesi dhe nuk do të kërkojë kod shtesë në anën e klientit të aplikacionit. Kodi në Listimin 12.4 është pothuajse identik me kodin në Listimin 12.3, por këtë herë ne po injektojmë tekst në elementët XML që duam t'i shfaqim përdoruesit për të sinjalizuar se nuk u gjetën rezultate.

Listimi 12.4. Skedar XML pa rezultate

Nuk ka rezultate

// О Në vend të emrit të kompanisë, shfaqet "No R e s u l t s". N / A

490 Pjesa IV. Ajax në shembuj

// © "N / A" shfaqet për kufijtë e mbetur

N / A

N / A

Me këtë kod, ne i shfaqim përdoruesit një rresht të vetëm që tregon se informacioni i kërkuar mungon. Kompania përshkruese O shfaq informacion që tregon se nuk ka rezultate. Përshkruesit e tjerë 0 i tregojnë përdoruesit se nuk ka informacion. Nëse nuk duam të shfaqim tekstin "N / A" ("nuk disponohet"), në vend të kësaj mund të shtojmë një hapësirë ​​pa ndërprerje, e cila do të tregojë qelizat e tabelës. Nëse nuk do të kishim shtuar asnjë informacion fare, qelizat në tabelë nuk do të shfaqeshin.

Siç mund ta shihni, formati XML ka një strukturë shumë të thjeshtë. Nëse ky skedar XML do të ishte statik, do të ishte relativisht e lehtë për përdoruesin të shtonte një pajtimtar të ri në skedar. Meqenëse gjenerohet në mënyrë dinamike, na duhet një lak që gjeneron një dokument XML mbi grupin e rezultateve.

Krijimi i një dokumenti dinamik XML

Si gjithmonë, ne krijojmë një dokument XML në server. Duke iu përmbajtur politikës së përdorimit të shembujve të ndryshëm nga ana e serverit në shembuj, kodi i serverit për këtë kapitull është shkruar në PHP. Si kujtesë, infrastruktura Ajax mund të ndërtohet duke përdorur çdo gjuhë nga ana e serverit, dhe ne do të përshkruajmë vetëm se si zbatohet kodi i serverit pa hyrë në detaje. Pra, Lista 12.5 tregon kodin për pjesën e pasme të aplikacionit. Kodi merr një parametër të vargut të pyetjes dhe gjeneron shumë rezultate të pyetjeve të bazës së të dhënave. Më pas kalojmë nëpër grupin e rezultateve, duke krijuar një element XML duke përdorur shabllonin në Listimin 12.4 për çdo numër telefoni të marrë në përgjigje të një kërkese.

Listimi 12.5. Skript PhoneXML.php: Gjeneroni dokument XML në server

// O Deklaroni llojin MIME header ("Lloji i përmbajtjes: tekst / xml"); jehonë ("\ n ");

// © Lidhu me bazën e të dhënave

$ db = mysql__connect ("localhost", "ajax", "action"); rnysql_select_db ("ajax", $ db);

$ rezultat = mysql_query ("SELECT *

FROM Kontaktet WHERE Emri i kontaktit si "%". // © Plotësoni kërkesën

$ _MERRNI ["q"]. "%" ", $ Db);?>

// О Kontrollo rezultatet

nëse ($ myrow = mysgl_fetch_array ($ rezultat)) (bëni (

// © Kaloni nëpër rezultate të shumta

Kapitulli 12. Kërkimi i drejtpërdrejtë me XSLT 491

001">

) ndërsa ($ myrow - mysql_fetch_array ($ rezultat)); ) tjeter (

12.3.2. Krijimi i një dokumenti XSLT

Duke përdorur XSLT, skedari ynë XML mund të konvertohet në një tabelë të bukur HTML me disa rreshta kodi. Dokumenti XSLT lejon përputhjen e modelit nëse nevojitet për të shfaqur të dhënat në çdo format të kërkuar. Kur përputhet me një shabllon, struktura e shabllonit përdoret për të shfaqur të dhënat. Në këtë rast, ne kalojmë nëpër nyjet e pemës

492 Pjesa IV. Ajax me shembull

burimi wa duke përdorur XSLT. Një dokument XSLT merr një skedar të strukturuar XML dhe e konverton atë në një format që është i lehtë për t'u parë, përditësuar dhe modifikuar. Në rastin tonë, dokumenti XSLT përcaktohet në mënyrë statike.

Struktura XSLT

Një transformim XSLT përmban rregulla për përkthimin e një peme burimore në një pemë destinacioni. I gjithë procesi XSLT është përputhje e strukturuar e modelit. Kur elementet e pemës burimore përputhen me strukturën e dhënë, pema e synuar krijohet sipas shabllonit të dokumentit.

Struktura e pemës së synuar nuk duhet të lidhet me strukturën e pemës burimore. Prandaj, skedari origjinal XML mund të konvertohet në çdo format që dëshironi. Nuk është e nevojshme të përdoret vetëm pamja tabelare e grupit të të dhënave.

Transformimi XSLT quhet fletë stili sepse përcakton stilin e pemës së destinacionit. Fleta e stilit përmban rregulla modeli me dy pjesë. Pjesa e parë është një strukturë modeli kundrejt së cilës krahasohen nyjet e pemës burimore. Pasi të gjejë një përputhje, procesori XSLT përdor pjesën e dytë, shabllonin që përmban përshkruesit për të ndërtuar pemën burimore.

Krijimi i një dokumenti XSLT

Është relativisht e lehtë të gjenerosh një transformim XSLT për këtë projekt. Meqenëse do të marrim një tabelë, nuk kërkohet përputhja e modeleve të zbukuruara; ne thjesht do të kalojmë nëpër të gjitha nyjet e elementeve të pemës burimore në mënyrë sekuenciale. Më poshtë do të zhvillojmë një shabllon që formon një tabelë HTML me katër kolona. Skedari përkatës XSLT për këtë projekt është paraqitur në Listimin 12.6.

i Listimi 12.6. skedar XSLT

"ISO-8859-l"?>

// О Vendosni versionin dhe kodimin XML

// © Vendos hapësirën e emrave XSLT"http://www.w3.org/1999/XSL/Transform">

// © Vendos rregullat e shabllonit

// O Shtoni elementin e tabelës

// © Krijo rreshtin e titullit

Kapitulli 12 Kërkimi i drejtpërdrejtë duke përdorur XSLT 493

// 0 Kaloni në mënyrë sekuenciale elementet e librit të telefonit

zgjidhni = "Libri i telefonave / hyrje"> // © Formatoni daljen

Kompania Kontaktoni Vendi Telefoni

Kur krijoni një transformim XSLT, duhet të specifikoni kodimin dhe versionin XML O, dhe të specifikoni hapësirën e emrit XSLT ©. Hapësira e emrave përcakton rregullat dhe specifikimet me të cilat duhet të përputhet një dokument. Elementet në hapësirën e emrave XML njihen në dokumentin burimor, por nuk njihen në dokumentin e rezultatit. Të gjithë elementët tanë në hapësirën e emrave XSLT janë të prefiksuara me xsl. Më pas, mund të vendosni një rregull shabllon - kërkoni strukturën / © që përputhet me të gjithë dokumentin.

Tani mund të fillojmë të krijojmë një shabllon për tabelën që shfaq rezultatet tona. Ne shtojmë një përshkrues të tabelës O që hartohet në identifikuesin e tabelës. Më pas futet rreshti i kokës së tabelës (C), që përmban emrat e kolonave që i tregojnë përdoruesit se çfarë informacioni përmban tabela.

Duke kaluar në mënyrë sekuenciale nëpër grupin e nyjeve të pemës burimore, marrim pjesën tjetër të rreshtave të tabelës. Në këtë rast, përdoret një lak për çdo ©, në procesin e përpunimit të hyrjeve, ai nxjerr nyjet e vendosura në librin e telefonit / hyrjen.

Meqenëse po ecim në mënyrë sekuenciale nëpër pemën e dokumentit, duhet të zgjedhim vlerat e kolonave. Për të zgjedhur vlerat nga nyjet, operatori vlera-of përdoret për të marrë vlerën e elementit XML dhe për ta shtuar atë në rrjedhën e daljes së transformimit. Për të specifikuar elementin XML, tekstin e të cilit duam ta marrim, përdorim atributin select me emrin e elementit. Tani që keni përfunduar skedarin tuaj XSLT dhe keni krijuar kodin për të gjeneruar në mënyrë dinamike një dokument XML, mund të plotësoni kodin tuaj JavaScript dhe të shihni sesi kombinimi i një transformimi XSLT me një skedar të strukturuar XML krijon një tabelë të lehtë për t'u parë.

Në hapin tjetër, ne jemi kthyer në anën e klientit të marrjes së skedarëve që sapo krijuam me përgjigjen HTTP.

Pjesa më e madhe e modernes aplikacione për platformat celulare(iOS, Android, etj.) punon së bashku me një server. Një aplikacion me të dhëna të vjetruara humbet dobinë e tij. Prandaj, është e rëndësishme të siguroheni që të dhënat nga serveri në pajisje të mbahen të përditësuara. Kjo vlen për aplikacionet jashtë linje që duhet të funksionojnë pa internet. Për aplikacionet plotësisht online që nuk funksionojnë (ose janë të padobishme) pa internet (për shembull, Foursquare, Facebook) ka specifika që janë përtej qëllimit të këtij artikulli.

Duke përdorur shembullin e një prej aplikacioneve tona offline, unë do t'ju tregoj se çfarë qasjesh kemi përdorur për të sinkronizuar të dhënat. Në versionet e para ne kemi zhvilluar algoritme të thjeshta dhe, në të ardhmen, me përvojë i kemi përmirësuar. Një sekuencë e ngjashme është paraqitur në artikull - nga praktikat e thjeshta të dukshme në ato më komplekse.

Duhet të sqarohet se artikulli trajton transferimin e të dhënave vetëm në një drejtim: nga serveri në pajisje. Këtu serveri është burimi i të dhënave.

Dispozitat e përgjithshme për të gjitha qasjet

Si shembull, ne do të konsiderojmë transferimin e një drejtorie enësh ("enë") në pajisje. Ne do të supozojmë se pajisja bën një kërkesë për url "/ shërbim / enët / përditësimi", shkëmbimi kryhet përmes protokollit http në formatin JSON ( www.json.org). Serveri ka një tabelë "pjata" me fushat e mëposhtme: id (identifikuesi i regjistrimit), emri (emri i pjatës), i përditësuar (në momentin që pjata është përditësuar, është më mirë të bëni menjëherë mbështetjen e zonës kohore, "YYYY-MM -DDThh: mm: ssTZD”, për shembull, “1997 -07-16T19: 20: 30 + 01: 00 ”), is_deleted (shenja e regjistrimit të fshirë).

Vërejtje në lidhje me praninë e fushës së fundit. Si parazgjedhje, vlera e tij është 0. Në një aplikacion ku entitetet sinkronizohen ndërmjet klientit dhe serverit, nuk rekomandohet fshirja fizike e të dhënave nga serveri (për të shmangur gabimet). Prandaj, për pjatat e fshira vendoset is_deleted = 1. Kur një entitet me is_deleted = 1 arrin në pajisje, ai fshihet nga pajisja.

Me çdo qasje, e cila do të shqyrtohet më poshtë, serveri kthen një grup objektesh në pajisjet JSON (mund të jetë bosh):

[
(id: , emri: , i përditësuar: , është Fshirë: },…
]

Shembull i përgjigjes së serverit:

[
(id: 5625, emri: "Bukë", përditësuar: "2013-01-06 06:23:12", është Fshirë: 0),
(id: 23, emri: "Burriz i gatuar", i përditësuar: "01-02-2013 14:44:21", është Fshirë: 0), (

emri: "Supë peshku",

përditësuar: "02-08-2013 07:05:19",

Parimet e përditësimit të të dhënave në një pajisje

  1. Nëse një element që është në pajisje erdhi dhe është Fshirë = 0, atëherë ai përditësohet
  2. Nëse ka mbërritur një element që nuk është në pajisje dhe është i fshirë = 0, atëherë ai shtohet
  3. Nëse një element që është në pajisje erdhi dhe është Fshirë = 1, atëherë ai fshihet
  4. Nëse ka mbërritur një element që nuk është në pajisje dhe është Fshirë = 1, atëherë asgjë nuk është bërë

Qasja 1: Gjithçka është gjithmonë në sinkronizim

Kjo është metoda më e lehtë. Pajisja kërkon një listë të pjatave nga serveri dhe serveri dërgon të gjithë listën. Sa herë vjen e gjithë lista. I pa renditur.

Shembull i kërkesës: null, ose "()"

Përparësitë:

  • logjika në server është e thjeshtë - ne gjithmonë japim gjithçka
  • logjika në pajisje është e thjeshtë - ne gjithmonë mbishkruajmë gjithçka

Të metat:

  • nëse e kërkoni listën shpesh (çdo 10 minuta), atëherë do të ketë shumë trafik në internet
  • nëse rrallë e kërkoni listën (një herë në ditë), atëherë rëndësia e të dhënave do të shkelet

Zona e aplikimit:

  • për aplikime me trafik të ulët
  • transmetimi i të dhënave që ndryshojnë shumë rrallë (lista e qyteteve, kategoritë)
  • transferimi i cilësimeve të aplikacionit
  • në fillim të projektit për prototipin e parë të një aplikacioni celular

Qasja 2: sinkronizoni vetëm përditësimet

Pajisja kërkon një listë të pjatave, të përditësuar nga sinkronizimi i mëparshëm. Lista vjen e renditur sipas "të përditësuar" në rend rritës (opsionale, por e përshtatshme). Pajisja ruan vlerën "të përditësuar" për pjatën e dërguar më së fundi dhe, në kërkesën tjetër, e dërgon atë te serveri në parametrin "LastUpdated". Serveri dërgon një listë të pjatave që janë më të reja se "lastUpdated" (përditësuar> lastUpdated). Në kërkesën e parë për serverin "LastUpdated" = null.

Shembull i kërkesës: (Përditësuar së fundi: “2013-01-01 00:00:00”)

Në diagram: "Last_updated" është vlera që ruhet në pajisje. Zakonisht, një tabelë e veçantë krijohet në pajisje për të ruajtur këto vlera "të përditësuara të fundit" për çdo entitet (pjatë, qytet, organizatë, etj.)

Kjo qasje është e përshtatshme për sinkronizimin e listave të thjeshta lineare ku rregullat e mbërritjes janë të njëjta për të gjitha pajisjet. Për sinkronizim më selektiv, shihni "Qasja 5: Sinkronizoni me njohuritë e asaj që është tashmë në pajisje".

Kjo qasje zakonisht mbulon shumicën e nevojave. Vetëm të dhëna të reja vijnë në pajisje, mund të sinkronizoni të paktën çdo minutë - trafiku do të jetë i vogël. Megjithatë, ka probleme që lidhen me kufizimet e pajisjeve mobile. Këto janë memoria dhe procesori.

Qasja 3: Sinkronizoni në grupe

RAM-i i pajisjeve celulare është i ulët. Nëse ka 3000 pjata në drejtori, atëherë analizimi i një vargu të madh json nga serveri në objekte në pajisje mund të shkaktojë mungesë memorie. Në këtë rast, aplikacioni ose do të prishet ose nuk do t'i ruajë këto 3000 pjata. Por edhe nëse pajisja ishte në gjendje të trette një varg të tillë, atëherë performanca e aplikacionit në momentet e sinkronizimit në sfond do të jetë e ulët (vonesat e ndërfaqes, jo lëvizje e qetë, etj.) Prandaj, është e nevojshme të kërkohet lista në porcione më të vogla.

Për ta bërë këtë, pajisja kalon një parametër më shumë ("shuma"), i cili përcakton madhësinë e pjesës. Lista duhet të dërgohet e renditur sipas fushës "të përditësuar" në rend rritës. Pajisja, e ngjashme me qasjen e mëparshme, kujton vlerën "të përditësuar" të entitetit të fundit të dërguar dhe e kalon atë në fushën "LastUpdated". Nëse serveri ka dërguar saktësisht të njëjtin numër entitetesh, atëherë pajisja vazhdon sinkronizimin dhe bën përsëri një kërkesë, por me "lastUpdated" të përditësuar. Nëse serveri ka dërguar më pak entitete, kjo do të thotë se nuk ka më shumë të dhëna të reja dhe sinkronizimi përfundon.

Në diagram: "last_updated" dhe "samount" janë vlerat që ruhen në aplikacioni celular... “Last_item” - entiteti (pjata) i fundit i dërguar nga serveri. Është më e re se kjo vlerë që do të kërkohet lista tjetër.

Shembull i kërkesës: (Përditësuar së fundi: “2013-01-01 00:00:00”, shuma: 100)

Përparësitë:

  • Pajisja merr aq të dhëna sa mund të përpunojë në të njëjtën kohë. Madhësia e shërbimit përcaktohet nga teste praktike. Subjektet e thjeshta mund të sinkronizohen 1000 në të njëjtën kohë. Por ndodh gjithashtu që entitetet me një numër të madh fushash dhe logjikë komplekse të përpunimit të ruajtjes sinkronizohen normalisht jo më shumë se 5 copë.

Të metat:

  • Nëse ka 250 pjata me të njëjtat të përditësuara, atëherë me shumë = 100, 150 të fundit nuk do të dërgohen në pajisje. Kjo situatë është mjaft reale dhe përshkruhet në qasjen e mëposhtme.

Qasja 4: Koha e saktë e grupit

Në qasjen e mëparshme, është e mundur që nëse tabela përmban 250 pjata me të njëjtat "azhurnime" (për shembull, "2013-01-10 12:34:56") dhe madhësia e porcionit është 100, atëherë vetëm 100 e para të dhënat do të vijnë. 150 të tjerat do të këputen me vështirësi (të përditësuara> të fundit të përditësuara). Pse do të ndodhë kjo? Kur kërkohen 100 regjistrimet e para, "LastUpdated" do të vendoset në "2013-01-10 12:34:56" dhe kërkesa tjetër do të ketë kushtin (përditësuar> "2013-01-10 12:34:56"). Edhe zbutja e gjendjes (përditësuar> = “2013-01-10 12:34:56”) nuk do të ndihmojë, sepse pajisja do të kërkojë pafundësisht 100 regjistrimet e para.

Situata me të njëjtin "përditësuar" nuk është aq e rrallë. Për shembull, kur importoni të dhëna nga një skedar teksti, fusha "e përditësuar" u vendos në TANI (). Mund të duhet më pak se një sekondë për të importuar një skedar me mijëra rreshta. Mund të ndodhë gjithashtu që i gjithë drejtoria të ketë të njëjtin "përditësuar".

Për ta rregulluar këtë, duhet të përdorni një fushë pjate që do të ishte unike të paktën brenda një momenti ("përditësuar"). Fusha "id" është unike në të gjithë tabelën, kështu që ju duhet ta përdorni atë në sinkronizim.

Pra, zbatimi i kësaj qasjeje duket kështu. Serveri kthen listën e renditur sipas "updated" dhe "id" dhe pajisjet kërkojnë të dhëna duke përdorur "lastUpdated" dhe parametrin e ri "lastId". Në server, gjendja e përzgjedhjes është më e ndërlikuar: ((përditësuar> e fundit-përditësuar) OSE (përditësuar = e fundit Përditësuar dhe id> e funditId)).

Në diagram: "Last_updated", "last_id" dhe "samount" janë vlerat që ruhen në aplikacionin celular. “Last_item” - entiteti (pjata) i fundit i dërguar nga serveri. Është më e re se kjo vlerë që do të kërkohet lista tjetër.

Qasja 5: Sinkronizoni me njohuritë e asaj që është tashmë në pajisje

Qasjet e mëparshme nuk marrin parasysh faktin që serveri nuk e di me të vërtetë se sa me sukses u ruajtën të dhënat në pajisje. Pajisja thjesht nuk mund të ruante disa nga të dhënat për shkak të gabimeve të pashpjegueshme. Prandaj, do të ishte mirë të merrni konfirmim nga pajisja se të gjitha (ose jo të gjitha) enët janë ruajtur.

Përveç kësaj, përdoruesi i aplikacionit mund ta konfigurojë aplikacionin në atë mënyrë që t'i nevojiten vetëm një pjesë e të dhënave. Për shembull, një përdorues dëshiron të sinkronizojë enët nga vetëm 2 qytete nga 10. Kjo nuk mund të arrihet duke përdorur sinkronizimet e përshkruara më sipër.

Ideja pas qasjes është si më poshtë. Serveri ruan (në një tabelë të veçantë "lista_store_item_list") informacione se cilat pjata janë në pajisje. Mund të jetë thjesht një listë e çifteve "id - të përditësuara". Kjo tabelë përmban të gjitha listat e çifteve të enëve "id - përditësuar" për të gjitha pajisjet.

Pajisja dërgon informacion në lidhje me pjatat e disponueshme në pajisje (lista e çifteve "id - përditësuar") në server së bashku me një kërkesë për sinkronizim. Kur kërkohet, serveri kontrollon se cilat pjata duhet të jenë në pajisje dhe cilat janë tani. Diferenca më pas dërgohet në pajisje.

Si e përcakton serveri se cilat pjata duhet të jenë në pajisje? Në rastin më të thjeshtë, serveri bën një kërkesë që do të kthejë një listë të çifteve "id - të përditësuara" të të gjitha pjatave (për shembull, SELECT id, enët e përditësuara FROM). Në diagram, kjo bëhet me metodën "WhatShouldBeOnDeviceMethod ()". Ky është disavantazhi i qasjes - serveri duhet të llogarisë (nganjëherë duke bërë pyetje të rënda sql) se çfarë duhet të jetë në pajisje.

Si e përcakton serveri se cilat pjata janë në pajisje? Ai bën një pyetje në tabelën "stored_item_list" për këtë pajisje dhe merr një listë të çifteve "id - updated".

Duke analizuar këto dy lista, serveri vendos se çfarë duhet të dërgohet në pajisje dhe çfarë duhet të fshihet. Në diagram, kjo është "delta_item_list". Prandaj, kërkesa nuk përmban "lastUpdated" dhe "lastId", detyra e tyre kryhet nga çiftet "id - updated".

Si e di serveri për pjatat e disponueshme në pajisje? Në kërkesën për serverin, shtohet një parametër i ri "artikuj", i cili përmban një listë të ID-së së pjatave që janë dërguar në pajisje në sinkronizimin e fundit ("device_last_stored_item_list"). Sigurisht, mund të dërgoni një listë të ID-së së të gjitha pjatave që janë në pajisje dhe të mos e ndërlikoni algoritmin. Por nëse ka 3000 pjata në pajisje dhe të gjitha dërgohen çdo herë, atëherë kostot e trafikut do të jenë shumë të larta. Në shumicën dërrmuese të sinkronizimeve, parametri "artikuj" do të jetë bosh.

Serveri duhet të përditësojë vazhdimisht "listën_artikuj_store" me të dhënat që vijnë nga pajisja në parametrin "artikuj".

Ju duhet të zbatoni një mekanizëm për pastrimin e të dhënave të serverit në listën e ruajtur_item. Për shembull, pas riinstalimit të një aplikacioni në një pajisje, serveri do të supozojë se pajisja është ende e përditësuar. Prandaj, kur instaloni aplikacionin, pajisja duhet të informojë disi serverin në mënyrë që të pastrojë listën e ruajtur_item_për këtë pajisje. Në aplikacionin tonë, ne dërgojmë një parametër shtesë "clearCache" = 1 në këtë rast.

konkluzioni

Një tabelë përmbledhëse e karakteristikave të këtyre qasjeve:

Një qasje Vëllimi i trafikut(5 - i madh) Intensiteti i zhvillimit të punës(5 - i lartë) Përdorimi i kujtesës së pajisjes(5 - i lartë) Korrektësia e të dhënave në pajisje(5 - i lartë) Ju mund të zgjidhni një pajisje specifike
1 Gjithçka është gjithmonë e sinkronizuar 5 1 5 5 Nr
2 Vetëm të përditësuarit 1 2 5 3 Nr
3 Sinkronizimi në grupe 1 3 1 3 Nr
4 Sinkronizimi i saktë në grupe 1 3 1 3 Nr
5 Sinkronizimi me njohuritë e asaj që është tashmë në pajisje 2 5 2 5 po

"Korektësia e të dhënave në pajisje" është probabiliteti që pajisja të përmbajë të gjitha të dhënat që janë dërguar nga serveri. Në rastin e qasjeve # 1 dhe # 5, ka 100% siguri që pajisja ka të gjitha të dhënat që i nevojiten. Në raste të tjera, nuk ka një garanci të tillë. Kjo nuk do të thotë se nuk mund të përdoren qasje të tjera. Thjesht nëse një pjesë e të dhënave humbasin në pajisje, atëherë nuk do të jetë e mundur ta rregulloni atë nga serveri (dhe aq më tepër për të mësuar rreth tij në anën e serverit).

Ndoshta, në prani të tarifave të pakufizuara të Internetit dhe wifi falas, problemi i kufizimit të trafikut të krijuar nga një aplikacion celular do të bëhet më pak i rëndësishëm. Por, ndërkohë që ju duhet të shkoni në të gjitha llojet e mashtrimeve, krijoni qasje më të zgjuara që mund të zvogëlojnë kostot e rrjetit dhe të rrisin performancën e aplikacionit. Nuk funksionon gjithmonë. Ndonjëherë është "sa më e thjeshtë, aq më mirë", në varësi të situatës. Shpresojmë, nga ky artikull, ju mund të zgjidhni një qasje që ju vjen në ndihmë.

Ka çuditërisht pak përshkrime të sinkronizimit të serverëve në internet dhe pajisje celulare... Për më tepër, ka shumë aplikacione që funksionojnë sipas kësaj skeme. Për të interesuarit, disa lidhje.

BACKUP

Pse keni nevojë për kopje rezervë në një platformë celulare

Ekspertët e dinë se sa ndonjëherë jo të besueshme janë aplikacionet celulare në 1C: gabimet mund të ndodhin në çdo kohë, për shkak të të cilave baza e përdoruesit thjesht do të shembet. Në të njëjtën kohë, ne përballemi me pabesueshmërinë e vetë pajisjeve: ato mund të prishen, humbasin, mund të vidhen dhe përdoruesit duan të mbajnë të dhënat e tyre. Dhe deri në versionin 8.3.9 ne nuk kishim një mekanizëm platformë për ruajtjen e një kopje rezervë.

Meqenëse përdoruesit nuk kishin më parë një buton "ruaj një kopje", zhvilluesit e aplikacionit Boss duhej të bënin kopjet rezervë të tyre. Si ia dolëm?

Ne ruajmë të dhënat e bazës së të dhënave në formën e XML.

Këshillohet që t'i ofroni përdoruesit disa opsione për ruajtjen e kopjeve - para së gjithash, është i përshtatshëm për klientët, ata mund të zgjedhin opsionin më të mirë për veten e tyre: ngarkoni në re, dërgoni në postën e tyre, kurseni në pajisje.

Kështu, zhvilluesit gjithashtu sigurojnë veten. Nëse diçka shkoi keq dhe mekanizmi për krijimin e kopjeve në Google Drive ose Yandex Drive prishet papritmas, gjithmonë mund t'i tregoni përdoruesit se zhvilluesi aktualisht po merret me një gabim, por tani për tani ai mund t'i ruajë të dhënat në një mënyrë alternative. Dhe përdoruesit janë të kënaqur sepse mund të jenë të sigurt për të dhënat e tyre.

Domosdoshmërisht duhet të fokusohemi në shërbimet cloud, sepse nëse pajisja humbet ose prishet dhe përdoruesi ka ruajtur një kopje në të njëjtën pajisje, atëherë të dhënat do të humbasin.

Gjithashtu ne sigurohuni që t'i kujtoni përdoruesit nevojën për të krijuar kopje rezervë.

Si të ruani kopje nëse ndryshon konfigurimi?

Kur flasim për një zgjidhje masive, për një aplikacion që ndryshon, evoluon dhe rafinohet vazhdimisht, duhet të merret parasysh sjellja e klientit. Përdoruesi mund të dëshirojë të rivendosë një kopje rezervë të ruajtur në një version të vjetër të aplikacionit, i cili nuk kishte asnjë detaj. Dhe pastaj lind detyra: të lexoni të dhënat, pastaj të plotësoni të dhënat sipas logjikës së përditësimit nga versioni i vjetër i aplikacionit. Si ta bëjmë atë? Përveç të dhënave, ruani vetë strukturën e të dhënave në mënyrë që më vonë të dini se si t'i lexoni ato.

Ka disa opsione për ruajtjen e kësaj strukture të të dhënave, duke përfshirë që ajo mund të ruhet në vetë konfigurimin. Kjo do të thotë, sa herë që lëshohet një version i ri, mbajeni strukturën e meta të dhënave të versionit të mëparshëm në një plan urbanistik në konfigurim.

Mos harroni se në një aplikacion celular, konfigurimi nuk duhet të rritet ashtu, duhet të vlerësojmë vendin në të, duhet ta bëjmë sa më kompakt. Por aplikacioni po zhvillohet, dhe do të ketë shumë paraqitje të tilla, dhe me kalimin e kohës ato do të bëhen gjithnjë e më shumë.

Prandaj, në rastin e një aplikacioni celular, preferohet një mënyrë tjetër - ruani strukturën e meta të dhënave direkt në skedarin e të dhënave... Në dalje, marrim një skedar të tillë, ku në fillim ruajmë disa të dhëna ndihmëse - versionin e konfigurimit, skemën e konfigurimit, kufijtë e sekuencës, dhe pas kësaj shkruajmë vetë të dhënat e përdoruesit në formatin XML. Për më tepër, në seksionin "Të dhënat ndihmëse" të skedarit, mund të ruani gjithashtu të dhëna të tjera të rëndësishme që, për ndonjë arsye, nuk mund të shkruheshin në XML.

Marrim në skedar skemën e të dhënave që kemi ruajtur dhe mbi bazën e saj ndërtojmë paketën XDTO për leximin e skedarit. Ne krijojmë një objekt të ngjashëm në bazën e të dhënave, e plotësojmë atë, kryejmë përpunimin e rimbushjes gjatë përditësimit dhe ruajmë objektin tashmë të përfunduar në bazën e të dhënave.

Më poshtë në foto mund të shihni një sugjerim se si të shkruani bukur modelin XDTO të këtyre konfigurimeve. Kompania që lëshoi ​​aplikacionin Boss eksperimentoi me këtë, gjeti disa mënyra, por u vendos në këtë opsion për regjistrimin e skemës së meta të dhënave. Kur hapni vetë skedarin e të dhënave, mund të shihni XML-në e zakonshme të strukturuar, të lexueshme, e cila liston të gjitha meta të dhënat e aplikacionit.

// Shkruani skemën e konfigurimit ModelXDTO = FactoryXDTO.ExportModelsXDTO ("http://v8.1c.ru/8.1/data/enterprise/current-config"); XDTO Factory.WriteXML (UploadFile, Model XDTO); // Leximi i skemës së konfigurimit Model XDTO = Fabrika XDTO. Lexoni XML (Lexo XML, Fabrika XDTO. Lloji ("http://v8.1c.ru/8.1/xdto", "Model")); UnloadFactory = New XDTOFactory (XDTOModel);

Për të mbrojtur përdoruesin, është e domosdoshme ta pyesni përsëri nëse duhet të rivendosë kopjen rezervë. Ndoshta ai thjesht po eksperimentonte dhe klikonte në të gjithë butonat në aplikacion :) Dhe tani të dhënat aktuale mund të humbasin. Prandaj, kur kryejmë veprime potencialisht "të rrezikshme", ne gjithmonë specifikojmë nëse ai e dëshiron vërtet këtë dhe si duhet bërë. Përdoruesi duhet të jetë i vetëdijshëm për veprimet e tij.

Duhet të ekzistojë një mekanizëm për krijimin e kopjeve rezervë kur flasim për një zgjidhje autonome, kur përdoruesi i ka të gjitha të dhënat e ruajtura ekskluzivisht në një pajisje celulare: përdoruesi mund të humbasë pajisjen e tij dhe më pas të dhënat do të humbasin. Dhe, duket, nëse aplikacioni nuk funksionon në mënyrë autonome, por është i lidhur me një server qendror, atëherë përdoruesi nuk duhet të ketë një problem të tillë, sepse nëse pajisja humbet, ai do të lidhet me serverin, do të marrë të gjitha të dhënat e tij. përsëri nga serveri dhe gjithçka do të jetë në rregull.

Megjithatë, përdoruesit jo gjithmonë përdorin kopje rezervë ashtu siç ne presim :) Ata shumë shpesh i përdorin ato thjesht për të "rikthyer" të dhënat prapa. Kjo është me të vërtetë një sjellje shumë e çuditshme, por përdoruesit e aplikacioneve celularë janë shumë dembelë për të kuptuar se ku mund të bëjnë një gabim kur futin të dhëna, dhe ata thjesht i kthejnë të dhënat dhe i rifusin të dhënat për ditën aktuale. Pas analizimit të statistikave të punës me aplikacionin Boss, kuptuam se kjo është një praktikë normale dhe kjo sjellje e përdoruesit është më e zakonshme nga sa mund të prisnim.

Dhe nëse jeni duke përdorur sinkronizimin me pajisje të tjera, atëherë duhet ta trajtoni atë. Këtu ka disa zgjidhje:

  • prishni lidhjen me serverin, duke specifikuar që të dhënat në të do të mbeten siç ishin dhe kopja do të rikthehet vetëm në pajisjen e përdoruesit;
  • është më mirë që përdoruesi ta lejojë atë të rivendosë një kopje menjëherë në të gjitha pajisjet, pasi të ketë përshkruar më parë mekanizma të tillë.

Këtu ka edhe një gjë. Deri më tani, ne i ruanim vetë kopjet rezervë, kontrollonim të gjithë procesin, kapnim veprimet e përdoruesit pikërisht në kod kur ai shtypte butonin "ruaj një kopje". E gjithë kjo mund të përpunohet më vonë. Në platformën 8.3.9, u bë e mundur ruajtja e kopjeve rezervë pikërisht me anë të platformës. Dhe përdoruesi e bën këtë pa dijeninë tonë. Nëse përdoret sinkronizimi me një bazë të dhënash qendrore, atëherë duhet të trajtohet një skenar i tillë. Ne duhet të zbulojmë disi në serverin tonë që përdoruesi ka rikthyer një kopje të ruajtur më parë dhe duhet t'i japë atij një lloj zgjidhjeje. Nuk mund të përballojmë të kemi të dhëna jashtë sinkronizimit.

SHKËMBIMI

Kur flasim për një zgjidhje private në një platformë celulare, zakonisht kemi një klient që, për shembull, dëshiron të përdorë një platformë celulare për agjentët e tyre të shitjeve dhe në mënyrë që ata të shkëmbejnë të dhëna me një bazë të dhënash qendrore. Gjithçka është e thjeshtë këtu: një bazë të dhënash, disa pajisje, ju ngrini serverin, vendosni komunikimin me të. Pra, problemi i shkëmbimit midis pajisjeve është i lehtë për t'u zgjidhur.

Por nëse flasim për një aplikacion masiv, ku ka shumë baza të dhënash, secila prej të cilave ka një numër shumë të madh përdoruesish, situata bëhet më e ndërlikuar. Përdoruesit e kanë shkarkuar aplikacionin nga tregu dhe duan të sinkronizohen me njëri-tjetrin. Për shembull, një burrë shkarkoi një aplikacion për llogaritjen e financave personale, dhe tani ai dëshiron që edhe gruaja e tij të lidhet dhe ata të punojnë së bashku në të njëjtin aplikacion. Ka shumë përdorues, aplikacioni po zhvillohet, po rritet dhe ka nevojë për një numër të madh, të madh bazash të dhënash. Si të organizohet e gjithë kjo? Përdoruesit nuk do të kontaktojnë personalisht zhvilluesit për të krijuar një bazë të dhënash të veçantë për ta dhe për të mundësuar sinkronizimin. Ata duan të shtypin një buton dhe ta bëjnë atë të funksionojë menjëherë. Në të njëjtin moment.

Si të vazhdojmë? Këtu vjen në shpëtim mekanizmi i ndarjes së të dhënave. Kjo ju lejon të organizoni një bazë të dhënash të vetme, ku ka një konfigurim të përbashkët, por në të njëjtën kohë, një numër i pakufizuar bazash përdoruesish ruhen brenda një baze të dhënash të përbashkët.

Pjesa më e mirë është se ju mund të shtoni përdorues në mënyrë dinamike, programatike, pa pjesëmarrjen tonë. Në realitet, përdoruesit thjesht klikojnë në butonin "Regjistrohu në server" dhe gjithçka ndodh vetë: krijohet një bazë të dhënash personale për të në server, dhe ai menjëherë mund të fillojë të punojë në të.

Si ta bëjmë atë? Zgjidhja e parë dhe më e thjeshtë është të shkruani bazën tuaj të serverit me këtë mekanizëm. Kur kompania jonë filloi të bënte aplikacionin Boss dhe shkëmbimet në të, në versionin e parë ne bëmë pikërisht këtë: kemi shkruar një bazë të dhënash serveri me një mekanizëm për ndarjen e të dhënave. Gjithçka funksionoi, veçanërisht pasi nuk kishte asgjë të komplikuar - ndarësi i bazës është një mbështetëse e zakonshme.

Por më pas kuptuam se po rishpiknim timonin :) Në fakt, ekziston një zgjidhje e gatshme dhe tashmë ka marrë parasysh pikat që as që i kishim menduar ende. Kjo është 1C: E freskët.

Shkallueshmëria e shërbimit është menduar këtu: çfarë të bëni kur do të ketë shumë të dhëna dhe baza të të dhënave, si të rriteni me gjithë këtë. Ekziston një pikë në lidhje me krijimin e kopjeve rezervë të zonave të të dhënave: domethënë, ne nuk bëjmë kopje rezervë vetëm të një baze të dhënash të zakonshme, ne bëjmë kopje të një përdoruesi specifik. Për më tepër, mekanizmi atje është i tillë që kopjet bëhen vetëm kur ato janë vërtet të nevojshme. Nëse një përdorues nuk ka hyrë në bazën e të dhënave për një javë, atëherë ne nuk bëjmë kopje të tij, sepse asgjë nuk ka ndryshuar atje. Një veçori tjetër e Fresh është se shërbimi zbaton një mekanizëm për të reduktuar ngarkesën në server, gjë që është shumë e rëndësishme kur keni shumë baza të dhënash.

Në përgjithësi, Fresh për ne është diçka e re dhe interesante. Pak nga pak po përpiqemi ta kuptojmë, por në pjesën më të madhe jemi thjesht të kënaqur me punën e tij.

Transferimi i të dhënave. Si ta zbatoni atë për shkëmbim midis pajisjeve

Platforma ofron dy mekanizma - shërbimet SOAP dhe http. Ka nuanca se si të aksesohen këto shërbime kur përfshihet mekanizmi i ndarjes së të dhënave. Në veçanti, ju duhet të shtoni parametra që tregojnë numrin specifik të zonës në të cilën po aksesoni, sepse platforma nuk mund të përcaktojë se në cilën bazë të dhënash të aksesohet me emrin e përdoruesit. Përveç kësaj, i njëjti përdorues mund të punojë me disa baza të dhënash brenda një databaze të vetme (shih foton).

Sa i përket shërbimeve, aplikacioni Boss zbaton shkëmbimin e menjëhershëm: një përdorues fut të dhëna dhe tjetri i merr ato. Përdoruesit e aplikacioneve celularë janë mësuar me faktin se gjithçka ndodh në çast, kështu që ne menduam se cili shërbim është më i mirë për t'u përdorur - SOAP ose http. Shpejtësia e lidhjes luajti një rol kryesor. Në http, shpejtësia e lidhjes është shumë më e lartë dhe kur lidhemi përmes SOAP, marrim një përshkrim të shërbimit, i cili është i rëndë dhe kërkon shumë kohë për t'u ngarkuar. Platforma ka një mënyrë për të ruajtur një përshkrim të një shërbimi, por për shkak të parametrave që shtojmë në mënyrë dinamike, ne nuk mund të përdorim referencat WS. Për më tepër, aksesi në shërbimet http është më i përshtatshëm dhe fleksibël në përvojën tonë.

Pra, qëllimi ynë është të zbatojmë shkëmbimin në kohë reale. Kjo do të thotë, ne përpiqemi që përdoruesi të mos duhet të shkojë diku, të klikojë në një buton, të mendojë se sa të rëndësishme janë të dhënat e tij, nëse ai duhet t'i përditësojë ato ... Të dhënat duhet të jenë gjithmonë të rëndësishme për përdoruesit. Ata janë mësuar të punojnë në mesazhe të çastit - njëri dërgoi të dhënat, tjetri i mori menjëherë. Gjithçka ndodh në çast. E njëjta gjë vlen edhe për aplikacionet që lidhen me biznesin: njëri shitës ka lëshuar një shitje, tjetri duhet të shohë menjëherë situatën aktuale pa marrë asnjë veprim.

Prandaj, aplikacioni Boss përdor punë në sfond për shkëmbime. Pasi çdo e dhënë është shkruar në bazën e të dhënave, fillon një punë në sfond, e cila fillon shkëmbimin. Pjesa e parë është dërgimi i të dhënave në server. Pastaj pajisjet e tjera duhet të dinë se ka të dhëna të reja. Për këtë ne përdorim njoftimet PUSH. Kjo skemë tashmë po funksionon dhe funksionon mjaft shpejt.

Por ne e donim edhe më shpejt, sepse punojmë në kohë reale dhe zakonisht kemi pak të dhëna. Ne kemi XML të vogël, por në të njëjtën kohë dërgojmë një mesazh me këto të dhëna nga pajisja e parë në server, serveri dërgon PUSH në një pajisje tjetër dhe më pas pajisja e dytë, pasi merr PUSH, fillon një shkëmbim nga ana e tij, i drejtohet serverit dhe kërkon të dhëna, merr këto të dhëna dhe më pas dërgon një përgjigje se të dhënat janë marrë. Kjo është një kohë e gjatë, por vetë të dhënat ishin shumë të vogla.

Ne menduam se si mund të përshpejtohet ky proces.

Për ta bërë këtë, ne kuptuam se çfarë përmban PUSH, si mund të përdoret akoma. Doli që PUSH përmban fusha të tilla si të dhëna dhe tekst. Dokumentacioni i iOS dhe Android përmban kufizime në madhësinë e mesazheve PUSH, por kjo na dukej e pamjaftueshme dhe ne donim ta kuptonim në mënyrë empirike. Dhe ne kontrolluam që shuma e karaktereve të vlefshme është 981 karaktere për iOS dhe 3832 karaktere për Android. Në rastin e fundit, është mjaft e mundur të përdoret kufizimi; një ose disa objekte bazë mund të grumbullohen në një vëllim të tillë. Dhe më pas zhvilluesit e kompanisë ndryshuan pak skemën. Kur nuk ka shumë të dhëna, ne i dërgojmë nga një pajisje, i marrim në server, i paketojmë në PUSH atje dhe i dërgojmë direkt në një pajisje tjetër në të. Skema u bë më e shkurtër dhe shkëmbimi filloi të ndodhte edhe më shpejt :)

Një pikë e rëndësishme e përdorimit të PUSH nuk është të bezdisni përdoruesit.

Është shumë e lehtë për të hequr qafe këtë situatë: thjesht mos i dërgoni shumë mesazhe PUSH përdoruesit :) Nëse ai është duke punuar në aplikacion tani, ju mund të dërgoni shumë mesazhe. Kur platforma po funksionon, përdoruesi nuk e sheh PUSH, gjithçka ndodh automatikisht për të. Por kur aplikacioni mbyllet, klienti ka shumë mesazhe të palexuara. Prandaj, në asnjë rast nuk duhet të dërgohet PUSH-ja e radhës derisa të merret një përgjigje nga pajisja se aplikacioni është në punë, aktiv dhe PUSH-i i mëparshëm tashmë është përpunuar.

Një nuancë tjetër e shkëmbimit është puna përmes internetit. Ne duhet të shfrytëzojmë sa më shumë asinkroninë. Ju nuk mund të punoni si zakonisht - shkruani kodin - telefononi funksionin - prisni që të ekzekutohet - merrni përgjigjen - dhe gjithçka është në rregull. Nëse punoni në ueb, do të përballeni ende me kufizime të caktuara, për shembull, internet i paqëndrueshëm, ndërprerje kohore të shkaktuara gjatë kryerjes së operacioneve të gjata. Prandaj, është e nevojshme të mendoni paraprakisht për arkitekturën.

Le të shohim një shembull të regjistrimit të një pajisjeje, çfarë ndodh në një aplikacion kur një përdorues dëshiron të regjistrohet. Ai mban shënime për një kohë, ka futur shumë të dhëna, por më pas do që edhe shitësi të punojë me këtë bazë të dhënash. Përdoruesi klikon në butonin "Regjistrohu". Në fillim gjithçka ishte shumë e thjeshtë: ata morën të dhënat e tij, i regjistruan në server dhe, ju lutem, mund të punoni dhe lidhni përdoruesit. Por më pas u gjendëm në një situatë ku për disa përdorues, bazat e të dhënave në pajisje deri në kohën e regjistrimit tashmë ishin rritur shumë. Dhe kjo skemë nuk funksionoi më, pasi ndërkohë që e gjithë baza e të dhënave po regjistrohej në server, u aktivizua koha e lidhjes ose thjesht u ndërpre interneti. Prandaj, ne zëvendësuam një telefonatë sinkrone me shumë të shkurtra. Tani të dhënat po ndahen në vend që të transmetohen të gjitha menjëherë. Ne nuk presim në asnjë mënyrë që serveri të përpunojë dhe regjistrojë të dhënat. Ne dërguam të dhëna, morëm një përgjigje se të dhënat ishin marrë, mbyllëm lidhjen. Periodikisht, ju duhet të anketoni serverin, çfarë po ndodh atje dhe si, dhe ndërkohë, një punë në sfond po funksionon në server, i cili regjistron të dhënat e marra. Në këtë mënyrë marrim shumë telefonata nga serveri, por kemi garanci që gjithçka do të shkojë mirë. Dhe as ndërprerjet e kohës dhe as paqëndrueshmëria e internetit nuk do t'ju pengojnë të ngarkoni të gjitha të dhënat në server.

PËRDITËSIMET

Shkëmbeni midis pajisjeve me versione të ndryshme të aplikacionit

Duke qenë se po flasim për një aplikacion masiv që del në treg, duhet të kemi parasysh disa nga veçoritë e procesit të përditësimit dhe shkëmbimit të të dhënave.

Nëse keni lëshuar një aplikacion për një ndërmarrje dhe keni vendosur ta përditësoni atë, atëherë zakonisht thjesht jepni një komandë në mënyrë që të gjithë punonjësit të instalojnë aplikacionin e ri së bashku. Kjo nuk mund të bëhet me përdoruesit që kanë shkarkuar aplikacionin nga tregu. Nuk mund t'u thuash fare se çfarë të bëjnë. Për shembull, ata janë duke punuar në një aplikacion dhe nuk duan ta përditësojnë atë as tani, as kurrë. Ata nuk kanë azhurnim automatik, kështu që është një situatë mjaft e zakonshme kur disa pajisje janë të lidhura në bazën qendrore dhe të gjitha janë me versione të ndryshme. Një arsye tjetër për këtë fenomen është koha e publikimit në treg: është e ndryshme për iOS dhe Android. Ne shpesh zbatojmë gjërat kryesore, për shembull, rregullojmë gabimet kritike dhe nuk duam të presim që iOS të kontrollojë një version të ri për dy javë, duam të paktën vetëm për Android, por duam të lëshojmë një përditësim menjëherë.

Ne nuk kemi të drejtë të komandojmë përdoruesit. Nëse duan, përditësohen dhe nëse jo, nuk bëjnë asgjë. Figura tregon raportin e instalimeve të aplikacionit Boss sipas versioneve në GooglePlay, si dhe statistikat nga serveri ynë - raporti real i versioneve të aplikacioneve që janë instaluar në pajisjet që kanë shkëmbyer të dhëna me serverin gjatë javës së fundit. Këtu është një grup për të punuar me të. Këto janë versione të ndryshme dhe meta të dhëna të ndryshme. Dhe ne duhet të organizojmë një shkëmbim normal në të njëjtën kohë :)

Zhvilluesit përballen me detyrat e mëposhtme:

  • E gjithë kjo duhet të funksionojë. Përdoruesit nuk duhet të ndjejnë siklet që kanë harruar të përmirësojnë. Ata nuk duhet ta vënë re fare. Përditësuar - është më mirë, mirë dhe mirë.
  • Ne duhet të garantojmë sigurinë e të dhënave. Për shembull, një përdorues ka një direktori dhe një mbështetëse të re, ndërsa një tjetër jo ende. Për më tepër, nëse një përdorues që nuk ka detaje të reja ndryshon diçka në pajisjen e tij, atëherë të dhënat në pajisjet e tjera nuk duhet të humbasin.
  • Ne duhet të sigurohemi që të dhënat të përditësohen kur përmirësojmë në një version të ri. Kur përdoruesi vendos që është gati të përditësojë, ai duhet të ketë automatikisht të gjitha informacionet e reja që nuk i kishte vetëm sepse kishte një version të vjetër.

Si ia dolëm?

1. Ne përdorim 2 plane shkëmbimi në server. E para është për ndarjen midis pajisjeve dhe e dyta është për përditësime. Për shembull, ne i dërguam një manual një përdoruesi, por ai nuk ka njësi matëse, domethënë të dhëna jo të plota. Duhet ta kujtojmë këtë. Dhe kur ai të përditësohet, duhet t'i dërgojmë të gjitha informacionet që ai nuk i kishte. Për këtë është plani i dytë i shkëmbimit.

2. Për të shkruar dhe lexuar objekte, përdorim të njëjtin mekanizëm që përdoret për kopje rezervë, domethënë ruajmë versionin e meta të dhënave. Në këtë rast, ne jemi duke punuar me serverin dhe mund të përballojmë të shtojmë gjithçka që dëshirojmë drejtpërdrejt në konfigurim, kështu që ne thjesht shtojmë skemat e meta të dhënave në konfigurim në formën e paraqitjeve ndërsa aplikacioni zhvillohet.

Si të monitoroni gabimet masive gjatë shkëmbimit dhe në server

Së pari, duhet të kontrolloni disponueshmërinë e vetë serverit. Kjo ndodh me serverët - ata bien. Ne nuk shpikëm asgjë të veçantë për monitorim, por thjesht gjetëm një bot në telegram që bërtet nëse diçka nuk shkon. Çdo minutë ai kontrollon performancën e serverit dhe nëse serveri papritmas është i padisponueshëm, ai fillon të bërtasë, administratorët e shohin atë dhe sjellin serverin.

Ne gjithashtu mbledhim regjistrin e gabimeve nga regjistri. Gjithashtu asgjë e mbinatyrshme - ne thjesht mbledhim një regjistër gabimesh çdo tre orë, i dërgojmë ato në postë dhe i rishikojmë periodikisht. Kjo ndihmon për të parë problemet e zakonshme dhe disa lloj situatash të jashtëzakonshme. Nuk është e vështirë të lexosh postën tënde, të gjurmosh dhe të rregullosh shpejt gabimet. Por kjo ju lejon të identifikoni dhe zgjidhni shpejt problemet që mund të rriten me rritjen e bazave të të dhënave.

Një pikë tjetër e rëndësishme - sigurohuni që t'i jepni përdoruesit mundësinë për të "ankuar". Na përmirëson statusin në sytë e tyre dhe na shpëton. Ka përdorues, siç i quajmë ne, "histerikë", të cilët, në gabimin më të vogël, fillojnë të na dërgojnë një mori mesazhesh në postën tonë se asgjë nuk funksionon, baza e të dhënave nuk ngarkohet, gjithçka është tmerrësisht e keqe. Por ndonjëherë ata na shpëtojnë vërtet, sepse ndonjëherë gjejnë defekte të tilla që të tjerët për mrekulli nuk i kanë gjetur, defekte serioze.

Përdoruesi nuk mund të frikësohet. Jo mesazhe të frikshme, asgjë tjetër. Ata duhet të shpjegojnë gjithçka bukur dhe të ofrojnë të ankohen. Dhe ne premtojmë të zgjidhim gjithçka. Atëherë përdoruesit janë të lumtur, sepse shohin se janë të kujdesshëm dhe besojnë menjëherë se do të ndihmohen :)

Ky artikull është shkruar bazuar në rezultatet e raportit të lexuar në konferencën INFOSTART EVENT 2016 DEVELOPER. Më shumë artikuj mund të lexohen.

Në vitin 2020, i ftojmë të gjithë të marrin pjesë në 7 takime rajonale, si dhe në përvjetorin INFOSTART EVENT 2020 në Moskë.

Offline në të kaluarën, të qenit Online sot është një domosdoshmëri. Të paktën për botën moderne të biznesit. Prezantimet e produkteve dhe shërbimeve të markës, porositja dhe shpërndarja në internet, mbajtja e një baze klienti, komunikimi me klientët dhe shumë më tepër - e gjithë kjo është thjesht e pamundur pa një prani në internet. Nëse keni nevojë për një aplikacion, duhet të keni të dyja Front-end (ndërfaqja në internet) dhe Back-End (fundi i pasëm i aplikacionit tuaj). Dhe nëse doni të jeni në gjendje të redaktoni përmbajtjen e aplikacionit tuaj pa përfshirjen e zhvilluesve, ju duhet një panel i mirë administratori.

Ndërsa Front-end në hapësirën e aplikacionit celular është ndërtuar duke përdorur teknologji të tilla si X-Code dhe Java, Back-end, ku do të ruhet baza e të dhënave dhe e gjithë logjika e aplikacionit, kërkon njohuri profesionale të një gjuhe programimi nga ana e serverit. Një shembull i mirë është PHP, e cila është padyshim gjuha programuese më e njohur e përdorur për pothuajse çdo zhvillim nga ana e serverit. Ky është lideri i padiskutueshëm.

Ka shumë përdorime për PHP: faqe interneti statike dhe dinamike + sisteme të personalizuara të menaxhimit të përmbajtjes, media sociale, sisteme të specializuara CRM, softuer të tregtisë elektronike dhe më shumë. Sigurisht, ka pjesë të serverit dhe panele kontrolli falas ose të lira. Megjithatë, në shumë raste ato nuk ofrojnë nivelin e kërkuar të komoditetit, personalizimit dhe përmirësimit.

Programuesit tanë punojnë me teknologji për të zbatuar një gamë të gjerë zgjidhjesh për qëllime, nevoja dhe kërkesa të ndryshme biznesi. Ne analizojmë kërkesat e sistemit për çdo projekt individualisht dhe përdorim softuer të ndryshëm të specializuar të serverit për performancën optimale të aplikacionit tuaj celular.

Nëse jeni duke kërkuar për një ekip që mund t'ju çojë në zgjidhjen më të zgjuar dhe më ekonomike për ndërtimin e një aplikacioni nga e para, ose rindërtimin e një ekzistues për një përvojë të përsosur të përdoruesit, nuk keni më nevojë të kërkoni. Appsmob është gati t'ju ndihmojë të gjeni zgjidhjen më të mirë për ju.

Artikujt kryesorë të lidhur