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.