
La meg fortelle en teknisk historie.
For mange Är siden utviklet jeg en applikasjon med innebygde samarbeidsfunksjoner. Det var en praktisk eksperimentell stabel, hvor hele potensialet til tidlig React og CouchDB ble utnyttet. Den synkroniserte data i sanntid via JSON. . Den ble brukt i selskapets interne arbeid, men den brede anvendeligheten og potensialet i andre omrÄder var Äpenbare.
Da vi forsÞkte Ä selge denne teknologien til potensielle kunder, stÞtte vi pÄ en uventet hindring. I demonstrasjonsvideoen sÄ teknologien vÄr flott ut og fungerte perfekt, uten problemer. Videoen viste nÞyaktig hvordan den fungerer, og ingenting ble simulert. Vi kom opp med og kodet et realistisk bruks-scenario for programvaren.

Det var faktisk dette som ble problemet. Demoen vÄr fungerte akkurat slik som alle andre som simulerte funksjonaliteten til applikasjonene sine. Spesielt ble informasjonen umiddelbart overfÞrt fra A til B, selv nÄr det gjaldt store mediefiler. Etter innlogging sÄ hver bruker nye oppfÞringer. Med applikasjonen kunne forskjellige brukere samarbeide presist om de samme prosjektene, selv nÄr internettforbindelsen var ustabil et sted pÄ landet. Det var implisitt underforstÄtt i enhver videopresentasjon om produktet laget i After Effects.
Selv om alle visste hva Refresh-knappen var til for, forsto ingen at nettapplikasjonene de ba oss om Ä lage ofte hadde sine egne begrensninger. Og at hvis de ikke lenger var nÞdvendige, ville brukeropplevelsen vÊre helt annerledes. Hovedsakelig la de merke til at de kunne "prate" og legge igjen merknader til hverandre, sÄ de begynte Ä spÞrre hva som skiller dette fra for eksempel Slack. Uff!
Design av daglig synchronisering
Hvis du allerede har erfaring med programvareutvikling, mĂ„ det irritere deg Ă„ huske at de fleste mennesker ikke kan se pĂ„ et bilde av grensesnittet og forstĂ„ hva det vil gjĂžre ved interaksjon. For ikke Ă„ snakke om hva som skjer innside selve programmet. Ă vite at finne ut at brukeren har deaktivert animasjons-effektene og dermed ogsĂ„ deaktivere ulike animasjonsmuligheter pĂ„ nettsiden, for eksempel fjerne skjelvingseffekten pĂ„ knapper som brukes for Ă„ tiltrekke seg oppmerksomhet; Ă„ skje â er i stor grad et resultat av kunnskap om hva som ikke kan skje og hva som ikke bĂžr skje. Dette krever ikke bare av hva programvaren gjĂžr, men ogsĂ„ av hvordan de enkelte delene er koordinert og kommuniserer med hverandre.
Et klassisk eksempel pÄ dette er en bruker som i lÞpet av tjue minutter stirrer pÄ spinner.gif, og undrer seg over nÄr arbeidet endelig vil bli fullfÞrt. Utvikleren ville ha forstÄtt at prosessen sannsynligvis har hengt seg opp, og at gif-en aldri vil forsvinne fra skjermen. Denne animasjonen imiterer arbeidsutfÞrelsen, men har ingen forbindelse med tilstanden til den. I slike tilfeller liker noen teknikere Ä rulle med Þynene, fascinert av graden av misforstÄelse blant brukerne. Men legg merke til, hvem av dem peker pÄ de roterende klokkene og sier at de faktisk stÄr stille?

Dette er essensen av verdien av sanntid. I dag blir databaser for sanntid fortsatt brukt svÊrt lite, og mange ser pÄ dem med mistillit. De fleste av disse databasene tenderer mot NoSQL-stil, noe som gjÞr at man vanligvis bruker lÞsninger basert pÄ Mongo, som det er best Ä glemme. Men for meg betyr dette komfort i arbeidet med CouchDB, samt Ä lÊre seg Ä designe strukturer som ikke bare en eller annen byrÄkrat vil klare Ä fylle med data. Jeg tror jeg bruker tiden min mer effektivt.
Men den virkelige temaen for dette innlegget er det jeg bruker i dag. Ikke av min egen valg, men pĂ„ grunn av en likegyldig og blindt anvendt bedrifts-politikk. Derfor vil jeg gi en Helt Ărlig og Upartisk sammenligning av to nĂŠrt beslektede produkter for arbeid med sanntids-databaser fra Google.

