
LÄt mig berÀtta en teknisk historia.
För mÄnga Är sedan utvecklade jag en applikation med inbyggda samarbetsfunktioner. Det var en bekvÀm experimentell stack som utnyttjade den fulla potentialen hos tidig React och CouchDB. Den synkroniserade data i realtid via JSON. . Den anvÀndes i företagets interna arbete, men det var uppenbart att dess breda tillÀmpbarhet och potential i andra omrÄden var tydlig.
NÀr vi försökte sÀlja denna teknik till potentiella kunder stötte vi pÄ ett ovÀntat hinder. I demovideon sÄg vÄr teknik ut att fungera utmÀrkt, och det fanns inga problem hÀr. Videon visade exakt hur det fungerade, och inget simulerades. Vi kom pÄ och kodade ett realistiskt anvÀndningsscenario för programmet.

Problemet blev faktiskt just detta. VÄr demo fungerade precis som alla andra som simulerade funktionerna i sina applikationer. Specifikt, informationen överfördes omedelbart frÄn A till B, Àven om det handlade om stora mediafiler. Efter inloggning sÄg varje anvÀndare nya poster. Med hjÀlp av applikationen kunde olika anvÀndare samarbeta tydligt pÄ samma projekt, Àven om internetanslutningen avbröts nÄgonstans i byn. Detta underförstÄtt Àr vad som visas i vilket klipp som helst som klippts i After Effects om produkten.
Trots att alla visste vad knappen Refresh var bra för, förstod ingen vad webbtjÀnsterna de bad oss skapa vanligtvis var begrÀnsade av. Och att om de inte lÀngre behövdes skulle anvÀndarupplevelsen se helt annorlunda ut. Oftast mÀrkte de att man kunde 'chatta' och lÀmna meddelanden till andra, sÄ de undrade vad som skiljde sig frÄn exempelvis Slack. Uff!
Design av vardagliga synkroniseringar
Om du redan har erfarenhet av mjukvaruutveckling mĂ„ste det irritera dig att komma ihĂ„g att de flesta mĂ€nniskor inte kan ta en titt pĂ„ en skĂ€rmbild av grĂ€nssnittet och förstĂ„ vad det kommer att göra nĂ€r de interagerar med det. För att inte tala om vad som pĂ„gĂ„r inuti sjĂ€lva programmet. Kunskapen om vad hantera plötsliga kraschar och visa anvĂ€ndbara detaljer för felsökning, som stacktrace. Att skicka felmeddelanden har förenklats â det rĂ€cker att klicka pĂ„ lĂ€nken. som kan hĂ€nda Ă€r till stor del resultaten av kunskapen om vad som inte kan hĂ€nda och vad som inte bör hĂ€nda. Detta krĂ€vs. inte bara vad programvaran gör, utan ocksĂ„ hur dess olika delar samverkar och kommunicerar.
Ett klassiskt exempel pÄ detta Àr en anvÀndare som under tjugo minuter tittar pÄ spinner.gif, och undrar nÀr arbetet Àntligen kommer att slutföras. Utvecklaren skulle ha förstÄtt att processen troligen har frusit, och att gif:en aldrig kommer att försvinna frÄn skÀrmen. Denna animation imiterar ett arbete, men Àr inte kopplad till dess tillstÄnd. I sÄdana fall brukar vissa tekniker rulla med ögonen, förvÄnade över hur vilseledda anvÀndarna Àr. Men mÀrk vem av dem som pekar pÄ de snurrande klockorna och sÀger att de faktiskt stÄr stilla?

Det Àr kÀrnan i vÀrdet av realtid. Idag anvÀnds realtidsdatabaser fortfarande mycket lite, och mÄnga Àr misstÀnksamma mot dem. De flesta sÄdana databaser lutar sig aktivt mot NoSQL-stilen, vilket gör att man ofta anvÀnder lösningar baserade pÄ Mongo, som det Àr bÀst att glömma. Men för mig betyder det en bekvÀm arbetsmiljö med CouchDB, samt att studera design av strukturer som inte bara en byrÄkrat kan fylla med data. Jag tror att jag anvÀnder min tid mer effektivt.
Men Ă€mnet för detta inlĂ€gg Ă€r vad jag faktiskt anvĂ€nder idag. Inte av eget val, utan pĂ„ grund av en likgiltig och blindt tillĂ€mpad företagsstrategi. DĂ€rför kommer jag att ge en Helt Ărlig och Opartisk jĂ€mförelse av tvĂ„ nĂ€ra relaterade produkter för att arbeta med realtidsdatabaser frĂ„n Google.

