3.14

View in English

3.14 Arsitektur multitenansi dan SaaS

Tinjauan dan motivasi

Multitenansi adalah praktik menjalankan satu instans perangkat lunak Anda agar melayani banyak pelanggan terpisah sekaligus, menjaga data dan konfigurasi setiap pelanggan terpisah secara logis sementara mereka berbagi kode yang sama dan, sering kali, infrastruktur yang sama. Setiap pelanggan adalah sebuah tenant. Gagasan tunggal ini adalah mesin ekonomi perangkat lunak sebagai layanan (SaaS), model di mana Anda menjual akses ke aplikasi yang berjalan alih-alih salinan untuk dipasang. Ketika seribu tenant berbagi deployment yang sama, Anda menambal sekali, menskalakan satu sistem, dan biaya marginal pelanggan berikutnya mendekati nol. Itulah mengapa produk multitenant yang dibangun baik dapat melayani startup dua orang dan enterprise seratus ribu kursi dari basis kode yang sama, dan mengapa model tenansi yang Anda pilih membentuk margin, postur keamanan, dan beban operasional Anda selama bertahun-tahun.

Bagi tim besar taruhannya lebih dalam daripada biaya. Multitenansi menaruh persyaratan keras di pusat arsitektur Anda: tenant A tidak boleh pernah melihat data tenant B, kapan pun, di bawah bug, balapan, atau salah konfigurasi apa pun. Satu kebocoran lintas tenant dapat mengakhiri perusahaan. Pada saat yang sama, seluruh inti berbagi adalah efisiensi, sehingga setiap keputusan desain berada pada spektrum antara isolasi kuat (lebih aman, lebih mahal) dan pembagian padat (lebih murah, lebih berisiko). Mendapatkan ini dengan benar adalah beda antara produk yang berskala dengan anggun dan produk yang entah membangkrutkan Anda di infrastruktur atau mendaratkan Anda di berita utama. Bab ini bertumpu pada arsitektur cloud (bab 3.11), bersandar berat pada arsitektur data (bab 3.4) dan keamanan cloud (bab 4.3), dan terhubung dengan skalabilitas dan ketahanan (bab 3.5) serta atribusi biaya (bab 9.4).

Enterprise dan pemerintah menaikkan standar lebih jauh. Pembeli enterprise menegosiasikan jaminan data kontraktual, menuntut isolasi khusus untuk tingkat mereka, dan mengharapkan Anda memigrasikan mereka antarlingkungan tanpa downtime. Pemerintah menambah hukum residensi data, pemisahan berbasis klasifikasi, dan persyaratan yang sering bahwa setiap lembaga menjadi tenant-nya sendiri dengan batas auditnya sendiri. Keputusan tenansi di sini bukan detail implementasi; itu komitmen yang Anda buat kepada setiap pelanggan yang memercayakan datanya kepada Anda.

Prinsip utama

  • Isolasi adalah spektrum, bukan sakelar. Model silo, pool, dan bridge menukar efisiensi dengan pemisahan; pilih per tingkat dan per sumber daya, bukan sekali untuk segalanya.
  • Konteks tenant itu sakral. Setiap permintaan, kueri, baris log, dan pekerjaan latar belakang harus membawa pengidentifikasi tenant, dan setiap akses data harus dibatasi cakupannya olehnya.
  • Kebocoran lintas tenant adalah kegagalan yang paling penting. Rancang agar satu filter yang hilang tidak dapat mengekspos data tenant lain; pertahanan berlapis, bukan satu klausa WHERE.
  • Tetangga berisik adalah masalah arsitektur. Tanpa kuota dan keadilan, satu tenant berat menurunkan semua orang; rencanakan sebelum itu terjadi.
  • Konfigurasi per tenant berskala; kode per tenant tidak. Lenturkan produk dengan data dan flag, bukan dengan fork.
  • Siklus hidup tenant adalah fitur produk. Onboarding, penyediaan, offboarding, dan ekspor data harus kelas satu, otomatis, dan dapat diaudit.
  • Anda tidak dapat mengelola apa yang tidak dapat Anda atribusikan. Observabilitas dan biaya harus diiris menurut tenant, atau Anda terbang buta pada keandalan sekaligus margin.

Rekomendasi

Pilih model tenansi per tingkat, sepanjang spektrum isolasi-versus-efisiensi

Tiga model menjangkarkan spektrum. Dalam model silo (khusus), setiap tenant mendapat tumpukan terisolasinya sendiri: komputasi terpisah, basis data terpisah, kadang akun atau jaringan terpisah. Isolasi terkuat dan radius ledakan bug hanya satu tenant, tetapi Anda membayar kapasitas menganggur per pelanggan dan mengoperasikan banyak salinan. Dalam model pool (bersama), semua tenant berbagi komputasi dan basis data yang sama, dipisahkan hanya oleh logika dan pengidentifikasi tenant. Efisiensi tertinggi dan biaya marginal tenant mendekati nol, tetapi isolasi kini bergantung sepenuhnya pada kebenaran kode Anda. Model bridge (hibrida) memadukan keduanya: komputasi bersama dengan basis data per tenant, atau kolam bersama untuk tenant kecil dan silo khusus untuk yang besar atau teregulasi.