I begge navn finnes ordet Fire. Det ene husker jeg med Ăžmhet. Det andre for meg er en annen type ild. Jeg haster ikke med Ă„ si navnene deres, fordi sĂ„ snart jeg gjĂžr det, vil vi mĂžte det fĂžrste store problemet â navnene.
Det fĂžrste kalles Firebase Real-Time Database, og det andre â Firebase Cloud Firestore. Begge er produkter fra Firebase suite Google. Deres API-er kalles, henholdsvis, firebase.database(âŠ) og firebase.firestore(âŠ).
Det skjedde fordi Real-Time Database â det er bare den opprinnelige Firebase fĂžr det ble kjĂžpt av Google i 2014. Deretter bestemte Google seg for Ă„ lage en kopi som et parallelt produkt Firebase basert pĂ„ big data fra selskapet, og de kalte det Firestore med skybasert lagring. Jeg hĂ„per du ikke er blitt forvirret ennĂ„. Hvis du er det, ikke bekymre deg, jeg skrev denne delen av artikkelen ti ganger.
Fordi det er nÞdvendig Ä spesifisere Firebase i spÞrsmÄlet om Firebase, og Firestore i spÞrsmÄlet om Firebase, i det minste for at folk skulle forstÄ deg for noen Är siden pÄ Stack Overflow.
Hvis det fantes en pris for dÄrligst navngiving av programvareprodukter, ville dette definitivt vÊrt en seriÞs kandidat. Hamming-avstanden mellom disse navnene er sÄ liten at det forvirrer selv erfarne ingeniÞrer, som skriver ett navn selv om tankene deres tenker pÄ et annet. Dette er mislykkede planer, oppfunnet med de beste intensjoner; de oppfyller profetien om at databasen skulle brenne. Jeg tuller ikke. Personen som fant pÄ et slikt navngivningssystem, har forÄrsaket blod, svette og tÄrer.

Pyrrhussseier
Man skulle tro at Firestore er en erstatning for Firebase, dens etterfÞlger av neste generasjon, men det ville vÊrt en misforstÄelse. Firestore kan absolutt ikke betraktes som en erstatning for Firebase. Det ser ut til at noen har kuttet ut alt det interessante fra det, og forvirret det meste av det som er igjen pÄ forskjellige mÄter.
Men et raskt blikk pÄ de to produktene kan forvirre deg: det ser ut til at de gjÞr det samme, gjennom stort sett de samme API-ene og til og med i den samme datasettet. Forskjellene er subtile og oppdages kun ved nÞye sammenligning av den omfattende dokumentasjonen. Eller nÄr du prÞver Ä portere perfekt fungerende kode fra Firebase for Ä fÄ det til Ä fungere med Firestore. Allerede da oppdager du at databasegrensesnittet lyser opp sÄ snart du prÞver Ä gjÞre drag-and-drop i sanntid med musa. Jeg gjentar, jeg tuller ikke.
Firebase-klienten er vennlig i den forstand at den bufferer endringer og utfÞrer automatiske gjentakelsesforsÞk pÄ oppdateringer, der den gir prioritet til den sist utfÞrte skriveoperasjonen. Imidlertid har Firestore en begrensning pÄ 1 skriveoperasjon per dokument per bruker per sekund, og denne begrensningen hÄndheves av serveren. NÄr du jobber med det, mÄ du selv finne en mÄte Ä omgÄ dette pÄ og implementere en hastighetsbegrensning for oppdateringer, selv nÄr du bare prÞver Ä lage applikasjonen din. Med andre ord er Firestore en sanntidsdatabase uten en sanntidsklient, som forkles som en selv med API.
Her begynner vi Ä se de fÞrste tegnene pÄ meningen med Firestore. Kanskje tar jeg feil, men jeg mistenker at noen hÞyt oppe i ledelsen hos Google etter oppkjÞpet sÄ pÄ Firebase og bare sa: «Nei, Gud nei. Dette er uakseptabelt. Ikke under min ledelse.»

