iKonekt

Separació

La frontera que manté la base de dades, no el codi

Cada CRM afirma ser multiinquilí. L'afirmació és barata; el que importa és quina capa manté la línia. Si la resposta és «la nostra aplicació sempre afegeix el filtre correcte», llavors la garantia només és tan bona com el desenvolupador menys descansat que hagi escrit mai una consulta.

iKonekt va ser multiinquilí des de la seva primera migració en comptes d'adaptar-se després, cosa que sona a fanfarronada i és en realitat una admissió: adaptar-ho després és gairebé impossible de fer de manera convincent, i tothom que ho ha provat té una història.

La separació viu a la base de dades. Cadascuna de les vint-i-sis taules porta l'inquilí a qui pertany, i la política que ho comprova s'executa a cada lectura i cada escriptura, completament per sota de l'aplicació. Una consulta que oblida la frontera no retorna els clients d'algú altre. No retorna res.

Seguretat a nivell de fila, forçada

No és una convenció, ni una regla de revisió de codi. La base de dades es nega. Setanta-dues polítiques, escrites una a una en comptes de generades — perquè una política generada és una política que ningú no ha llegit.

Claus compostes

Un registre fill referencia el seu inquilí i el seu pare junts, com a parella. Un identificador extraviat de l'empresa equivocada no es resol — simplement no és una referència vàlida.

Cap inquilí per defecte, mai

Una petició sense àmbit no es converteix silenciosament en una petició per a l'inquilí zero. Falla abans d'arribar a la base de dades. No hi ha cap mode «sense àmbit» que es pugui oblidar de desactivar.

L'error que no es podia anunciar

Mentre es feia el treball de multiinquilinitat, la majoria d'errors eren sorollosos. Dona a dues empreses el mateix domini de client i la base de dades s'hi oposa immediatament, amb un codi d'error i una traça de pila; ho arregles abans de dinar.

Un no s'hi va oposar. Una taula de substitucions de prompts editables estava indexada només pel tipus del prompt — no per tipus i inquilí. Una segona empresa editant la seva còpia hauria sobreescrit silenciosament la de la primera empresa, amb SQL completament vàlid, sense error, sense avís, i sense cap test que fallés. Es va trobar llegint cada índex únic restant després de canviar una clau, un a un, amb la sospita que els sorollosos tenien companyia.

Ho mencionem perquè és la forma honesta d'aquesta feina. La separació no és una funcionalitat que s'activa; és un hàbit de llegir les parts avorrides de l'esquema assumint que alguna cosa allà no hi està d'acord amb tu.

Els tests, per si de cas: 942, executats contra una base de dades reconstruïda des de zero a cada canvi. No hi són per demostrar que el disseny és enginyós. Hi són perquè el mode de fallada d'aquest disseny concret és silenciós, i les fallades silencioses necessiten algú que cridi en nom seu.

Què compra la separació a una persona normal

  • Un grup pot gestionar diverses empreses des d'una sola instal·lació, i un venedor d'una no veurà mai un client d'una altra — no per política, sinó per construcció.
  • Un programa de socis, un conjunt de prompts, una reclamació sobre un client: tot amb àmbit per empresa, de manera que la configuració d'un inquilí no es pot convertir en la de tothom.
  • Una sol·licitud d'esborrat es compleix dins d'un límit, no en un conjunt compartit, i és precisament això el que permet respondre amb honestedat.
  • I ningú no ho ha de recordar. Aquest és el punt: una garantia que depèn de ser recordada no és una garantia.

Una línia més que no va de bases de dades

Cada servei germà de la família té la seva pròpia credencial amb nom. Res no parla amb una credencial compartida, així que cap servei no pot actuar accidentalment com un altre: una petita disciplina que ve directament d'haver tingut un token compartit i no haver-ho passat bé.

És el mateix instint que la regla de la base de dades. Fes que el que és incorrecte sigui impossible en lloc de desaconsellat, i dedicaràs la teva atenció als clients en lloc de a la vigilància.

El límitSota l'aplicació
  • 126 taulesCadascuna porta el seu inquilí, amb la comprovació forçada.
  • 272 polítiquesEscrites una per una, de manera que cadascuna ha estat llegida per una persona.
  • 3942 provesContra una base de dades reconstruïda des de zero, a cada canvi.
  • 40 inquilins per defecteUna sol·licitud sense àmbit mai no arriba a les dades.

Mesurat sobre la versió en producció

«La nostra aplicació sempre filtra per empresa.»

«Sempre» fa molta feina en aquesta frase.

Mou el límit cap avall, a la base de dades, i una clàusula WHERE oblidada no retorna res en lloc dels clients d'algú altre. Una pantalla buida és un fracàs millor que una presentació incòmoda.

Per a grups amb diverses marques →