Jangan pilih satu model untuk seluruh produk. Jawaban yang tepat biasanya bridge yang memetakan ke tingkat harga Anda. Taruh ekor panjang tenant kecil dalam kolam bersama yang efisien di tempat ekonomi mereka berjalan. Tawarkan deployment khusus atau single-tenant sebagai tingkat premium bagi pelanggan enterprise yang akan membayar isolasi dan jaminan kontraktual. Tuliskan pemetaan itu sebagai catatan keputusan arsitektur (bab 3.11), karena “tenant mana berbagi apa” adalah klaim yang diandalkan tim keamanan, penjualan, dan keuangan Anda.

Partisi data dengan sengaja, dan buat pembatasan tenant mustahil terlupakan

Data adalah tempat multitenansi hidup atau mati, jadi perlakukan pilihan partisi sebagai keputusan arsitektur data inti (bab 3.4). Tiga strategi sejajar dengan model tenansi. Basis data terpisah per tenant memberi isolasi terkuat, cadangan dan pemulihan per tenant yang mudah, dan ekspor data sederhana, dengan biaya banyak basis data untuk dijalankan dan migrasi skema untuk disebarkan. Skema terpisah per tenant dalam basis data bersama adalah jalan tengah: satu server, pemisahan logis, tetapi masih banyak objek untuk dimigrasikan. Tabel bersama berkunci kolom tenant, di mana setiap baris membawa tenant_id, paling padat dan paling murah, dan paling berbahaya, karena kini satu kueri yang kehilangan filter tenantnya membocorkan data antarpelanggan.

Jika Anda berbagi tabel, jangan bergantung pada pengembang yang mengingat filter. Tegakkan pembatasan tenant dalam lapisan yang tidak dapat dilewati: row-level security basis data yang menempelkan predikat wajib pada setiap kueri berdasarkan tenant sesi, ORM atau lapisan akses data yang menyisipkan klausa tenant secara otomatis, atau keduanya. Sabuk dan penahan celana tepat di sini. Seiring tenant tumbuh, sharding menurut tenant menjadi wajar: tempatkan kelompok tenant pada shard basis data berbeda agar tak ada instans tunggal yang memegang semua orang, yang juga membatasi radius ledakan kegagalan satu shard dan memungkinkan Anda memindahkan tenant besar ke shard sendiri tanpa mengubah modelnya.

Rambatkan konteks tenant ke mana-mana, dan bertahan terhadap kebocoran lintas tenant secara berlapis

Pengidentifikasi tenant harus menyertai setiap unit kerja. Tetapkan di tepi, biasanya dari sesi terautentikasi atau subdomain, validasi, dan jalinkan melalui konteks permintaan, setiap panggilan layanan hilir, setiap sesi basis data, setiap pekerjaan terantre, dan setiap baris log serta metrik. Celah berbahaya adalah yang asinkron: pekerja latar belakang yang memproses pekerjaan tanpa menetapkan ulang konteks tenant, cache berkunci tanpa tenant, penangan webhook yang memercayai pengidentifikasi tenant dari pemanggil. Masing-masing adalah jalur untuk menyajikan data satu tenant kepada tenant lain.

Perlakukan isolasi lintas tenant sebagai properti keamanan dengan pertahanan berlapis, dan serahkan detailnya ke bab 4.3. Terapkan prinsip hak istimewa paling sedikit agar bahkan komponen yang terkompromi hanya dapat menjangkau tenant yang sedang dilayaninya. Jangan pernah menerima pengidentifikasi tenant dari masukan yang dikendalikan klien untuk keputusan otorisasi; turunkan dari identitas terautentikasi. Beri namespace cache, prefiks penyimpanan objek, dan indeks pencarian menurut tenant agar tabrakan kunci tidak dapat melintasi batas. Lalu uji batas itu dengan sengaja: tes otomatis yang menegaskan kredensial tenant A tidak dapat membaca catatan tenant B, dan latihan red-team berkala yang mencoba keluar dari sebuah tenant. Kebocoran yang ditemukan rangkaian tes Anda adalah bug; kebocoran yang ditemukan pelanggan adalah krisis.

Tahan tetangga berisik dengan kuota, pembatasan laju, dan keadilan

Ketika tenant berbagi sumber daya, lonjakan satu tenant menjadi pemadaman semua orang. Masalah tetangga berisik ini bukan kasus tepi; ia perilaku bawaan kolam bersama di bawah beban. Rancang melawannya sejak awal. Tetapkan kuota per tenant pada sumber daya yang penting (permintaan per detik, pekerjaan konkuren, penyimpanan, biaya kueri) dan tegakkan dengan pembatasan laju di tepi dan pada batas internal yang mahal. Pilih penjadwalan adil yang memberi setiap tenant bagian alih-alih antrean siapa-datang-dulu yang membiarkan satu tenant membuat sisanya kelaparan.