I bĂ„da namnen finns ordet Fire. Det ena minns jag med ömhet. Det andra för mig Ă€r en annan typ av eld. Jag skyndar mig inte att sĂ€ga deras namn, eftersom sĂ„ snart jag gör det, kommer vi att möta det första stora problemet â namnen.
Den första heter Firebase Real-Time Database, och den andra â Firebase Cloud Firestore. BĂ„da Ă€r produkter frĂ„n Firebase suite Google. Deras API:er heter, respektive, firebase.database(âŠ) och firebase.firestore(âŠ).
Det hÀnde sÄ att Real-Time Database Àr helt enkelt originalet Firebase innan dess köptes av Google 2014. DÀrefter beslutade Google att skapa en parallell produkt som en kopia av Firebase baserat pÄ företagets big data, och kallade den Firestore with a cloud. Jag hoppas att du inte blivit förvirrad. Om du trots allt har blivit förvirrad, oroa dig inte, jag har sjÀlv skrivit om denna del av artikeln tio gÄnger.
För det Àr viktigt att pÄpeka Firebase i frÄga om Firebase, och Firestore i frÄga om Firebase, Ätminstone för att ni skulle bli förstÄdda för nÄgra Är sedan pÄ Stack Overflow.
Om det fanns ett pris för den sÀmsta namngivningen av programvaruprodukter, skulle detta fall definitivt vara en av pristagarna. Hamming-avstÄndet mellan dessa namn Àr sÄ litet att det förvirrar Àven erfarna ingenjörer vars fingrar skriver ett namn medan huvudet tÀnker pÄ ett annat. Det hÀr Àr misslyckade planer som skapades med de bÀsta avsikter; de har uppfyllt profetian om att databasen skulle vara i brand. Och jag skÀmtar inte. Personen som kom pÄ ett sÄdant namngivningssystem har orsakat blod, svett och tÄrar.

Pyrrhusseger
Man skulle kunna tro att Firestore Àr en ersÀttning för Firebase, dess efterföljare i nÀsta generation, men det skulle vara en missuppfattning. Firestore passar garanterat inte som en ersÀttning för Firebase. Det verkar som om nÄgon har skurit bort allt intressant frÄn det och förvirrat stor del av det kvarvarande pÄ olika sÀtt.
Dock kan en snabb blick pÄ de tvÄ produkterna lura dig: det verkar som om de gör ungefÀr samma sak, genom för det mesta liknande API och till och med i samma databas-session. Skillnaderna Àr svÄra att upptÀcka och mÀrks först vid noggrant jÀmförande studier av omfattande dokumentation. Eller nÀr man försöker portera perfekt fungerande Firebase-kod sÄ att den fungerar med Firestore. Redan dÄ upptÀcker du att databasgrÀnssnittet glöder sÄ snart du försöker utföra drag-and-drop i realtid. Jag upprepar, jag skÀmtar inte.
Firebase-klienten Àr artig i den bemÀrkelsen att den buffrar Àndringar och gör automatiska omförsök för uppdateringar, dÀr den senaste skrivoperationen prioriteras. Men Firestore har en begrÀnsning pÄ 1 skrivoperation per dokument per anvÀndare per sekund, och denna begrÀnsning tillÀmpas av servern. NÀr du arbetar med den mÄste du sjÀlv hitta sÀtt att kringgÄ den och implementera en skopbegrÀnsare för uppdateringar, Àven nÀr du bara försöker skapa din applikation. Det vill sÀga Firestore Àr en databas för realtid utan en klient för realtid, som maskerar sig sjÀlv som en med hjÀlp av API.
HÀr börjar vi se de första tecknen pÄ syftet med Firestore. Kanske har jag fel, men jag misstÀnker att nÄgon högt upp i Googles ledning sÄg pÄ Firebase efter köpet och bara sa: "Nej, herregud, nej. Det hÀr Àr oacceptabelt. Inte under min ledning."

