隔離
條界係資料庫守住,唔係程式碼
個個CRM都聲稱自己支援多租戶。講呢句嘢好平;真正重要嘅係邊一層喺度守條線。如果答案係「我哋個應用程式永遠都會加返個啱嘅過濾條件」,咁個保證就只係同寫過查詢嘅最攰嗰個開發者一樣可靠。
iKonekt由第一次資料庫遷移開始就已經係多租戶,唔係之後先至改裝上去。聽落好似自誇,其實係一個承認:事後先至改裝,基本上冇可能做得有說服力,而試過嘅人個個都有故事講。
分隔係住喺資料庫入面。二十六張表,每一張都帶住自己屬於邊個租戶,而檢查嘅政策喺每一次讀取同寫入都會執行,完全喺應用程式之下。一條忘記咗條界嘅查詢,唔會返到第間公司嘅客。佢乜都唔會返。
資料列級安全,強制執行
唔係慣例,唔係code review規則。係資料庫拒絕。七十二條政策,一條一條手寫出嚟而唔係自動產生——因為自動產生嘅政策,係冇人會睇過嘅政策。
複合鍵
子紀錄會同時引用自己嘅租戶同埋母紀錄,兩樣一齊做一對。一個嚟自錯公司嘅流浪識別碼係解析唔到嘅——佢根本就唔係一個有效嘅引用。
永遠冇預設租戶
一個冇帶範圍嘅請求,唔會靜靜雞變成租戶零嘅請求。佢喺去到資料庫之前就已經擲錯。亦都冇一個「唔設範圍」模式俾你忘記咗關。
嗰個冇可能自己出聲嘅bug
做租戶隔離嗰陣,大部分錯誤都係嘈住出嚟嚟嘅。俾兩間公司同一個客戶 domain,資料庫物件即刻報錯,有錯誤碼同 stack trace;你食晏之前就搞掂。
有一個冇出聲。一張可編輯 prompt 覆寫表,key 只係用 prompt 種類——唔係種類加租戶。第二間公司改佢自己嗰份,會靜靜雞覆寫咗第一間公司嗰份,用嘅係完全合法嘅 SQL,冇錯誤、冇警告、冇測試失敗。係靠改完一個 key 之後,逐個逐個讀晒淨低嘅 unique index,懷疑嗰啲嘈嘅錯誤有同伴,先至搵到。
我哋提呢件事,因為呢個先係呢行誠實嘅樣。隔離唔係一個撳掣就開嘅功能;而係一種習慣——肯去讀 schema 入面嗰啲悶嘢,預咗入面有啲嘢同你作對。
講明先,測試方面:一共 942 個,每次改動都喺一個由零重建嘅資料庫上面行。佢哋唔係用嚟證明個設計有幾醒。佢哋存在,係因為呢個設計嘅失敗模式係靜音嘅,而靜音嘅失敗需要有人代佢嗌出嚟。
隔離對一個普通人嚟講有咩著數
- 一個集團可以喺同一個安裝度行幾間公司,而一間嘅銷售員永遠見唔到另一間嘅客——唔係靠政策,係靠結構。
- 夥伴計劃、一套 prompt、一個客嘅認領:全部都係按公司劃界,所以一個租戶嘅設定唔會變成所有人嘅。
- 刪除資料嘅請求係喺一個邊界之內處理,而唔係喺一堆共用嘅嘢度搵,呢樣嘢先令你可以誠實咁答覆。
- 而且冇人需要記住任何一樣。呢個就係重點——一個要靠人記住先成立嘅保證,唔係保證。
多一句同資料庫無關嘅嘢
家族入面每一個兄弟服務都持有自己嘅具名憑證。冇任何嘢用共用憑證講嘢,所以冇一個服務可以唔覺意扮成另一個——呢個小紀律,係直接嚟自試過一次用共用 token、而且用得好唔痛快。
同資料庫嗰條規則係同一種直覺。令錯嘅嘢變成唔可能,而唔係唔鼓勵,你就可以將注意力放喺客人身上,而唔係放喺時刻提防上面。
- 126 張表每一張都帶住自己嘅租戶,而且強制開住檢查。
- 272 條政策逐條寫出嚟,所以每一條都有人讀過。
- 3942 個測試喺一個由零重建嘅資料庫上面,每次改動都係。
- 40 個預設租戶冇 scope 嘅請求永遠掂唔到啲資料。
喺正式 build 度量度

「我哋個應用程式永遠都會按公司過濾。」
呢句入面,「永遠」兩個字做咗好多嘢。
將條邊界推落去資料庫度,一個漏咗嘅 WHERE clause 就會回傳空嘢,而唔係人哋嘅客。一個空白畫面,好過一次尷尬嘅介紹。
俾行幾個牌子嘅集團 →