Cocokkan penegakan dengan model tenansi Anda. Dalam kolam bersama, kuota dan keadilan adalah pertahanan utama, jadi investasikan di dalamnya. Untuk tenant yang bebannya benar-benar melebihi yang dapat diserap pembagian adil, jawabannya sering mempromosikan mereka keluar dari kolam ke deployment bridge atau silo, yang merupakan fitur yang dapat Anda jual alih-alih kegagalan. Kaitkan ini dengan pekerjaan skalabilitas dan ketahanan Anda (bab 3.5): load-shedding, circuit breaker, dan backpressure semuanya perlu sadar-tenant agar melepas kelebihan beban satu tenant melindungi yang lain alih-alih menurunkan seluruh sistem.

Konfigurasikan tenant dengan data, bukan fork kode Anda

Setiap pelanggan akan menginginkan sesuatu yang sedikit berbeda: logo mereka, aturan alur kerja mereka, integrasi mereka, bidang yang tidak Anda punya. Cara berskala untuk mengatakan ya adalah konfigurasi per tenant: feature flag, pengaturan, hak (entitlement), dan titik ekstensibilitas yang berupa data, dievaluasi saat runtime, dan dibagi satu basis kode. Jalan yang menghancurkan bisnis SaaS adalah kode kustom per tenant: cabang atau fork atau kasus khusus dalam jalur kode untuk pelanggan besar. Sepuluh dari itu dan Anda tak lagi punya produk, Anda punya sepuluh produk yang mengenakan mantel parit, dan setiap perubahan harus diuji sepuluh kali.

Tarik garis tegas. Modelkan sumbu variasi yang bersedia Anda dukung sebagai konfigurasi kelas satu, dan perlakukan permintaan di luar sumbu itu entah sebagai peta jalan produk atau tidak yang tegas. Ketika pelanggan membutuhkan kustomisasi sejati, beri mereka titik ekstensi (webhook, API, plugin, bidang kustom) yang menjalankan logika mereka tanpa mencabangkan milik Anda. Sisihkan deployment pesanan yang sejati untuk tingkat premium single-tenant, di mana isolasi adalah intinya dan harga lebih tinggi menutup biaya operasional.

Jadikan siklus hidup tenant otomatis, dapat diobservasi, dan teratribusi biaya

Onboarding tenant harus berupa alur swalayan otomatis: sediakan partisi data tenant, tanam bawaan, tetapkan hak, dan siap dalam hitungan detik, bukan tiket ke tim operasi. Offboarding sama pentingnya dan lebih mudah diabaikan. Ketika tenant pergi, Anda harus dapat mengekspor datanya dalam format yang dapat dipakai, lalu menghapusnya secara terbukti, karena kontrak dan hukum privasi akan menuntut keduanya. Rancang ekspor dan penghapusan data sejak hari pertama; memasangnya belakangan ke skema tabel bersama itu menyakitkan.

Instrumentasikan segalanya per tenant. Beri tag log, jejak, dan metrik dengan pengidentifikasi tenant agar Anda dapat menjawab “apakah pemadaman ini semua tenant atau satu?” dan “tenant mana yang mendorong biaya ini?” dalam hitungan detik. Atribusikan biaya infrastruktur ke tenant agar Anda tahu margin sebenarnya per pelanggan dan dapat menemukan tenant yang pemakaiannya membuat mereka merugi pada harga saat ini (bab 9.4). Observabilitas sadar-tenant dan atribusi biaya mengubah multitenansi dari kotak hitam menjadi sistem yang benar-benar dapat Anda jalankan dan harga.

Trade-off: kelebihan dan kekurangan

Model tenansiKelebihanKekurangan
Silo (tumpukan khusus per tenant)Isolasi terkuat, radius ledakan terkecil, kepatuhan dan ekspor per tenant mudah, cerita tetangga berisik sederhanaBiaya tertinggi, kapasitas menganggur per tenant, banyak salinan untuk dioperasikan dan ditambal
Pool (sepenuhnya bersama)Biaya marginal terendah, pengepakan terpadat, satu sistem untuk diskalakan dan ditingkatkanIsolasi bergantung sepenuhnya pada kebenaran kode, risiko tetangga berisik terburuk, ekspor dan penghapusan per tenant tersulit
Bridge (hibrida, bertingkat)Efisien untuk tenant kecil, isolasi khusus untuk yang besar, memetakan ke hargaLebih banyak model untuk dibangun dan dioperasikan, jalur promosi antartingkat untuk dipelihara
DB bersama, skema bersama (kolom tenant)Penyimpanan termurah, satu migrasi, operasi tersederhanaSatu filter yang hilang membocorkan data; butuh row-level security sebagai penahan
DB bersama, skema per tenantIsolasi logis, satu server, ekspor layakBanyak objek skema, migrasi menyebar, batas skala per server
Basis data per tenantIsolasi data kuat, cadangan dan ekspor per tenantBanyak basis data, migrasi menyebar, biaya lebih tinggi

