iKonekt

Pemisahan

Batas yang dijaga basis data, bukan kode

Setiap CRM mengklaim sebagai sistem multi-tenant. Klaim itu murah; yang penting adalah lapisan mana yang memegang garis batas itu. Jika jawabannya adalah "aplikasi kami selalu menambahkan filter yang tepat", maka jaminannya hanya sebaik pengembang yang paling kurang istirahat yang pernah menulis sebuah kueri.

iKonekt sudah multi-tenant sejak migrasi pertamanya, bukan dipasang belakangan, yang terdengar seperti pameran tetapi sebenarnya pengakuan: memasangnya belakangan hampir mustahil dilakukan secara meyakinkan, dan semua orang yang pernah mencobanya punya cerita masing-masing.

Pemisahan berada di basis data. Setiap satu dari dua puluh enam tabel membawa tenant tempatnya berada, dan kebijakan yang memeriksanya berjalan pada setiap pembacaan dan penulisan, sepenuhnya di bawah aplikasi. Kueri yang lupa batas tidak mengembalikan pelanggan milik orang lain. Ia tidak mengembalikan apa pun.

Keamanan tingkat baris, dipaksakan

Bukan konvensi, bukan aturan tinjauan kode. Basis datanya menolak. Tujuh puluh dua kebijakan, ditulis satu per satu alih-alih dibuat otomatis — karena kebijakan yang dibuat otomatis adalah kebijakan yang tidak dibaca siapa pun.

Kunci komposit

Catatan anak merujuk tenant-nya dan induknya secara bersamaan, sebagai satu pasangan. Pengenal liar dari perusahaan yang salah tidak akan terurai — ia bukan referensi yang valid.

Tanpa tenant bawaan, tidak pernah

Permintaan tanpa cakupan tidak diam-diam menjadi permintaan untuk tenant nol. Ia melempar galat sebelum mencapai basis data. Tidak ada mode "tanpa cakupan" yang bisa lupa dimatikan.

Galat yang tidak bisa mengumumkan dirinya

Selama pekerjaan tenancy berlangsung, sebagian besar kesalahan bersuara keras. Beri dua perusahaan domain pelanggan yang sama dan basis data langsung menolak, dengan kode galat dan jejak tumpukan; Anda memperbaikinya sebelum makan siang.

Satu tidak menolak. Tabel penggantian prompt yang dapat diedit dikunci hanya pada jenis prompt-nya — bukan pada jenis dan tenant. Perusahaan kedua yang mengedit salinannya sendiri akan diam-diam menimpa milik perusahaan pertama, melalui SQL yang sepenuhnya valid, tanpa galat, tanpa peringatan, dan tanpa pengujian yang gagal. Itu ditemukan dengan membaca setiap indeks unik yang tersisa setelah mengubah sebuah kunci, satu per satu, berdasarkan kecurigaan bahwa yang bersuara keras tidak sendirian.

Kami menyebutkannya karena itulah bentuk jujur dari pekerjaan ini. Pemisahan bukan fitur yang Anda nyalakan; ia adalah kebiasaan membaca bagian-bagian membosankan dari skema dengan asumsi bahwa ada sesuatu di sana yang tidak setuju dengan Anda.

Pengujian, untuk dicatat: 942 buah, dijalankan terhadap basis data yang dibangun dari nol pada setiap perubahan. Pengujian itu bukan untuk membuktikan desainnya cerdas. Pengujian itu ada karena mode kegagalan dari desain khusus ini adalah diam, dan kegagalan yang diam membutuhkan seseorang yang berteriak di belakangnya.

Apa yang pemisahan berikan pada orang biasa

  • Sebuah grup dapat menjalankan beberapa perusahaan dari satu instalasi, dan penjual di salah satunya tidak akan pernah melihat pelanggan milik perusahaan lain — bukan karena kebijakan, melainkan karena konstruksinya.
  • Program mitra, sekumpulan prompt, klaim atas pelanggan: semuanya dicakupkan per perusahaan, sehingga konfigurasi satu tenant tidak bisa menjadi milik semua orang.
  • Permintaan penghapusan dipenuhi dalam satu batas alih-alih melintasi tumpukan bersama, dan itulah yang membuatnya mungkin dijawab dengan jujur.
  • Dan tidak ada yang perlu mengingatnya. Itulah intinya — jaminan yang bergantung pada diingatnya bukanlah jaminan.

Satu paragraf lagi yang tidak soal basis data

Setiap layanan saudara dalam keluarga ini memegang kredensial bernamanya sendiri. Tidak ada yang berbicara dengan kredensial bersama, sehingga tidak ada layanan yang bisa secara tidak sengaja bertindak sebagai layanan lain — disiplin kecil yang lahir langsung dari pernah memiliki token bersama dan tidak menikmatinya.

Ini naluri yang sama dengan aturan basis data. Jadikan hal yang salah mustahil alih-alih sekadar dilarang, dan Anda menghabiskan perhatian Anda pada pelanggan alih-alih pada kewaspadaan.

BatasnyaDi bawah aplikasi
  • 126 tabelSetiap satu membawa tenant-nya, dengan pemeriksaan dipaksa aktif.
  • 272 kebijakanDitulis satu per satu, sehingga setiap kebijakan telah dibaca oleh manusia.
  • 3942 pengujianTerhadap basis data yang dibangun ulang dari nol, pada setiap perubahan.
  • 40 tenant bawaanPermintaan tanpa scope tidak pernah sampai ke data.

Diukur pada build langsung

“Aplikasi kami selalu memfilter berdasarkan perusahaan.”

Kata “selalu” bekerja sangat keras dalam kalimat itu.

Pindahkan batas ke bawah ke dalam basis data, dan klausa WHERE yang terlupakan mengembalikan kosong alih-alih pelanggan orang lain. Layar kosong adalah kegagalan yang lebih baik daripada perkenalan yang canggung.

Untuk grup yang menjalankan beberapa merek →