Han kom ut frÄn sina rum och utropade:
âEn stor JSON-dokument? Nej. Du kommer att dela upp data i separata dokument, var och en med en storlek pĂ„ högst 1 megabyte.â
Det verkar som en sÄdan begrÀnsning inte kommer att överleva det första mötet med en tillrÀckligt motiverad anvÀndarbas. Du vet att det Àr sant. PÄ vÄrt arbete, till exempel, har vi drygt ett och ett halvt tusen presentationer, och det Àr Helt Normalt.
Med en sÄdan begrÀnsning kommer du att behöva acceptera faktum att ett "dokument" i databasen inte kommer att likna nÄgot objekt som en anvÀndare skulle kalla ett dokument.
âArray av arrayer som kan rekursivt innehĂ„lla andra element? Nej. Arrayer kommer endast att innehĂ„lla objekt eller fasta lĂ€ngdnummer, precis som Herren avsĂ„g.â
SÄ om du hoppades att kunna placera GeoJSON i din Firestore, kommer du att upptÀcka att det Àr omöjligt. Inga icke-en-dimensionella element Àr tillÄtna. Jag hoppas att du gillar Base64 och/eller JSON inuti JSON.
âImport och export av JSON via HTTP, kommandoradsverktyg eller adminpanel? Nej. Du kan endast exportera och importera data i Google Cloud Storage. SĂ„ verkar det nu heta. Och nĂ€r jag sĂ€ger "du", riktar jag mig endast till dem som har befogenheter som ProjektĂ€gare. Alla andra kan gĂ„ och skapa biljetter.â
Som ni ser, Àr FireBases datamodell lÀtt att beskriva. Den innehÄller ett enormt JSON-dokument som kopplar JSON-nycklar till URL-vÀgar. Om du skriver med HTTP PUT pÄ / FireBase följande:
{
"hello": "world"
} DÄ GET /hello kommer att returnera "world". I huvudsak fungerar det precis som du förvÀntar dig. Samlingen av FireBase-objekt /my-collection/:id Àr likvÀrdig med en JSON-dictionary {"my-collection": {...}} i roten, vars innehÄll Àr tillgÀngligt i /my-collection:
{
"id1": {...object},
"id2": {...object},
"id3": {...object},
// ...
}Det fungerar utmÀrkt om varje insÀttning har ID utan kollisioner, för vilket det finns en standardlösning i systemet.
Med andra ord Àr databasen 100 % kompatibel med JSON (*) och fungerar utmÀrkt med HTTP, som exempelvis CouchDB. Men frÀmst anvÀnder du den via ett realtids-API som abstraherar websockets, autentisering och prenumerationer. Administrationspanelen har bÄda funktionerna, vilket gör det möjligt att bÄde redigera i realtid och importera/exportera JSON. Om du följer samma mönster i din kod kommer du att bli förvÄnad över hur mycket specialiserad kod som försvinner nÀr du inser att patch och diff JSON löser 90 % av de rutinmÀssiga uppgifterna för att hantera det permanenta tillstÄndet.
Firestore datamodell liknar JSON, men skiljer sig frÄn det pÄ nÄgra kritiskt viktiga punkter. Jag har redan nÀmnt avsaknaden av arrayer inom arrayer. Sub-kollektioner Àr koncept av första klass, separata frÄn sitt innehÄllande JSON-dokument. Eftersom det inte finns nÄgon fÀrdig serialisering för detta, krÀvs en specialiserad kodkörningsvÀg för att hÀmta och skriva data. För att hantera egna kollektioner mÄste du skriva egna skript och verktyg. Administrationspanelen tillÄter dig att göra smÄ Àndringar ett fÀlt i taget och har inga import/export-funktioner.
De tog en realtids NoSQL-databas och gjorde den till en lÄngsam icke-SQL med auto-sammanslagning och en separat kolumn som inte Àr JSON. NÄgot i stil med GraftQL.