Ketegangan pusatnya adalah isolasi versus efisiensi, dan ia mengalir melalui setiap baris. Pembagian lebih padat melipatgandakan margin Anda dan melipatgandakan risiko Anda dalam gerak yang sama; isolasi lebih kuat membeli keselamatan dan kesederhanaan dengan biaya per tenant yang nyata. Penyelesaiannya bukan memilih satu kutub melainkan menempatkan setiap tenant dengan sengaja sepanjang spektrum, biasanya menurut tingkat: padatkan tenant kecil di tempat ekonomi menuntutnya dan risiko terbatas, isolasi tenant besar dan teregulasi di tempat mereka akan membayarnya dan radius ledakan harus kecil. Lalu buat ujung padat aman dengan pembatasan tenant yang ditegakkan, dan buat ujung terisolasi murah dengan otomasi, agar tak satu kutub pun menyakitkan seperti versi naifnya.

Pertanyaan untuk didiskusikan dengan tim Anda

  1. Jika satu filter pembatasan tenant hilang besok, akankah pelanggan melihat data pelanggan lain? Inilah pertanyaan yang memisahkan produk multitenant yang dapat dipertahankan dari kecelakaan yang menunggu terjadi. Ujian jujurnya menelusuri jalur baca nyata dan bertanya apa yang menegakkan batas tenant: apakah satu klausa WHERE yang ditulis pengembang, atau ada penahan seperti row-level security basis data atau lapisan akses data yang menyisipkan cakupan apa pun yang terjadi? Bawa jalur kueri sebenarnya, pekerjaan latar belakang, dan cache Anda, karena kebocoran hampir selalu bersembunyi di sudut asinkron yang tak dibatasi siapa pun. Anda juga harus membawa hasil tes yang dengan sengaja memakai sesi tenant A untuk meminta catatan tenant B dan menegaskan penolakan. Jika batas bertumpu pada kewaspadaan manusia saja, Anda punya pembobolan laten, dan perbaikannya (pertahanan berlapis) harus melompat ke puncak backlog.

  2. Model tenansi dan partisi data mana yang sebenarnya dipakai setiap tingkat pelanggan, dan apakah cocok dengan yang kita jual kepada mereka? Banyak tim hanyut ke satu model secara bawaan, lalu menemukan harga dan arsitektur mereka tak sepakat: pelanggan enterprise dijanjikan isolasi yang tak disediakan kolam bersama, atau pelanggan kecil duduk di tumpukan khusus mahal yang menghancurkan margin. Petakan setiap tingkat ke model sebenarnya (silo, pool, atau bridge; basis data-per-tenant, skema, atau tabel bersama) dan letakkan di samping jaminan data kontraktual yang dibuat tim penjualan Anda. Di mana keduanya menyimpang, Anda punya risiko kepatuhan atau masalah biaya, dan keduanya layak dimunculkan sebelum pelanggan atau auditor menemukannya. Bukti yang dibawa adalah pemetaan tingkat-ke-model, biaya per tenant, dan bahasa sebenarnya dalam kontrak enterprise Anda.

  3. Ketika beban tenant besar melonjak, siapa lagi yang merasakannya, dan apa rencana kita? Dalam kolam bersama jawabannya sering “semua orang,” dan tim sering tidak mengetahui ini sampai insiden membuatnya jelas. Telusuri apa yang terjadi ketika tenant terbesar Anda menjalankan impor massal atau mendapat lonjakan lalu lintas: apakah kuota per tenant dan penjadwalan adil menahannya, apakah load-shedding melindungi tetangga, atau seluruh sistem merosot bersama? Bawa data beban dan kisah insiden tetangga berisik terakhir Anda, karena tenant yang menyakiti Anda biasanya yang dapat Anda sebut namanya. Jawabannya harus membentuk investasi pembatasan laju dan strategi pentahapan Anda, karena perbaikan paling bersih untuk tenant yang melampaui pembagian adil adalah mempromosikannya ke deployment bridge atau khusus yang dapat Anda tagih.

  4. Ketika tenant offboarding besok, dapatkah kita menyerahkan ekspor bersih dan membuktikan kita menghapus setiap jejak, atau kita akan kalang kabut? Offboarding adalah bagian siklus hidup tenant yang diabaikan tim sampai klausa keluar kontrak atau permintaan hukum privasi memaksanya, dan saat itu skema bersama membuat ekstraksi dan penghapusan menyakitkan. Bagi tim besar risikonya berlipat, karena data tenant tersebar di basis data utama, cache, penyimpanan objek, indeks pencarian, cadangan, dan pipeline analitik, dan masing-masing harus diekspor dalam format yang dapat dipakai lalu dibersihkan secara terbukti. Pertimbangan yang bersaing itu nyata: tabel bersama padat yang memberi Anda penyimpanan murah persis yang membuat ekstraksi dan penghapusan per tenant tersulit, sehingga efisiensi yang Anda beli di lapisan penyimpanan mungkin Anda bayar kembali saat keluar. Bawa penelusuran langsung offboarding pada tenant nyata, daftar setiap penyimpanan yang menyimpan data tenant, dan bukti yang akan Anda tunjukkan bahwa penghapusan benar-benar terjadi. Untuk tenant enterprise dan pemerintah, ekspor harus tersertifikasi dan penghapusan terbukti untuk memenuhi undang-undang catatan publik dan privasi, jadi perlakukan jalur penghapusan yang hilang sebagai cacat kepatuhan untuk ditutup sekarang, bukan fitur untuk ditambah ketika pelanggan pergi.

  5. Berapa banyak kasus khusus sekali pakai untuk pelanggan individual yang sudah hidup di jalur kode kita, dan di mana garis yang kita tolak lintasi? Fork kode per tenant adalah cara diam-diam bisnis SaaS berhenti menjadi satu produk dan menjadi banyak produk yang berbagi satu nama, di mana setiap perubahan harus diuji terhadap setiap kasus khusus dan kecepatan meluruh seiring Anda menambah pelanggan. Ketegangannya adalah bahwa pelanggan besar dengan kebutuhan nyata sulit ditolak, dan cabang dalam jalur kode terasa lebih cepat daripada membangun permukaan konfigurasi, sehingga kasus khusus menumpuk satu pengecualian masuk akal demi satu. Bawa inventaris jujur: grep basis kode untuk nama pelanggan dan cabang khusus tingkat, hitung, dan perkirakan biaya tes dan tinjauan ekstra yang dikenakan masing-masing pada perubahan yang tak terkait. Diskusi harus menarik garis tegas antara variasi yang Anda modelkan sebagai konfigurasi kelas satu (flag, hak, titik ekstensi) dan kerja pesanan sejati yang Anda sisihkan untuk tingkat premium single-tenant di mana harga lebih tinggi menutup biaya operasional. Untuk pembeli enterprise yang menuntut kustomisasi dalam, jawaban tahan lamanya adalah titik ekstensi yang menjalankan logika mereka tanpa mencabangkan milik Anda, agar tata kelola dan audit tetap dapat diatasi di seluruh armada.

  6. Dapatkah kita mengatakan, per tenant, baik apa yang dikenakan insiden pada siapa maupun pelanggan mana yang merugi pada harga saat ini? Multitenansi menjadi kotak hitam begitu log, jejak, metrik, dan biaya infrastruktur Anda tidak membawa dimensi tenant, karena kemudian Anda tidak dapat menjawab apakah pemadaman satu tenant atau seluruh armada, dan tidak dapat menyebut tenant yang pemakaiannya membuatnya merugi pada harga kontraknya. Bagi tim besar atribusi ini yang memisahkan menjalankan platform dari menebak-nebaknya, dan ia langsung membentuk respons keandalan maupun harga. Pertimbangan saling tarik terhadap biaya instrumentasi dan kardinalitas: menandai segalanya menurut tenant tidak gratis, dan metrik berkardinalitas tinggi membebani anggaran observabilitas Anda, jadi Anda memilih dengan sengaja apa yang diiris per tenant dan apa yang disampel. Bawa cakupan penandaan tenant Anda saat ini, kueri nyata yang mengatribusikan pengeluaran cloud ke satu tenant, dan tabel margin yang memungkinkan Anda menyebut pelanggan paling tidak menguntungkan. Dalam pengaturan enterprise dan pemerintah, biaya per tenant dan observabilitas berlingkup audit juga memberi makan chargeback, perencanaan kapasitas, dan batas audit yang berhak dimiliki setiap lembaga atau unit bisnis, sehingga dimensi tenant adalah persyaratan tata kelola sebanyak operasional.

