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

Firebaseを使った成長するモバイルアプリのための高速なプロダクト開発 / Rapid Mobile Application Development using #Firebase

D107509659b6f023aa60e77aef1db237?s=47 laiso
February 16, 2019

Firebaseを使った成長するモバイルアプリのための高速なプロダクト開発 / Rapid Mobile Application Development using #Firebase

モバイルアプリケーションの開発プロジェクトはあらゆる意味で速度との闘いです。

複雑化するシステムアーキテキチャやプラットフォーム、開発ツールのエコシステム。数多くある選択肢の中から私達は2018年にFirebaseを使い、1つのモバイルアプリケーションを開発しました。

本トークではその時の経験を元に、プロダクト開発を高速化するために技術者視点でどのような貢献ができるのか? という知見をシステムアーキテクトの立場としてお伝えします。

D107509659b6f023aa60e77aef1db237?s=128

laiso

February 16, 2019
Tweet

Transcript

  1. FirebaseΛ࢖ͬͨ੒௕͢ΔϞ όΠϧΞϓϦͷͨΊͷߴ଎ͳ ϓϩμΫτ։ൃ id:laiso

  2. ্ཱͪ͛ظͷϓϩμΫτ։ൃ ͷ଎౓Λ્֐͢Δ΋ͷ • ΑΓଟ͘ͷਓһͰ • ΑΓଟ͘ͷର৅Λ • มߋɺ؅ཧ͠ଓ͚Δ • ෆཁͳ΋ͷΛ։ൃ͠ͳ͍ɻର৅ΛߜΔ͜ͱͰ

    ߴ଎Խ͸Ͱ͖Δ
  3. ੒௕ظͷϓϩμΫτ։ൃͷ଎ ౓Λ્֐͢Δ΋ͷ • ͞ΒͳΔਓһ૿Ճɻ૿͍͑ͯ͘มߋɺ؅ཧ͠ ଓ͚Δର৅ͷγεςϜ • ্ཱͪ͛͸Ͱ͖Δ͕ஈ֊త੒௕Λड͚ೖΕΒ Εͳ͍γεςϜΞʔΩςΫνϟ • ։ൃ͢Δର৅ΛݮΒ͢͜ͱ͸Ͱ͖ͳ͍ͷͰε

    έʔϧ͢ΔΑ͏ϦΞʔΩςΫνϟϦϯά͢Δ
  4. ΞʔΩςΫτతδϨϯϚ • ߴ଎ʹ্ཱͪ͛ΒΕͳ͍ͱ੒௕ͤͣʹϓϩμΫτ͕ऴྃͯ͠͠·͏ • ߴ଎ʹ্ཱͪ͛Δ͜ͱΛ໨ࢦͨ͠ΞʔΩςΫνϟ͕੒௕Λड͚ೖ ΕΒΕͳ͍ • ੒௕Λड͚ೖΕΔͨΊͷγεςϜվमͰ੒௕͕ࢭͬͯ͠·͏ɻͦ Ε͕ͲͷϓϩδΣΫτͰ΋ൃੜ͍ͯ͠Δ(࠶ݱੑͷ͋Δ໰୊) •

    ελʔτΞοϓ͸େ͖֦͘େ͢Δ͜ͱΛલఏʹ͍ͯ͠ΔͷͰߴ଎ʹ ্ཱͪ͛ͦͷ··େ͖͘੒௕͢Δ͜ͱΛݟӽͯ͠࠷ॳ͔Βઃܭ͠ ͍ͨ
  5. FirebaseΛ࢖ͬͨ੒௕͢ΔϞ όΠϧΞϓϦͷͨΊͷߴ଎ͳ ϓϩμΫτ։ൃ

  6. ࡞͍ͬͯΔ΋ͷ • Ϣʔβʔ͕ࣸਅΛ౤ߘ͢ΔSNSͳϞόΠϧΞϓϦ • ౦ೆΞδΞͷϩʔΧϧࢢ৔޲͚ • iOS/AndroidΞϓϦ൛ɺWeb൛+όοΫΤϯυɺόο ΫΦϑΟε(؅ཧը໘)ͷ4ͭͷίʔυϕʔε͕͋Δ • ΤϯδχΞ͸1.5ਓ(͔͚΋ͪ)ɻϑΝʔετϦϦʔε

    (iOS)·Ͱͷظؒ͸60೔ɻ
  7. ·ͣ࠷ॳʹFirebaseΛ࢖͏͜ͱ ΛܾΊͨ • ੲ͔ΒBaaSͷݚڀΛ͍ͯͯ͠1ਓͰ࡞Γ͖ΔͳΒ͜Ε͕࠷ڧͩͳʙͱ͍͏ؾ͕࣋ͪ ͋ͬͨ • ϞόΠϧΞϓϦͷόοΫΤϯυ(Web API)ʹಛԽͨ͠αʔϏεͷ·ͱΊ http:// iphone-dev.g.hatena.ne.jp/laiso/20120223/1330007695

    • ෆ࣮֬ੑͷߴ͍΋ͷΛߴ଎ʹ։ൃ͢Δखஈͱͯ͠Railsʹ͍ۙࢥ૝Λײ͍ͯͨ͡ • ʮRuby on Rails ͸ɺۃগਓ਺(ཧ૝͸Ұਓ) ͕αʔϏε։ൃ͢Δͷʹཧ૝తͳϑ ϨʔϜϫʔΫͰ͋ΓɺͦΕΛ໨ࢦ͠ଓ͚͍ͯΔͱߟ͍͑ͯΔɻRuby on Rails ͷෑ ͔ΕͨϨʔϧʹ৐Δ͜ͱͰɺҰؾʹ໨త஍ʹ౸ୡ͢Δ͜ͱ͕Ͱ͖Δɻʯ • Ruby on Rails ͷັྗͱࢥ૝ https://www.bokukoko.info/entry/2018/03/28/221026
  8. ٕज़બఆͷީิʢϞόΠϧΞ ϓϦʣ • React Native • Flutter • PWA •

    → ࠷ऴతʹϞόΠϧΞϓϦ͸iOS/Android SDKʹ
  9. iOS/Android SDKʹͨ͠എܠ • νʔϜ͕׳Εֶͯͯशίετ΋௿͍ • Ұ൪ෆ࣮֬ੑͷߴ͍৔ॴͳͷͰΑΓγϯϓϧ ʹมߋͰ͖ΔΑ͏ʹ͍ͨ͠ • λϕϦʔ΍KomercoͷࣄྫͳΜ͔΋ࢀߟʹ

  10. ٕज़બఆͷީิʢαʔόʔα Πυʣ • AWS/Ruby on Rails/MySQL/ίϯςφαʔϏε • GAE/Go/Datastore • Heroku/Django/PostgreSQL

    • → લ໘ͷFirebase+αʔόʔϨε͔Βઃܭ͢Δ͜ͱͰ ͜ͷϨΠϠʔͷܾఆΛޙճ͠ʹͰ͖Δʢ࣮ࡍ͸Cloud Functionsͷίʔυͱͷڞ༗ͱ͍͏ࢹ఺͕͋ͬͨʣ
  11. αʔόʔϨεΞʔΩςΫνϟ • αʔόʔαΠυ։ൃ͸͋Δʂ • ৗ࣌Քಇ͢ΔαʔόʔϦιʔε͕ͳ͍͚ͩ • ैདྷͷαʔόʔ͕୲͏໾ׂΛϚωʔδυαʔϏ ε͕੥͚ෛ͏ • εχϖοτ୯ମͷ࣮ߦ؀ڥͰ͋ΔFaaS͸ͦͷγ

    ϯϓϧͳར༻ྫ
  12. Functionத৺ͷಈ࡞؀ڥ • αʔόʔͷঢ়ଶʹΑΔ෭࡞༻ͷͳ͍ؔ਺࣮ߦ • ίʔυ͕มΘͬͯͳ͚Ε͹ಉ͡Α͏ʹಈ࡞͠ ଓ͚Δ • ো֐ରԠ༻ͷMacbookΛ࣋ͬͯόΧϯεʹߦ ͔ͳ͍͍ͯ͘ʂ

  13. ٕज़બఆʢϑϩϯτΤϯυʣ • Next.js(React) • SSR on Cloud Functions(Express/Node.js) • Firebase

    Hosting(ϦόʔεϓϩΩγ)
  14. ϑϩϯτΤϯυ(Web൛) • SNSγΣΞɺSEOྲྀೖͳͲͷ໨తͰ࠷ޙʹ௥Ճͨ͠ • ඞཁे෼Λຬͨͤ͹͍͍ͷͰWebαʔόʔΛཱͯͣʹSSRͰ࣮ݱ • όοΫΤϯυͷ1 Function͕SSRͯ͠ɺͦΕ͕Firebase Hosting ܦ༝Ͱެ։͞Ε͍ͯΔͱ͍͏ମ੎

    • ͷͪʹWordPressͰߏஙͨ͠CMSͱ౷߹ͨ͘͠ͳΓɺ͜ͷ༻్ ͩͱFirebase HostingΑΓNetlifyͷ͕খճΓ͕ޮ͖ͦ͏ͩͱߟ͑ ͸͡Ίͨ
  15. ٕज़બఆʢόοΫΦϑΟεʣ • AngularΛ࢖ͬͨSPA + Firebase Hosting • Cloud Functions/Cloud Tasks/Cloud

    Scheduler • Google App Engine(Node.js) FunctionsͰෆ଍ ͢Δ෦෼͚ͩϗετ
  16. ؅ཧը໘ʢόοΫΦϑΟεʣ • ʮαʔόʔαΠυͷίʔυʯͷதʹؙͬͱೖΕΔैདྷͷ ։ൃํ๏͸ආ͚͔ͨͬͨ • ؅ཧը໘ͷγεςϜͷӨڹ͕ΞϓϦέʔγϣϯଆʹग़ͨ Γɻݖݶ؅ཧ͕೉͘͠ͳͬͨΓ • ؅ཧը໘Ͱ࢖͏DBΛಠཱ͍ͤͨ͞ •

    ઐ༻ͷFirebaseϓϩδΣΫτԽͯ͠ϚϧνFirestoreߏ੒ ʹͨ͠
  17. FirebaseΛ࢖ͬͨαʔόϨε ΞʔΩςΫνϟͷ֓ཁ • Firebaseͷ࣮ଶ͸GCP͓·͔ͤίʔε • ශऀͷҝͷϚΠΫϩαʔϏεΞʔΩςΫνϟ • ఏڙ͞ΕΔίϯϙʔωϯτ͸GCPͰDIY͢Δ͜ͱ ΋Մೳ •

    େ͖͘੒௕͢Ε͹GCPΛ࢖ͬͨຊ֨తͳϚΠΫϩ αʔϏεΞʔΩςΫνϟʹҭͯΔ
  18. Firestore SDK Λ࢖ͬͯྑ͔ͬ ͨ͜ͱ • Web API։ൃ͕ෆཁ • ΞϓϦͰAPIΫϥΠΞϯτϞδϡʔϧͷ࣮૷͕ ෆཁ

    • Ωϟογϡ͕ڧྗͰΦϑϥΠϯϑΝʔετͳ UI͕࡞ΕΔ
  19. ΞϓϦ࣮૷ϑϩʔ • iOS/AndroidͲͪΒ޲͚ʹػೳΛ։ൃ͢Δͷ͔ ܾΊΔ • ͻΒ͢ΒUI࣮૷ • αʔόʔαΠυͷ͜ͱ͸͋·Γߟ͑ͳ͍ͯ͘ ͍

  20. αʔόʔαΠυ࣮૷ϑϩʔ • ͓΋ΉΖʹNode.jsͰFirestoreΛࢀরૢ࡞͢Δ ίʔυΛॻ͖࢝ΊΔ • ͋Δఔ౓ݕূͨ͠ΒCloud Functionsʹ৐ͤͯ ςετΛॻ͘ • σϓϩΠ

  21. όοΫΦϑΟε։ൃϑϩʔ • جຊతʹ࠷ॳʹઐ༻UIΛߏங͠ͳ͍(ఆܕۀ຿ͱͯ͠ཁ݅ ͕ఆ·͍ͬͯͳ͍͔Β) • εϓϨουγʔτɺFirebaseίϯιʔϧ௚ૢ࡞ɺNode.js εΫϦϓτ࣮ߦ(BOTԽؚΉ)Λ׆༻ • ຖ೔ಉ͡εΫϦϓτΛ࣮ߦ͠͸͡ΊͨΒࣗಈԽˠϢʔ βʔ͕ଈ࣌ೖྗ͢Δ஋͕͋Ε͹؅ཧUIԽ

    • ϓϩμΫτ։ൃ͚ͩʹϑΥʔΧε͢Δ࢓૊Έ
  22. ࣮ݱͨ͠ϓϩμΫτ։ൃϑ ϩʔ • िͷ͸͡Ίʹେ୾ͳػೳมߋΛࢥ͍ͭ͘ • 2, 3೔ͰαʔόʔαΠυɾΫϥΠΞϯταΠυ ࣮૷͠ϦϦʔε • ि຤͔Βར༻͞Ε͸͡Ί࣍ͷिʹৼΓฦΔ

  23. ໰୊ൃੜ

  24. ൃੜͨ͠໰୊ • ϦϦʔεޙ2,3ϲ݄ͨ͋ͨ͠ΓͰϢʔβʔ͕૿Ճ • ͩΜͩΜΞϓϦͷը໘ඳը·ͰͷԠ౴଎౓͕མ͍ͪͯ͘ • σόοάͯ͠ΈΔͱFirestoreͷ௨৴෦෼ʹ͔ͳΓͷ࣌ؒΛ࢖ͬ ͍ͯΔ • ௨৴஗ԆΛى఺ͱͨ͠୺຤Ϧιʔε(CPU/ϝϞϦ)ͷ઎༗

    • ௨৴ͷϦΞϧλΠϜੑΛظ଴࣮ͯ͠૷͍ͯ͠ΔΑ͏ͳ෦෼ά Ϧονͯ͠͠·͏
  25. Firestore(US region)ͷԠ౴଎౓ ໰୊ • ։ൃ࣌ʹ͸ڐ༰Ͱ͖Δ଎౓ͩͬͨ • ઀ଓස౓ͱDBͷσʔλ૯ྔ͕૿͑ɺΞϓϦཁ݅΋ඇಉظ ઀ଓ͕૿͖͑ͯͨ͋ͨΓͰݦࡏԽ • Ϣʔβʔͷଟ͍ԤถͰ͸͜ͷ໰୊ͷιϦϡʔγϣϯ͸ඞཁ

    ͳ͘ɺWebݕࡧͯ͠΋ग़ͯ͜ͳ͍ͷͰࣗྗͰղܾ͢Δඞཁ ͕͋Δ • Firebase SDKʹύονΛ౰ͯͯͻͨ͢ΒϓϩϑΝΠϦϯά
  26. Firestore(US region)ͷԠ౴଎౓ ໰୊ • ΞϓϦͰ͸ৗ͍࣌ͭ͘΋ͷυΩϡϝϯτऔಘ௨৴(gRPC) ͕૸͓ͬͯΓɺ݁ՌΛΫϥΠΞϯταΠυδϣΠϯͯ͠UI Λߏ੒͢ΔͷͰ͢΂ͯͷ௨৴׬ྃΛ଴ͪड͚Δඞཁ͕͋ͬ ͨ • ࢼ͠ʹΞϓϦͷ֎Ͱطଘͷ1υΩϡϝϯτ͚ͩऔಘͯ͠΋

    ݁ߏ஗͍(TTFB 2-3ඵ) • Firestore SDKͷίωΫγϣϯͷ਺ΛݮΒ͢͜ͱ͕ൈຊత ͳରࡦʹͳΔͱ൑அ͢Δ
  27. Firestore SDKͷίωΫγϣϯ ͷ਺ΛݮΒͨ͢Ίͷઓུ • ΞϓϦ্Ͱ૸ΔFirestoreͷΫΤϦຊ਺Λ࠷খ ݶʹ͢Δ(ΫϥΠΞϯταΠυͷ࠷దԽ) • ݱࡏද͍ࣔͯ͠ͳ͍ը໘ͷίωΫγϣϯ͕ όοΫάϥ΢ϯυͰ૸Βͳ͍Α͏ʹ •

    ΫϥΠΞϯταΠυΩϟγϡͷಋೖ
  28. ը໘ߋ৽͕஗Ԇ͠ͳ͍࢓૊Έ • ΠϯϝϞϦʹڞ༗ঢ়ଶΦϒδΣΫτΛอ࣋ɻFirestoreυ ΩϡϝϯτΛ௚઀ೖΕΔ(ྫ users/ID) • ϓϨθϯςʔγϣϯ૚͔Β͸ঢ়ଶΦϒδΣΫτΛ؂ࢹ͢Δ • UIͷૢ࡞࣌఺Ͱ௨৴։࢝+ΩϟογϡΛߋ৽ͯ͠ը໘൓ө ͢Δ

    • ௨৴͕׬ྃͨ͠Β௨஌ͯ͠ঢ়ଶΦϒδΣΫτΛ্ॻ͖ɻࣦ ഊͨ͠ΒΤϥʔ௨஌ͯ͠revert
  29. ΦʔέετϨʔγϣϯ૚ • ΫϥΠΞϯταΠυδϣΠϯ͕ඞཁͷͳ͍read onlyͳσʔλߏ ଄ΛΠϕϯτۦಈͳFunctionͰੜ੒ • શϢʔβʔ͕ը໘͝ͱʹಉ͡σʔλΛಡΈࠐΈ͍ͨέʔεͰ1υ Ωϡϝϯτʹ·ͱΊΔ • Function

    -> Firestore ͸ US -> US ͳͷͰظ଴͢Δ൓ө଎౓͕ ͋ͬͨ • ͜ΕͰ΋ 1υΩϡϝϯτ͋ͨΓͷԠ౴଎౓(TTFB 2-3ඵ)͸͋ͬͨ
  30. AlgoliaΛ࢖ͬͨதؒαʔόʔͷ ಋೖ • શจݕࡧͷΈͳΒͣΫϥΠΞϯταΠυδϣ ΠϯͷࠐΈೖͬͨΫΤϦʹͳΔ෦෼Λந৅Խ ͢Δ • ΞδΞʹAPIαʔόʔ͕͋ΓԠ౴଎౓͸ൈ܈ • Firestore

    SDKͱ͸ಠཱͨ͠ϞδϡʔϧͳͷͰ ΦϑϥΠϯΩϟγϡͳͲ͸ޮ͔ͳ͍
  31. Cloud Firestore REST API • JS SDK(ϒϥ΢β޲͚)ͷ಺෦࣮૷ΛಡΜͰͯώϯ τΛಘͨ • Firestore

    SDK಺ͷgRPCΫϥΠΞϯτΛ௨ͣ͞ʹ ௚઀RESTࢀর͢Δ • DBͷυΩϡϝϯτΛͦͷ··ಡΈࠐΉ͚ͩͳΒ͜ Ε͕γϯϓϧɻϖʔδϯά༻ͷύϥϝʔλ΋͋Δ
  32. ࠷దԽΛ͕Μ͹ͬͨ݁Ռ • ઀ଓܦ࿏͕෼ࢄ͞ΕFirestoreΛ௚ͰಡΈࠐΜ Ͱ͍Δ෦෼ͷ஗Ԇ΋ؾʹͳΒͳ͍଎౓ʹ • ΞϓϦΤϯδχΞ/αʔόʔαΠυΤϯδχΞ ͕׬શʹ෼ۀ͍ͯ͠ΔνʔϜͩͱ໰୊ղফ͸ ݫ͔ͬͨ͠ͷ͔΋ɾɾ(ΞϓϦͰσόοΫ͠ͳ ͕ΒαʔόʔαΠυͷίʔυΛॻ͖׵͑ͯݕ ূ͢Δඞཁ͕͋ͬͨ)

  33. ͔͠͠ʂ • Cloud Firestore GAʹͳͬͯAsiaϦʔδϣϯ΋ Ͱ͖ͨͷͰࠓޙ͸ؾʹ͠ͳͯ͘Α͘ͳΓͦ͏

  34. ·ͱΊ • FirebaseͰαʔόϨεΞʔΩςΫνϟΛߏ੒ͨ͜͠ͱͰ։ൃ޻਺ ͕൒෼ҎԼʹͳΓɺߴ଎ʹϓϩμΫτ։ൃ͕Ͱ͖ΔΑ͏ʹͳͬͨ • Firebaseͷج൫͸GCPͰ͋ΓɺϓϩμΫτͷ੒௕ͱͱ΋ʹ௧Έ͕ গͳ͘ஈ֊తʹϚΠΫϩαʔϏεΞʔΩςΫνϟʹ͍ͯ͘͜͠ͱ ͕Մೳ • Cloud

    Firestore ಛ༗ͷ᠘΋͕͋ͬͨΤϯδχΞϦϯάͰղܾͨ͠ • ਖ਼ࣜ൛͕ϦϦʔε͞ΕFirestoreͱCloud Functions͕౦ژϦʔδϣ ϯʹདྷͨͷͰΑΓ࢖͍΍͘͢ͳΓࠓޙ͞Βʹࣄྫ͕૿͑Δ͸ͣ