UgrĂĄs a tartalomhoz
← Vissza a naplóhoz

Multi-tenant SaaS Ă©pĂ­tĂ©s MVP-bƑl — 6 hiba, amit nem szabad elkövetni

Tenant_id mindenhol, RLS elsƑ naptĂłl, sharding-halasztĂĄs 200 tenantig, per-tenant sequence, Host-header resolution, tenant-per-index. 6 buktatĂł — javĂ­tĂĄs 18 hĂłnap mĂșlva nem opciĂł.

Multi-tenant SaaS Ă©pĂ­tĂ©s MVP-bƑl — 6 hiba, amit nem szabad elkövetni

Minden SaaS, amit elindĂ­tasz, elƑbb-utĂłbb multi-tenant lesz. A kĂ©rdĂ©s csak az, hogy te tervezed-e be, vagy a 7. ĂŒgyfĂ©led fogja kikĂ©nyszerĂ­teni egy late-night incidentben. Hat hiba, amit mi vagy az ĂŒgyfeleink elkövettĂŒnk, Ă©s amitƑl szeretnĂ©nk megĂłvni.

1. tenant_id elfelejtése egy tåblån

Az alapszabĂĄly: MINDEN ĂŒzleti tĂĄbla elsƑ oszlopa tenant_id. MĂ©g a tags is. MĂ©g a user_preferences is. A legkisebb kivĂ©tel is megbosszulja magĂĄt — egy ĂŒgyfĂ©l nĂĄlunk 14 hĂłnap mĂșlva fedezte fel, hogy az email_templates tĂĄblĂĄn nincs tenant_id, Ă©s a B-tenant ĂĄltal mentett sablon megjelent az A-tenant fiĂłkjĂĄban.

KĂ©nyszerĂ­tsd ki migration-szinten: ne legyen tĂĄbla tenant_id nĂ©lkĂŒl, kivĂ©ve nyĂ­ltan közöset (pl. tenants, tenant_billing_plans).

2. Row-level security (RLS) nĂ©lkĂŒl indulĂĄs

„Majd a service layer ellenƑrzi.” Nem fogja. Egyetlen elfelejtett WHERE egy admin-eszközben, egyetlen rosszul scope-olt JOIN, Ă©s az adat keresztbe folyik. Postgres RLS bekapcsolĂĄsa nem opcionĂĄlis — az MVP elsƑ hetĂ©n megy be.

MĂ©rt adat egy 2026-os ĂŒgyfĂ©l-audithoz: 17 service-rĂ©teg lekĂ©rdezĂ©sbƑl 3 nem szƱrt tenant_id-ra. RLS-sel ezek hibĂĄra futnak, anĂ©lkĂŒl Ă©szrevĂ©tlenĂŒl szivĂĄrogtak volna.

3. TĂșl korai sharding

A „skĂĄlĂĄzni fogunk” narratĂ­va ellenĂ©re: az elsƑ 200 tenantig egyetlen Postgres elĂ©g. A sharding-tax (cross-shard JOIN, eventual consistency, devops bonyolĂ­tĂĄs) most több költsĂ©g, mint amennyi haszon. Tedd be a shard-key oszlopot (shard_key), tedd be a tenant→shard mapping tĂĄblĂĄt — de maradj egy shardon addig, amĂ­g a p99 > 500ms vagy a DB-CPU > 70% nem tartĂłs.

4. Közös sequence per tenant

A quote_number Ă©s tĂĄrsai: ha SERIAL-t hasznĂĄlsz egyetlen sequence-szel, B-tenant ajĂĄnlatszĂĄmai ugranak A-tenant ajĂĄnlatszĂĄmai miatt. Ez nemcsak csĂșnya — könyvelĂ©si problĂ©mĂĄt is szĂŒl.

Minta: (tenant_id, sequence_id) kompozit, INSERT ... RETURNING egy per-tenant nextval('tenant_X_quotes_seq')-bƑl, vagy explicit tenant_counters tĂĄbla FOR UPDATE-tel. EgyszerƱ, Ă©s mindkĂ©t fĂ©l hĂĄlĂĄs.

5. Hard-coded subdomain

„EgyelƑre acme.app.example.com alĂĄ tesszĂŒk az Acme-t.” Hat hĂłnap mĂșlva: 47 subdomain, Cloudflare DNS-szabĂĄly karbantarthatatlan, SSL-cert-rotation egy rĂ©mĂĄlom. RĂĄadĂĄsul az Ășj ĂŒgyfĂ©l mĂĄr a sajĂĄt domainjĂ©n akarja lĂĄtni a SaaS-t (portal.acme.com).

KezdettƑl fogva: Host-header alapĂș tenant resolution. A subdomain csak egy kĂ©nyelmi alias. Az adatbĂĄzisban a tenant „host_aliases” mezƑ egy listĂĄt tĂĄrol (acme.com, portal.acme.com, acme.app.example.com). Egy ingress, egy wildcard cert, sok host.

6. Közös search index

Elasticsearch / Meilisearch / OpenSearch: ha az egĂ©sz SaaS egyetlen indexre keres, a tenant_id filter csak query-time. A query-tervezƑ drĂĄga lesz, a re-index egy tenantre az egĂ©sz indexet Ă©rinti, Ă©s egy konfig-hiba megint adatszivĂĄrgĂĄshoz vezethet. Tenant-per-index (vagy legalĂĄbb per-index-alias) — kicsit drĂĄgĂĄbb storage, sokkal egyszerƱbb biztonsĂĄg.

A tanulsĂĄg

A multi-tenant nem egy „kapcsolĂł, amit kĂ©sƑbb felcsapunk”. ArchitektĂșra-rĂ©teg, Ă©s az MVP elsƑ napjĂĄn kell beletervezned. A fenti hat hiba mindegyike ĂșjraĂ­rĂĄst kĂ­vĂĄn a 18. hĂłnapban — kivĂ©ve, ha az 1. hĂłnapban mĂĄr jĂłl csinĂĄltad.

BeszĂ©ljĂŒnk a projektedrƑl

Mondd el, mit Ă©pĂ­tesz — meglĂĄtjuk, hogyan segĂ­thetĂŒnk.

Multi-tenant SaaS Ă©pĂ­tĂ©s MVP-bƑl — 6 hiba, amit nem szabad elkövetni — Nortinia Journal | Nortinia