Lensa sektor

Startup. Kirim satu kolam bersama sejak hari pertama dan taruh perhatian rekayasa langka Anda pada satu hal yang tidak dapat dipasang belakangan: pembatasan tenant yang ditegakkan. Postgres terkelola dengan row-level security, tenant_id pada setiap tabel, dan konteks tenant yang diselesaikan di tepi membeli kepadatan aman tanpa tim operasi. Jangan bangun tingkat silo atau infrastruktur per tenant secara spekulatif; tambahkan tingkat bridge hanya ketika calon enterprise yang membayar membuat isolasi layak biayanya.

Bisnis kecil. Tanpa spesialis platform dan dengan anggaran ketat, bersandarlah pada apa yang sudah diberikan cloud dan kerangka kerja Anda alih-alih membangun mesin isolasi sendiri. Basis data terkelola dengan row-level security, platform-as-a-service yang membatasi tenant untuk Anda, dan penyedia autentikasi yang membawa identitas tenant biasanya lebih murah dan lebih aman daripada padanan buatan tangan. Perlakukan multitenansi sebagai keputusan beli-versus-bangun di setiap lapisan, dan sisihkan kerja kustom untuk tes batas tenant yang hanya Anda yang dapat menulisnya.

Enterprise. Masalahnya tata kelola portofolio di banyak tim: arsitektur bridge bertingkat, catatan keputusan arsitektur yang memetakan setiap tingkat ke model tenansi dan partisi datanya, dan atribusi biaya per tenant agar keuangan tahu margin sebenarnya pada setiap akun. Bakukan perambatan konteks tenant dan penahan pembatasan agar tak ada tim yang menciptakannya ulang, anggarkan otomasi isolasi dan siklus hidup secara eksplisit, dan jaga jalur yang didukung dan berharga untuk memigrasikan tenant antartingkat tanpa downtime seiring mereka tumbuh atau kebutuhan kepatuhan mereka berubah.

