iKonekt
Отворете конзолата

Разделяне

Границата, която пази базата данни, а не кодът

Всеки CRM твърди, че е multi-tenant. Твърдението е евтино; важното е кой слой държи линията. Ако отговорът е „нашето приложение винаги добавя правилния филтър“, то гаранцията е толкова добра, колкото най-недоспалият разработчик, който някога е писал заявка.

iKonekt е бил multi-tenant от първата си миграция, а не доустроен после — което звучи като похвала, а всъщност е признание: доустрояването е почти невъзможно да се направи убедително, и всеки, който е опитвал, има история.

Разделението живее в базата данни. Всяка от двадесет и шестте таблици носи tenant-а, на когото принадлежи, а политиката, която го проверява, се изпълнява при всяко четене и всеки запис, изцяло под приложението. Заявка, забравила границата, не връща чужди клиенти. Тя не връща нищо.

Защита на ниво ред, наложена

Не конвенция, не правило за код ревю. Базата данни отказва. Седемдесет и две политики, написани една по една, а не генерирани — защото генерираната политика е политика, която никой не е чел.

Съставни ключове

Дъщерен запис сочи своя tenant и своя родител заедно, като двойка. Чужд идентификатор от грешната компания не се разрешава — той просто не е валидна референция.

Никакъв tenant по подразбиране, никога

Заявка без обхват не се превръща тихо в заявка за tenant нула. Тя хвърля грешка, преди да стигне до базата данни. Няма режим „unscoped“, който да се забрави да се изключи.

Бъгът, който не можеше да се обяви

Докато се работеше по изолацията на наемателите, повечето грешки бяха шумни. Дадете на две компании един и същ клиентски домейн и обектите на базата данни веднага реагират — с код за грешка и stack trace; оправяте го преди обяд.

Една не възрази. Таблица с редактируеми презаписи на подсказки беше ключована само по вида на подсказката — не по вид и наемател. Втората компания, редактираща собственото си копие, би презаписала тихо копието на първата — чрез напълно валиден SQL, без грешка, без предупреждение и без провален тест. Открито беше, като след промяна на ключ бяха прочетени всички останали уникални индекси, един по един, по подозрението, че шумните имат компания.

Споменаваме го, защото това е честната форма на тази работа. Изолацията не е функция, която включвате; тя е навик да четете скучните части на схемата с предположението, че нещо там не е съгласно с вас.

Тестите, за протокола: 942 на брой, изпълнявани срещу база данни, изградена от нулата при всяка промяна. Те не са там, за да докажат, че дизайнът е умен. Те са там, защото режимът на отказ на този дизайн е тих, а тихите откази се нуждаят от някой, който да крещи вместо тях.

Какво дава изолацията на нормален човек

  • Група може да управлява няколко компании от една инсталация, а продавач в една от тях никога няма да види клиент на друга — не по политика, а по конструкция.
  • Партньорска програма, набор от подсказки, претенция към клиент — всичко е обхванато по компания, така че конфигурацията на един наемател не може да стане конфигурация на всички.
  • Заявка за изтриване се изпълнява в граница, а не върху обща купчина — именно това прави възможен честният отговор.
  • И никой не трябва да помни нищо от това. В това е смисълът — гаранция, която зависи от това да бъде помнена, не е гаранция.

Още един ред, който не е за базите данни

Всеки събрат-сървис в семейството притежава собствено именувано удостоверение. Нищо не говори със споделено такова, така че никой сървис не може случайно да действа като друг — малка дисциплина, родена директно от това някога да сме имали споделен токен и да не ни е било приятно.

Това е същият инстинкт като правилото за базата данни. Направете грешното невъзможно, а не само обезкуражено, и прекарвате вниманието си в клиенти, а не в бдителност.

ГраницатаПод приложението
  • 126 таблициВсяка носи своя наемател, с принудително включена проверка.
  • 272 политикиНаписани поотделно, така че всяка е била прочетена от човек.
  • 3942 тестаСрещу база данни, изградена от нулата, при всяка промяна.
  • 40 наематели по подразбиранеЗаявка без обхват никога не достига данните.

Измерено на живата компилация

„Нашето приложение винаги филтрира по компания.“

„Винаги“ върши много работа в това изречение.

Преместете границата надолу в базата данни и забравен WHERE клаузъл връща нищо, вместо клиентите на някой друг. Празен екран е по-добър отказ от неловко запознанство.

За групи, управляващи няколко марки →