Han kom ut fra sine kammer og proklamerte:
«Ăn stor JSON-dokument? Nei. Du mĂ„ dele opp dataene i separate dokumenter, hver med en stĂžrrelse pĂ„ ikke mer enn 1 megabyte.»
Det virker som en slik begrensning ikke vil overleve fÞrste mÞte med en hvilken som helst tilstrekkelig motivert brukerbase. Du vet at det er sant. Hos oss pÄ jobben, for eksempel, har vi over 1500 presentasjoner, og det er helt normalt.
Med en slik begrensning mÄ du akseptere at ett «dokument» i databasen ikke vil ligne noe objekt som brukeren mÄtte kalle et dokument.
«Arrays av arrays, som kan inneholde andre elementer rekursivt? Nei. Arrays vil bare inneholde objekter eller tall med fast lengde, som opprinnelig ment av Skaperen.»
SÄ hvis du hÄpet Ä plassere GeoJSON i din Firestore, vil du oppdage at det er umulig. Det er ikke tillatt Ä ha noe ikke-en-dimensjonalt. Jeg hÄper du liker Base64 og/eller JSON inne i JSON.
«Import og eksport av JSON via HTTP, kommandolinjeverktÞy eller administrasjonspanel? Nei. Du kan bare eksportere og importere data i Google Cloud Storage. SÄnn ser det ut for Þyeblikket. Og nÄr jeg sier 'du', mener jeg bare de som har myndighet som Project Owner. Alle andre kan gÄ og opprette billetter.»
Som du kan se, er Firebase-datamodellen lett Ă„ beskrive. Den inneholder ett stort JSON-dokument som kobler JSON-nĂžkler med URL-stier. Hvis du skriver inn ved hjelp av HTTP PUT i / Firebase fĂžlgende:
{
"hello": "world"
} Da GET /hello vil returnere "world". Generelt fungerer dette akkurat som du forventer. Firebase-samlingen av objekter /my-collection/:id er ekvivalent med et JSON-ordbok {"my-collection": {...}} i roten, innholdet som er tilgjengelig i /my-collection:
{
"id1": {...object},
"id2": {...object},
"id3": {...object},
\// ...
}Dette fungerer utmerket hvis hver innsats har ID-er uten kollisjoner, noe systemet har en standardlĂžsning for.
Med andre ord er databasen 100 % kompatibel med JSON (*) og fungerer utmerket med HTTP, for eksempel med CouchDB. Men hovedsakelig bruker du den gjennom et sanntids-API som abstraherer websockets, autorisering og abonnementer. Administrasjonspanelet har begge muligheter, som lar deg redigere i sanntid og importere/eksportere JSON. Hvis du holder deg til det samme i koden din, vil du bli overrasket over hvor mye spesialisert kode som forsvinner nÄr du forstÄr at patch og diff JSON lÞser 90 % av de rutinemessige oppgavene knyttet til hÄndtering av permanent tilstand.
Firestore-datamodellen ligner pÄ JSON, men avviker fra den i noen kritiske aspekter. Jeg har allerede nevnt fravÊret av arrays inne i arrays. Sub-collections-modellen er slik at de er fÞrstklassige konsepter, adskilt fra det inneholdende JSON-dokumentet. Siden det ikke finnes noen klar serialisering for dette, kreves det en spesialisert kodekjÞring for Ä hente og skrive data. For Ä hÄndtere egne samlinger mÄ det skrives egne skripter og verktÞy. Administrasjonspanelet lar deg bare gjÞre smÄ endringer ett felt om gangen, og har ingen import-/eksportfunksjoner.
De tok en sanntids NoSQL-database og gjorde den til en sakte ikke-SQL med automatisk sammenslÄing og en separat kolonne for ikke-JSON. Noe i stil med GraftQL.