Pemerintah. Pengadaan, residensi data, dan akuntabilitas publik menggerakkan model. Kunci data setiap lembaga ke wilayah dalam negeri dengan policy-as-code, silo-kan beban kerja sensitif atau berklasifikasi tinggi ke akun terpisah dengan batas audit sendiri, dan beri setiap lembaga integrasi identitas, aturan retensi, dan jejak auditnya sendiri agar auditor satu lembaga tidak pernah melihat aktivitas lembaga lain. Offboarding harus menghasilkan ekspor tersertifikasi dan penghapusan terbukti untuk memenuhi undang-undang catatan publik dan privasi, dan jaminan tenansi yang Anda tandatangani harus yang benar-benar dapat dijaga arsitektur Anda.

Contoh

Startup. Sebuah startup lima belas orang membangun produknya sebagai satu kolam bersama sejak hari pertama dan itu benar. Semua tenant berbagi satu basis data Postgres terkelola dengan tenant_id pada setiap tabel, row-level security menegakkan predikat tenant di basis data sehingga filter yang terlupakan tidak dapat membocorkan, dan aplikasi menyelesaikan tenant dari subdomain di tepi lalu menjalinnya melalui setiap permintaan dan pekerjaan latar belakang. Onboarding swalayan: pendaftaran baru menyediakan baris tenant-nya, menanam bawaan, dan hidup dalam hitungan detik. Dua insinyur menjalankan seluruh platform karena hanya ada satu sistem untuk dioperasikan. Ketika calon enterprise nyata pertama mereka menuntut basis data khusus dan jaminan isolasi kontraktual, mereka menambah tingkat bridge: basis kode yang sama, tetapi tenant ini mendapat basis datanya sendiri pada shard sendiri, dijual dengan harga yang menutup biaya.

Enterprise. Sebuah vendor SaaS yang melayani institusi keuangan besar menjalankan arsitektur bridge bertingkat. Ribuan pelanggan kecil dan menengah hidup di kolam bersama regional, di-shard menurut tenant, dengan kuota dan penjadwalan adil menjaga tetangga berisik tetap terkendali. Pelanggan perbankan tingkat atas mendapat deployment single-tenant di akun cloud terisolasi, dengan basis data khusus, kunci enkripsi per tenant, serta jaminan residensi data dan isolasi kontraktual yang ditulis dalam perjanjian induk. Kemampuan platform memigrasikan tenant antartingkat tanpa downtime ketika mereka tumbuh atau kebutuhan kepatuhan mereka berubah. Biaya setiap tenant diatribusikan lewat penandaan sehingga keuangan tahu margin sebenarnya pada setiap akun, dan observabilitas bertag tenant memungkinkan insinyur on-call mengatakan dalam hitungan detik apakah peringatan menyangkut satu tenant atau seluruh armada.

Pemerintah. Sebuah penyedia platform nasional menjadi tuan rumah banyak lembaga pemerintah sebagai tenant terpisah dan memperlakukan isolasi sebagai persyaratan hukum, bukan preferensi. Hukum residensi data mengunci data setiap lembaga ke wilayah dalam negeri, ditegakkan oleh policy-as-code yang memblokir sumber daya apa pun di wilayah yang tak diizinkan (bab 3.11). Klasifikasi menggerakkan model: lembaga yang menangani materi sensitif mendapat deployment tersilo penuh di akun terpisah dengan batas audit sendiri, sementara beban kerja berklasifikasi lebih rendah berbagi kolam yang diatur. Setiap lembaga adalah tenant-nya sendiri dengan integrasi identitas sendiri, aturan retensi dan ekspor sendiri, dan jejak audit yang dibatasi pada batasnya, sehingga auditor satu lembaga tidak pernah melihat aktivitas lembaga lain. Offboarding menghasilkan ekspor data tersertifikasi dan penghapusan terbukti, karena catatan tunduk pada undang-undang catatan publik dan privasi.

Kasus bisnis: motivasi, ROI, dan TCO

Kasus bisnis inti multitenansi adalah margin. Model single-tenant, di mana Anda men-deploy salinan baru per pelanggan, berarti biaya infrastruktur dan operasi tumbuh kira-kira linear dengan jumlah pelanggan, dan insinyur Anda menghabiskan hari menambal banyak salinan. Model multitenant bersama memutus kaitan itu: Anda menambal sekali, menskalakan satu sistem, dan mengemas pelanggan cukup padat sehingga biaya marginal tenant berikutnya mendekati nol. Itulah yang memungkinkan bisnis SaaS menumbuhkan pendapatan jauh lebih cepat daripada biaya, dan mengapa investor serta dewan memperlakukan arsitektur multitenant yang bersih sebagai proksi perusahaan yang dapat berskala.

