iKonekt

Oddělení

Hranice, kterou drží databáze, nikoli kód

Každý CRM tvrdí, že je multi-tenant. Tvrzení je levné; záleží na tom, která vrstva drží linii. Pokud je odpověď „naše aplikace vždy přidá správný filtr“, pak je záruka jen tak dobrá, jako nejméně vyspalý vývojář, který kdy napsal dotaz.

iKonekt byl multi-tenant od své první migrace, nikoli zpětně dodělaný, což zní jako chlouba, ale ve skutečnosti je to přiznání: dodělávat to zpětně je téměř nemožné udělat věrohodně a každý, kdo to zkusil, má svůj příběh.

Oddělení žije v databázi. Každá z šestadvaceti tabulek nese tenanta, ke kterému patří, a zásada, která to kontroluje, běží při každém čtení i zápisu, zcela pod aplikací. Dotaz, který zapomene hranici, nevrací cizí zákazníky. Nevrací nic.

Zabezpečení na úrovni řádků, vynucené

Ne konvence, ne pravidlo kódové revize. Databáze to odmítá. Sedmdesát dva zásad, napsaných jedna po druhé, nikoli generovaných — protože generovaná zásada je zásada, kterou nikdo nečetl.

Složené klíče

Řádkový záznam odkazuje na svého tenanta a zároveň na svého nadřazeného záznamu, jako pár. Cizí identifikátor od nesprávné společnosti se nevyřeší — prostě není platným odkazem.

Žádný výchozí tenant, nikdy

Požadavek bez rozsahu se nepotichu nestane požadavkem na tenanta nula. Selže dříve, než dosáhne databáze. Neexistuje žádný režim „bez rozsahu“, který by šlo zapomenout vypnout.

Chyba, která se nemohla ohlásit

Během práce na víceuživatelskosti byla většina chyb hlasitá. Dejtete dvěma společnostům stejnou doménu zákazníka a databáze okamžitě vznese námitku, s kódem chyby a stack tracem; opravíte to před obědem.

Jedna nenamítla. Tabulka upravitelných přepisů promptů byla klíčová pouze podle druhu promptu — nikoli podle druhu a tenanta. Druhá společnost upravující svou vlastní kopii by potichu přepsala kopii první společnosti, zcela platným SQL, bez chyby, bez varování a bez selhávajícího testu. Byla nalezena přečtením každého zbývajícího unikátního indexu po změně klíče, jeden po druhém, z podezření, že i ty hlasité měly společnost.

Zmiňujeme to, protože to je čestná podoba této práce. Oddělení není funkce, kterou zapnete; je to návyk číst nudné části schématu s předpokladem, že vám tam něco odporuje.

Testy, pro úplnost: 942 z nich, spouštěných proti databázi znovu vybudované od nuly při každé změně. Nejsou tu, aby prokázaly, že je návrh chytrý. Jsou tu proto, že způsob selhání tohoto konkrétního návrhu je tichý, a tichá selhání potřebují někoho, kdo za ně zakřičí.

Co oddělení dává obyčejnému člověku

  • Skupina může provozovat několik společností z jedné instalace a obchodník v jedné nikdy neuvidí zákazníka jiné — nikoli politikou, ale konstrukcí.
  • Partnerský program, sada promptů, nárok na zákazníka: vše s rozsahem podle společnosti, takže konfigurace jednoho tenanta se nemůže stát konfigurací všech.
  • Žádost o výmaz je splněna v rámci hranice, nikoli napříč sdílenou hromadou, což umožňuje odpovědět upřímně.
  • A nikdo na to nemusí myslet. To je smysl — záruka, která závisí na tom, že se na ni pamatuje, není zárukou.

Ještě jeden řádek, který není o databázích

Každá služba v rodině drží vlastní pojmenovaný přístupový údaj. Nikdo nemluví sdíleným, takže žádná služba nemůže omylem jednat jako jiná — malá disciplína, která vzešla přímo z toho, že jsme sdílený token kdysi měli a neužívali si to.

Je to stejný instinkt jako pravidlo databáze. Učiňte nesprávnou věc nemožnou, nikoli odrazovanou, a věnujete pozornost zákazníkům místo ostražitosti.

HranicePod aplikací
  • 126 tabulekKaždá nese svého tenanta, s vynucenou kontrolou.
  • 272 zásadNapsaných jednotlivě, takže každou přečetl člověk.
  • 3942 testůProti databázi znovu vybudované od nuly, při každé změně.
  • 40 výchozích tenantůPožadavek bez rozsahu se nikdy nedostane k datům.

Měřeno na ostré verzi

„Naše aplikace vždy filtruje podle firmy.“

To „vždy“ v té větě dělá hodně práce.

Přesuňte hranici dolů do databáze a zapomenutá klauzule WHERE nevrátí nic místo cizích zákazníků. Prázdná obrazovka je lepší selhání než nepříjemné seznámení.

Pro skupiny provozující více značek →