Hot Java
Hvis Firestore skulle bli mer pÄlitelig og skalerbart, er ironien at den gjennomsnittlige utvikleren fÄr en mindre pÄlitelig lÞsning enn ved Ä velge FireBase "rett ut av boksen". Programvaren som den Pirkete Databasesjefen trenger, krever et slikt nivÄ av innsats og kaliber av spesialister, at det rett og slett ikke er realistisk for nisjen der det antas at et godt produkt skal vÊre. Det er litt som at HTML5 Canvas absolutt ikke er en erstatning for Flash, hvis det ikke finnes utviklingsverktÞy og avspillere. Dessuten er Firestore dÞmt til Ä streve for datarenslighet og steril validering, noe som rett og slett ikke samsvarer med hvordan den gjennomsnittlige bedriftsbrukeren liker Ä arbeide: fordi for ham er alt valgfritt, ettersom alt er et utkast helt til slutten.
Den stÞrste begrensningen med FireBase er at klienten ble laget flere Är fÞr sin tid, lenge fÞr de fleste webutviklere visste om immutabilitet. PÄ grunn av dette antar FireBase at du vil endre data, og dermed utnytter ikke fordelene ved brukerskapt immutabilitet. I tillegg bruker den ikke dataene pÄ nytt i sendte snapshots til brukeren, noe som gjÞr diff-utfÞrelse mye vanskeligere. For store dokumenter er dens transaksjonsmekanisme basert pÄ endrede diffs helt utilstrekkelig. Folkens, vi har allerede WeakMap det i JavaScript. Det er praktisk.
Hvis man former dataene pÄ riktig mÄte og ikke lager trÊrne for omfattende, kan man omgÄ dette problemet. Men jeg er nysgjerrig pÄ om FireBase ville blitt mye mer interessant dersom utviklerne hadde gitt ut et virkelig godt klient-API som bruker immutabilitet i kombinasjon med seriÞse praktiske rÄd om databasens struktur. I stedet ser det ut til at de har prÞvd Ä fikse noe som ikke er Þdelagt, og det har blitt verre.
Jeg kjenner ikke all logikk som lÄ til grunn for opprettelsen av Firestore. Resonnementene rundt motivene som oppstÄr inne i en svart boks - det er ogsÄ en del av underholdningen. En slik sammenligning av to ekstremt like, men uimotstÄelige databaser oppstÄr ganske sjelden. Som om noen tenkte: "Firebase er bare en funksjon som vi kan emulere i Google Cloud", men har ennÄ ikke oppdaget konseptet med Ä definere krav fra den virkelige verden eller Ä lage nyttige lÞsninger som oppfyller alle disse kravene. «La utviklerne tenke pÄ det. Bare gjÞr UI-en vakker... Kan vi legge til mer fyr?»
Jeg forstÄr et par ting om datakonstruksjoner. Jeg ser helt klart at konseptet med «alt i ett stort JSON-tre» er et forsÞk pÄ Ä abstrahere enhver fÞlelse av stor-skala-struktur fra databasen. à forvente at programvaren bare skal hÄndtere hvilken som helst tvilsom fraktal av datakonstruksjoner er bare galskap. Jeg trenger ikke engang Ä forestille meg hvor ille det kan vÊre; jeg har gjennomfÞrt strenge kodeauditter og sett ting som dere mennesker ikke engang kan drÞmme om.. Men jeg vet ogsÄ hvordan gode strukturer ser ut, og Jeg kan forestille meg en verden der Firestore ville virke helt logisk, og menneskene som laget den ville trodd at de hadde gjort en god jobb. Men vi lever ikke i denne verden.
StÞtten for Ä bygge forespÞrselen i FireBase er dÄrlig etter enhver standard; den eksisterer sÄ og si ikke. Den trenger absolutt forbedring, eller i det minste en revisjon. Men Firestore er ikke mye bedre, siden den er begrenset av de samme en-dimensjonale indeksene som finnes i enkel SQL. Hvis du trenger forespÞrslene som folk gjÞr med kaotiske data, sÄ kreves det fulltekstsÞk, filtre pÄ flere omrÄder og vilkÄrlig rekkefÞlge direkte av brukeren. NÄr man ser nÞye pÄ den enkle SQL-funksjonen, er den i seg selv for begrenset. I tillegg er de eneste SQL-forespÞrslene som folk kan utfÞre i produksjon, raske forespÞrslene. Du vil trenge en spesialdesignet lÞsning for indeksering med gjennomtenkte datakonstruksjoner. For alt annet, bÞr det i det minste vÊre inkrementell map-reduce eller noe lignende.
Hvis du leter etter informasjon om dette i Googles dokumenter, hÄper jeg du blir peket i retning av noe som BigTable og BigQuery. Men alle disse lÞsningene er akkompagnert av en mengde tett salgssprÄk, slik at du raskt vil gÄ tilbake og begynne Ä lete etter noe annet.
Det siste du trenger i tilfelle en sanntidsdatabase, er noe skapt av mennesker og for mennesker som jobber pÄ en lÞnnsskala for ledere.
(*) Dette er en spĂžk, det finnes ikke et begrep som .
Advertising
Ser du etter en server for debugging av prosjekter og hosting? Da er du virkelig vĂ„r kunde đ Daglig betaling for servere i forskjellige konfigurasjoner, antiDDoS og Windows-lisenser er allerede inkludert i prisen.
Kilde: habr.com