Imbal hasilnya muncul di tiga tempat: pengungkit operasional (satu tim menjalankan seluruh armada), pengiriman lebih cepat (perbaikan dikirim ke setiap tenant sekaligus, sehingga kecepatan tidak meluruh seiring Anda menambah pelanggan), dan opsionalitas harga (paket bersama untuk ekor panjang dan paket premium terisolasi untuk enterprise, keduanya dari satu basis kode). Hadapkan ini dengan biaya yang harus Anda danai dengan jujur: rekayasa untuk membangun isolasi tenant yang ditegakkan, kuota, otomasi siklus hidup, dan observabilitas per tenant, ditambah disiplin menjaga batas tetap utuh. Biaya salah melakukannya asimetris dan parah, karena satu pembobolan data lintas tenant dapat memicu penalti regulasi, churn massal, dan kerusakan reputasi yang jauh melampaui infrastruktur yang Anda hemat dengan berbagi. Bingkai kasus kepada pimpinan sebagai margin dan skalabilitas di sisi atas dan risiko eksistensial di sisi bawah. Tambatkan perjanjian tingkat layanan dan jaminan data kontraktual pada model tenansi yang benar-benar dapat Anda sampaikan, karena janji yang tidak dapat dijaga arsitektur Anda adalah liabilitas, bukan penjualan.

Anti-pola dan jebakan

  • Pembatasan tenant menurut konvensi. Mengandalkan pengembang mengingat filter tenant pada setiap kueri, tanpa penahan tingkat basis data atau lapisan akses data; satu kelalaian adalah pembobolan.
  • Memercayai pengidentifikasi tenant dari klien. Menerima tenant dari masukan permintaan untuk otorisasi alih-alih menurunkannya dari identitas terautentikasi, yang memungkinkan pemanggil meminta data orang lain.
  • Kerja latar belakang tak terbatas. Pekerjaan, cache, webhook, dan ekspor yang kehilangan konteks tenant karena seseorang hanya membatasi jalur permintaan sinkron.
  • Fork kode per tenant. Mengkhususkan pelanggan besar dalam jalur kode sampai Anda memelihara banyak produk yang menyimpang di bawah satu nama dan setiap perubahan berbiaya sepuluh kali lipat.
  • Tanpa pertahanan tetangga berisik. Menjalankan kolam bersama tanpa kuota atau keadilan per tenant, sehingga tenant pertama yang melonjak menjatuhkan semua orang.
  • Offboarding sebagai renungan belakangan. Membangun tanpa ekspor data dan penghapusan terbukti, lalu gagal pada klausa keluar pelanggan atau permintaan hukum privasi karena skema bersama membuat ekstraksi menyakitkan.
  • Terbang buta per tenant. Log, metrik, dan biaya tanpa dimensi tenant, sehingga Anda tidak dapat mengatakan insiden milik siapa atau tenant mana yang merugi.

Model kematangan

  • Tingkat 1, Memulai: Multitenansi diimprovisasi dan reaktif. Pemisahan tenant bertumpu pada filter tulisan tangan tanpa penahan, modelnya satu-ukuran-untuk-semua, tidak ada kuota, onboarding manual, dan log serta biaya tidak membawa dimensi tenant. Tim mengetahui tetangga berisik dan nyaris-bocor dari insiden.
  • Tingkat 2, Mengembangkan: Praktik dasar muncul tetapi tidak konsisten lintas tim. Model tenansi dipilih dan konteks tenant dirambatkan melalui jalur permintaan utama, penahan tingkat basis data atau akses data menegakkan pembatasan pada tabel inti, dan kuota per tenant dasar ada. Onboarding sebagian otomatis dan log membawa pengidentifikasi tenant, tetapi jalur latar belakang, ekspor, dan atribusi biaya bervariasi dari layanan ke layanan dan tidak tertulis di mana pun.
  • Tingkat 3, Membakukan: Pendekatan tenansi terdokumentasi dan ditegakkan di seluruh organisasi. Tenansi bertingkat memetakan ke harga, dengan kolam bersama untuk tenant kecil dan deployment terisolasi untuk yang enterprise dan teregulasi, pembatasan tenant ditegakkan berlapis dan diuji dengan sengaja, kuota dan penjadwalan adil menahan tetangga berisik, siklus hidup tenant termasuk ekspor dan penghapusan terbukti diotomatisasi, dan observabilitas serta biaya diiris per tenant. Setiap tim mengikuti standar tenansi yang sama alih-alih standarnya sendiri.
  • Tingkat 4, Mengelola: Properti tenansi diukur dan dikendalikan terhadap garis dasar. Isolasi, keadilan, latensi, dan biaya per tenant dilacak sebagai metrik dengan target yang disepakati: cakupan tes lintas tenant, tingkat pelanggaran kuota dan insiden tetangga berisik, waktu onboarding dan offboarding, serta margin per tenant dilaporkan terhadap garis dasar, dan keputusan mempromosikan tenant antartingkat atau menaikkan harga yang merugi dibuat atas bukti itu alih-alih anekdot. Kesesuaian residensi dan klasifikasi dipantau terus-menerus, dan penyimpangan dari standar memicu respons terdokumentasi.
  • Tingkat 5, Mengorkestrasi: Tenansi terus diperbaiki dan terintegrasi di seluruh organisasi. Batas lintas tenant dilatih lewat latihan red-team rutin, tenant berpindah antartingkat tanpa downtime seiring mereka tumbuh atau kebutuhan kepatuhan mereka berubah, margin per tenant memberi makan harga dan perencanaan kapasitas, dan aturan residensi serta klasifikasi ditegakkan oleh kebijakan alih-alih oleh tinjauan. Model beradaptasi seiring bergesernya campuran pelanggan dan gambaran regulasi, dan pelajarannya mengalir ke produk, keamanan, dan keuangan sebagai satu lingkaran.

