Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アジリティを高めるためのマルチテナント設計戦略

 アジリティを高めるためのマルチテナント設計戦略

SaaSにおけるマルチテナント設計の悩みと勘所 | SaaS.tech #2 にてLT発表したときの資料です。

イベントURL
https://saas-tech.connpass.com/event/243204/

メダップについて
https://medup.jp/about/

Satoshi Nakamatsu

April 20, 2022
Tweet

Other Decks in Programming

Transcript

  1. @satoshicano(஥দ ૱ • ϝμοϓגࣜձࣾ d ) 
 • ϑϩϯτΤϯυόοΫΤϯυ྆ํ৮Γ·͢ •

    খதن໛ͷ1+ΦʔφʔΛ΍ͬͯ·͢ • ϚϧνςφϯτΛѻ͏4BB4ͷ։ൃ͸ݱ৬͕ ॳΊͯ ࣗݾ঺հ
  2. ঺հೖӃσʔλͷ෼ੳ #*ػೳ μογϡϘʔυ ࿈ܞઌͷϔϧενΣοΫ $4$3. ΞΫγϣϯ࣮ࢪɾ؅ཧ 4'"." ࿈ܞઌϚοϓ ࿈ܞઌ؅ཧ Ξϥʔτ

    ΞΫγϣϯ෼ੳ HTMLϝʔϧ Point foro CRM ͷಛ௃ ϫϯετοϓͰ࣮ݱ͢Δ ػೳϥΠϯφοϓ ͜Ε·ͰͷපӃ޲͚πʔϧʹ͸ͳ͔ͬͨ පӃͷΦϖϨʔγϣϯʹಛԽͨ͠පӃͷ ҩࢣ৬һ͕࢖͍΍͍͢ػೳΛ౥ࡌ͠ɺ࿈ ܞ׆ಈʹॏཁͳ෼ੳ؅ཧڞ༗ػೳΛϫ ϯετοϓͰఏڙ͠·͢ɻ 02.
  3. foro CRMͷγεςϜߏ੒ foro-crm-api • γεςϜߏ੒ 
 ◦ όοΫΤϯυ ▪ Ruby

    on Rails ▪ MySQL/Redis ▪ GCP(GAE) ◦ ϑϩϯτΤϯυ 41" ▪ React.js/TypeScript ▪ Next.js • Ϛϧνςφϯτͷ࣮ݱ 
 ◦ Apartment gemΛར༻ foro-crm-spa Ϣʔβʔ ࣾ಺ͷผαʔϏε
  4. ݱঢ়ͷ՝୊ DBϚΠάϨʔγϣϯʹ͕͔͔࣌ؒΔ • ಋೖςφϯτ਺ͷ૿ՃʹԠͯ͡ɺϚΠάϨʔγϣϯ͕࣌ؒ৳ͼ͍ͯ͘ݒ೦͕͋Δ • ೔தͷσϓϩΠ͕ͮ͠Β͘ͳΔ ϚϧνςφϯτԽͯ͠Δ͕ނʹɺબ୒Ͱ͖Δٕज़ͷ෯͕ڱ·͍ͬͯΔ • ࢀরͰ͖Δ஌ݟ͕ݶΒΕ͍ͯΔ •

    ϚϧνςφϯτʹରԠ͍ͯ͠ΔϥΠϒϥϦͷগͳ͞ ٕज़ͷෳࡶੑ͕૿͢ • ΩϟονΞοϓίετ ϚϧνςφϯτԽ͢΂͖΋ͷͱɺϚϧνςφϯτԽ͠ͳͯ͘Α͍΋ͷʹΘ͚Δ͜ͱͰ 
 ͜ΕΒͷ՝୊ͷӨڹൣғΛݶఆԽ͍ͨ͠ ہॴԽ͍ͨ͠
  5. ཧ૝ XXXαʔϏε ঺հɾೖӃαʔϏε • ϚϧνςφϯτͷہॴԽͷํ਑ ◦ ঺հɾೖӃσʔλपΓΛηΩϡΞʹอ͍ͪͨ ◦ ↑Ҏ֎ͷσʔλΛ୤ϚϧνςφϯτԽ͢Δ •

    ࠷ऴతʹαʔϏεͱͯ͠GPSP CRMຊମ͔Β෼ׂ ◦ foro CRMຊମͷऔΕΔٕज़ͷ෯͕޿͕Δ 
 ݱঢ় ཧ૝ foro-crm-api foro-crm-api
  6. ϚϧνςφϯτͷہॴԽ ςφϯτ%#ˠύϒϦοΫ%#ͷσʔλҠߦ • Ҡߦର৅ͷςʔϒϧʹUFOBOU@JEΧϥϜΛ෇ ༩͢Δ͜ͱͰςφϯτΛ۠ผ͢Δ • ʮ঺հɾೖӃʯσʔλʹؔΘΔσʔλΛς φϯτ%#ʹ࢒ͭͭ͠ɺͦΕҎ֎ͷσʔλΛ ͢΂ͯύϒϦοΫ%#ʹҠߦ ΞϓϦέʔγϣϯ΋%#ʹ߹Θͤͯվम

    • ύϒϦοΫ%#͔Βࢀর͢ΔΑ͏ʹमਖ਼ 
 ύϒϦοΫ%# ςφϯτ%# ςφϯτΛލ͍Ͱѻ͍͍ͨ ςʔϒϧ ςφϯτຖʹѻ͍ͬͯΔ 
 ςʔϒϧ ςφϯτΛލ͍Ͱѻ͍͍ͨ ςʔϒϧ 
 ςφϯτຖͷʮ঺հɾೖӃʯ Ҏ֎ͷςʔϒϧ ςφϯτΛލ͍Ͱѻ͍͍ͨ ςʔϒϧ 
 ςφϯτຖͷ 
 ঺հɾೖӃςʔϒϧ
  7. ؾΛ͚ͭͨϙΠϯτ Primary Keyͷিಥ • Primary Keyͷিಥ ◦ ςφϯτ%#ͷ֤ςʔϒϧͷ1SJNBSZ Key ʹ͸Auto

    IncrementΛ࠾༻͍ͯͨ͠ҝɺύ ϒϦοΫDBʹͦͷ··Πϯαʔτ͢Δͱ ID͕িಥͯ͠͠·͏ • ৽͘͠࠾൪͠௚͢͜ͱ΋ݕ౼͕ͨ͠ɺ͋·Γෳ ࡶͳΦϖϨʔγϣϯΛ΍Γͨ͘ͳ͔ͬͨ ↓ • طଘσʔλͷ*%ʹରͯ͠ςφϯτຖʹ UFOBOU@JEʹ Λ͔͚ͨ஋Λ଍ͯ͠ id name … 1 foo 2 bar id nam e … 1 xxx 2 yyy tenant_db_1 tenant_db_2 public_db id tenant_id name … 100,001 1 foo 100,002 1 bar 200,001 2 xxx 200,002 2 yyy
  8. ؾΛ͚ͭͨϙΠϯτ σʔλ࿙Ӯͷ๷͗ํ • ύϒϦοΫ%#಺ͰશςφϯτͷσʔλΛ࣋ͭͨ Ίɺςφϯτؒͷσʔλ࿙ӮϦεΫ͕͋Δ • PostgreSQLͰ͋Ε͹ Row Level SecurityͳͲͰ

    σʔλ࿙ӮΛ๷͙͜ͱ͕Ͱ͖Δ ↓ • ہॴԽޙ͸ɺUFOBOU@JEͰඞͣߜΓࠐΉඞཁ͕ ͋Δ͜ͱΛ։ൃνʔϜ಺Ͱೝࣝ߹ΘͤΛߦͬͨ
  9. ͭΒ͔ͬͨͱ͜Ζ ֎෦αʔϏε͔Βͷґଘ • ϝʔϧͷ։෧ΫϦοΫΠϕϯτΛ֎෦αʔϏε 4FOE(SJE ͔ΒͷXFCIPPLϦΫΤετͱͯ͠ ड͚औ͍ͬͯͨ • ࣮͸XFCIPPLϦΫΤετͷத਎ʹ*%Λ࢖͍ͬͯ ͨ͜ͱ͕ޙ͔Β൑໌

    ◦ σʔλҠߦલʹૹ৴͞ΕͨϝʔϧͷΠϕϯ τΛܭଌͰ͖ͳ͍ঢ়ଶʹͳͬͯ͠·ͬͨ ↓ 
 • IDͷنଇੑΛݩʹσʔλҠߦલʹૹ৴͞Εͨ ϝʔϧͷΠϕϯτΛܭଌͰ͖ΔΑ͏ʹϩδοΫ Λվम webhook͔Β։෧ɾΫϦοΫΠϕϯτΛड ͚औΓDBʹอଘ foro-crm-api
  10. ͭΒ͔ͬͨͱ͜Ζ JSONܕͷΧϥϜͷมߋ • JSONܕͷΧϥϜ಺ʹ΋Ҡߦର৅ͷςʔϒϧͷ ID͕อଘ͞Ε͍ͯͨ • ౰વ͕ͩɺ+40/ܕͷத਎ʹ͸֎෦Ωʔ੍໿͕ ޮ͔ͳ͍ͷͰͪΐͬͱා͍ • աڈʹૠೖ͞Εͨෆਖ਼ͳσʔλ͕͋Δ

    ◦ ॻ͖ํʹΑͬͯ͸3VCZ͕ҙਤ͠ͳ͍஋ʹ Ωϟετͯ͠͠·͏৔߹͕͋ΔͷͰ஫ҙ͕ ඞཁͩͬͨ id content … 1 {“email_id”: 1} … 2 {“email_id”: “xxx”} … 3 {“email_id”: 3} … ਺஋͕ೖ͍ͬͯΔ΂͖߲໨ʹͳ͔ͥจࣈ ྻ͕ೖ͍ͬͯͨ
  11. ·ͱΊ(Ϛϧνςφϯτઃܭͷצॴ) • ։ൃΞδϦςΟΛอͭͨΊʹϚϧνςφϯτͷہॴԽΛߦͬͨ • Ϛϧνςφϯτઃܭͷצॴ ◦ Ϣʔβʔ਺ͷ૿Ճʹ൐ͬͯɺ։ൃΞδϦςΟ͕Լ͕ͬͯ͠·͏ͷ͸ྑ͘ͳ͍ઃܭ ͱ͍͑ΔͷͰ͸ͳ͍͔ 
 ◦

    Ϛϧνςφϯτʹ͢΂͖ͱ͜Ζ͚ͩہॴԽͨ͠΄͏͕͍͍ ▪ ηΩϡΞʹ࢓্͛Δͱ͜Ζͱɺ։ൃΞδϦςΟΛอ͍ͪͨͱ͜Ζ ◦ σʔλྔ΍σʔλϕʔε਺͕૿͑ΔͱɺҠߦίετ΋૿͑ΔͷͰυϝΠϯڥք͕ ݟ͑ͨλΠϛϯάͰૣΊʹରԠ͢Δͷ͕ϕετ