Het Java
Om Firestore skulle bli mer pÄlitligt och skalbart, Àr ironin att den genomsnittliga utvecklaren fÄr en mindre pÄlitlig lösning Àn om man vÀljde Firebase "ur lÄdan". Den programvara som den Grinande Databasadministratören behöver krÀver en sÄdan nivÄ av insats och kompetens att det helt enkelt Àr orealistiskt för en nisch dÀr man förvÀntar sig en bra produkt. Det Àr som att HTML5 Canvas inte pÄ nÄgot sÀtt kan ersÀtta Flash utan utvecklingsverktyg och spelare. Dessutom har Firestore drabbats av en besatthet av datarenslighet och steril validering som helt enkelt inte matchar hur en genomsnittlig affÀrsanvÀndare föredrar att arbeta: för honom Àr ingenting nödvÀndigt, eftersom allt till slut Àr ett utkast.
Den största nackdelen med FireBase Àr att klienten skapades flera Är tidigare Àn planerat, lÄngt innan de flesta webbutvecklare kÀnde till immutabilitet. DÀrför förutsÀtter FireBase att du kommer att förÀndra data, och utnyttjar inte fördelarna med anvÀndarens immutabilitet. Dessutom ÄteranvÀnder den inte data i de snapshots som skickas till anvÀndaren, vilket gör det mycket svÄrare att utföra diff. För stora dokument Àr dess transaktionsmekanism baserad pÄ förÀnderliga diff helt enkelt otillrÀcklig. Vi har ju redan WeakMap i JavaScript. Det Àr bekvÀmt.
Om man ger data rÀtt form och inte gör trÀden för omfattande, kan man kringgÄ detta problem. Men jag undrar om FireBase skulle bli mycket mer intressant om utvecklarna slÀppte en verkligt bra klient-API som anvÀnde immutabilitet i kombination med seriös praktisk vÀgledning om databasstruktur. IstÀllet verkar de ha försökt fixa nÄgot som inte Àr trasigt, och det har blivit sÀmre.
Jag kÀnner inte till all logik som lÄg bakom skapandet av Firestore. Funderingar om motivationer som uppstÄr inom en svart lÄda Àr ocksÄ en del av underhÄllningen. SÄdan kontrast mellan tvÄ extremt liknande men oför jÀmförbara databaser Àr ganska sÀllsynt. Som om nÄgon tÀnkte: «Firebase Àr bara en funktion som vi kan emulera i Google Cloud», men samtidigt inte har förstÄtt konceptet att definiera verkliga krav eller skapa anvÀndbara lösningar som uppfyller alla dessa krav. «LÄt utvecklarna tÀnka pÄ det. Gör bara UI:t snyggt... Kan vi lÀgga till mer eld?»
Jag förstÄr nÄgra saker om datastrukturer. Jag ser tydligt att konceptet "allt i ett stort JSON-trÀd" Àr ett försök att avskilja databasen frÄn en kÀnsla av stor skala. Att förvÀnta sig att mjukvaran bara klarar av en tveksam fraktal av datastrukturen Àr ren galenskap. Jag behöver inte ens förestÀlla mig hur illa allt kan bli, jag har gjort strikta kodgranskningar och sett saker som ni mÀnniskor inte ens kan drömma om. Men jag vet ocksÄ hur bra strukturer ser ut, och Jag kan förestÀlla mig en vÀrld dÀr Firestore skulle verka fullt logisk, och de som skapade den skulle tro att de hade gjort ett gott arbete. Men vi lever inte i denna vÀrld.
Stödet för att bygga frÄgor i FireBase Àr dÄligt enligt vilken standard som helst, det finns nÀstan inget. Det krÀver definitivt förbÀttring eller Ätminstone en översyn. Men Firestore Àr inte mycket bÀttre, eftersom den Àr begrÀnsad till de samma endimensionella index som finns i enkel SQL. Om du behöver frÄgor som mÀnniskor utför med kaotiska data, sÄ behövs fulltextsökning, filter pÄ flera intervall och en godtycklig anvÀndardefinierad ordning. Vid noggrann granskning Àr funktionerna i enkel SQL sjÀlva för begrÀnsade. Dessutom Àr de enda SQL-frÄgor som mÀnniskor kan utföra i produktion snabba frÄgor. Du kommer att behöva en specialanpassad lösning för indexing med genomtÀnkta datastrukturer. För allt annat bör det Ätminstone finnas en inkrementell map-reduce eller nÄgot liknande.
Om du söker information om detta i Googles dokumentation, hoppas jag att du blir hÀnvisad till nÄgot som BigTable och BigQuery. Men alla dessa lösningar Ätföljs av en mÀngd tjock företagsjargong, sÄ du kommer snabbt att ÄtervÀnda och börja söka efter nÄgot annat.
Det sista du behöver i en realtidsdatabas Àr nÄgot som skapats av mÀnniskor och för mÀnniskor som arbetar enligt löneskala för ledningen.
(*) Det Àr ett skÀmt, det finns inget begrepp som .
I reklamens namn
Letar du efter en server för utveckling och hosting av projekt? DĂ„ Ă€r du precis vĂ„r kund đ DygnsprissĂ€ttning för servrar av olika konfigurationer, antiDDoS och Windows-licenser ingĂ„r redan i priset.
KĂ€lla: habr.com