Gagasan untuk didiskusikan

  1. Di mana setiap tingkat pelanggan Anda berada pada spektrum isolasi-versus-efisiensi hari ini, dan apakah ada tingkat yang berada dalam model yang salah untuk jaminan yang Anda jual atau margin yang Anda butuhkan?
  2. Jika Anda harus membuktikan kepada auditor bahwa tenant A tidak dapat mengakses data tenant B, bukti apa yang dapat Anda hasilkan sekarang, dan berapa banyak yang otomatis versus ditegaskan?
  3. Jalur asinkron Anda yang mana (pekerjaan, cache, webhook, ekspor, indeks pencarian) yang menetapkan ulang konteks tenant, dan mana yang sekadar mewarisinya atau memercayai pemanggil?
  4. Ketika tenant melampaui pembagian adil, apakah Anda punya jalur promosi yang didukung dan berharga ke deployment bridge atau khusus, atau jawabannya bawaan menjadi insiden?
  5. Dapatkah Anda mengatribusikan biaya infrastruktur ke tenant individual cukup baik untuk menyebut pelanggan paling tidak menguntungkan, dan akankah itu mengubah cara Anda menetapkan harga?
  6. Untuk tenant pemerintah atau teregulasi, dapatkah Anda menegakkan residensi data dan isolasi berbasis klasifikasi lewat kebijakan, dan offboarding dengan ekspor tersertifikasi dan penghapusan terbukti?

Poin-poin utama

  • Multitenansi, satu instans yang melayani banyak tenant, adalah mesin ekonomi SaaS: ia menggerakkan margin Anda, dan menaruh isolasi lintas tenant di pusat arsitektur Anda.
  • Perlakukan isolasi versus efisiensi sebagai spektrum dan bertingkatlah: padatkan tenant kecil dalam kolam bersama yang efisien, isolasi tenant besar dan teregulasi dalam deployment bridge atau silo yang akan mereka bayar.
  • Jangan pernah bersandar pada filter tulisan tangan untuk pembatasan tenant; tegakkan berlapis dengan row-level security atau lapisan akses data, dan uji batasnya dengan sengaja.
  • Rambatkan konteks tenant melalui setiap permintaan, pekerjaan, cache, dan log, dan pertahankan jalur asinkron tempat kebocoran bersembunyi.
  • Tahan tetangga berisik dengan kuota per tenant, pembatasan laju, dan penjadwalan adil, dan promosikan tenant yang melampaui kolam alih-alih membiarkan mereka menurunkannya.
  • Lenturkan produk dengan konfigurasi per tenant, bukan kode per tenant, dan jadikan siklus hidup tenant serta observabilitas dan atribusi biaya per tenant kelas satu.

Referensi dan bacaan lanjutan

  • Tom Kwok, Thao Nguyen, dan Linh Lam, A Software as a Service with Multi-tenancy Support for an Electronic Contract Management Application (IEEE International Conference on Services Computing)
  • Frederick Chong dan Gianpaolo Carraro, Architecture Strategies for Catching the Long Tail (Microsoft)
  • Amazon Web Services, SaaS Lens, AWS Well-Architected Framework dan SaaS Tenant Isolation Strategies
  • Microsoft, Multitenant SaaS architecture and patterns (Azure Architecture Centre)
  • Google Cloud, Architecture for Multi-tenant SaaS Applications
  • Cor-Paul Bezemer dan Andy Zaidman, Multi-Tenant SaaS Applications: Maintenance Dream or Nightmare? (Proceedings of the Joint ERCIM Workshop on Software Evolution)
  • The Open Web Application Security Project, OWASP Application Security Verification Standard (persyaratan kendali akses dan multitenansi)
  • Martin Kleppmann, Designing Data-Intensive Applications (partisi, sharding, dan isolasi data)