Firestoreを本番運用して得た知見と事件簿 / manga-village

Firestoreを本番運用して得た知見と事件簿 / manga-village

2018/08/07 Firebase Meetup#5 登壇資料

--------------------------
追記: Blazeプラン限定ですがデータのimport/exportできるようになりました
https://firebase.google.com/docs/firestore/manage-data/export-import

Af79a541ea6541b4980c383e3968c58a?s=128

Hikaru Tooyama

August 07, 2018
Tweet

Transcript

  1. Firestoreຊ൪ӡ༻ͯ͠
 ಘͨ஌ݟͱࣄ݅฽ 2018/08/07 Firebase Meetup #5 גࣜձࣾStorm ԕࢁ ߊ(@vexus2)

  2. ࣗݾ঺հ • גࣜձࣾStorm ୅දऔక໾ ԕࢁ ߊ / @vexus2 • ςΫχΧϧίϯαϧςΟϯά΍ٕज़ࢧԉɺϓϩδΣΫτϚωδϝϯτɺ

    1on1ࢧԉͳͲ • ϦʔυΤϯδχΞ/VPoE/ΤϯδχΞϦϯάϚωʔδϟͳͲྺ೚ • ݩʑBackend Engineer͕ͩ࠷ۙ͸FrontendدΓ • Ruby / Vue / Nuxt / Firebase ͳͲ • Firebaseྺ͸9ϲ݄͘Β͍
  3. ອըϏϨοδ • ແྉϚϯΨΞϓϦΛ·ͱΊͨϏϡʔΞʔαΠτ • ʮອըϏϨοδʯͰݕࡧʂ • 2018/06ϩʔϯν • 600-800ສPV/݄͘Β͍ •

    େྔʹ͋ΔϚϯΨΞϓϦͷϦϯΫू
 ͱ͍͏Ґஔ෇͚ • ւ଑൛ͷອըଜͱ͸ؔ܎͋Γ·ͤΜʢେࣄʣ
  4. ອըϏϨοδ • ແྉϚϯΨΞϓϦΛ·ͱΊͨϏϡʔΞʔαΠτ • ʮອըϏϨοδʯͰݕࡧʂ • 2018/06ϩʔϯν • 600-800ສPV/݄͘Β͍ •

    େྔʹ͋ΔϚϯΨΞϓϦͷϦϯΫू
 ͱ͍͏Ґஔ෇͚ • ւ଑൛ͷອըଜͱ͸ؔ܎͋Γ·ͤΜʢେࣄʣ ࠓ೔࿩͢಺༰͸͜Εʹؔ࿈͢Δ ։ൃɾӡ༻ͷதͰͷಘΒΕͨ஌ݟ
  5. ອըϏϨοδͷߏ੒ ʢࠓճ͸'JSFTUPSFͷ࿩ͷΈʣ :BIPP๒Λ଱͑੾࣮ͬͨ੷༗Γ ص্ͷۭ࿦ΞʔΩςΫνϟͰ͸ ͳ͍Ξϐʔϧ

  6. ஌ݟฤ

  7. όονॻ͖ࠐΈ੍ݶ

  8. ͭΒΈ • σʔλϕʔεͷத਎ͷมߋͰɺաڈͷσʔλΛḪٴతʹ มߋ͍ͨ͠έʔε͸ଟʑ͋Δ(MySQLͰશ݅updateྲྀ͢ తͳ) • FirestoreͰ͸1ͭͷόονॲཧͰ࠷େ500σʔλ·Ͱ͠ ͔ΦϖϨʔγϣϯૢ࡞Ͱ͖ͳ͍ • ͱ͸͍͑Nສ݅୯ҐͷσʔλΛ1݅ͣͭॲཧ͢Δͷ͸݁

    ߏֻ͔࣌ؒΔ
  9. Ͳ͏͢Δ͔ • Ұׅஔ׵ͷϩʔΧϧ࣮ߦεΫϦϓτΛॻ͍ͯ ͓͍ͯඞཁͳͱ͖ʹྲྀ͢

  10. σʔλͷόοΫΞοϓ໰୊

  11. ͭΒΈ • Firestore͸όοΫΞοϓ(export)΍ϦετΞ(import) ͕·ͩͳ͘ɺྫ͑͹಺෦ىҼͰσʔλ͕ଛࣦͯ͠͠ ·͏Մೳੑ͕ৗʹ͋Δ • 2ճ΄Ͳ΍Β͔ͨ͜͠ͱ͕͋Δʢࣄ݅฽ฤͰ঺հʣ • production/devͳͲ؀ڥΛ·͍ͨͰಉҰͷେྔϚε λσʔλ͕ඞཁͳͱ͖ʹొ࿥͕େม

  12. Ͳ͏͢Δ͔ • ·ͩࠜຊతͳղܾํ๏͸ͳ͍͕ɺαʔυύʔςΟ Ͱimport-exportͷϥΠϒϥϦ͕͋ΔͷͰඞཁʹԠ ͯͦ͡ΕΛ࢖͏ • github.com/jloosli/node-firestore-import-export • ͱ͸͍͑ৗʹखಈόοΫΞοϓऔΓଓ͚Δͷ͸݁ ߏͭΒͦ͏ɻʢಛʹσʔλSubCollectionͷ݅਺

    ͕ଟ͍ͱʣ
  13. Query͕ऑ͍

  14. ͭΒΈ • ࢖͑ΔQuery͸ඞཁ࠷௿ݶͳ΋ͷʹݶΒΕ͍ͯΔɻ • ౳Ձ(==) ൣғ(> >= < <=)ͷΈɻnot equal͸ͳ͍

    • ෦෼ҰகݕࡧɾશจݕࡧͳͲͰ͖ͳ͍ • ʮdescriptionʹʰკղʱͱؚ·ΕΔϚϯΨΛݕࡧʯͷΑ͏ͳ ͜ͱ͕ग़དྷͳ͍ • Sub Collectionʹର͢ΔQuery͕ʢ਌ίϨΫγϣϯΛಛఆ͍ͯ͠ͳ͍ঢ় ଶͰ͸ʣ࢖͑ͳ͍ʢࠓճ͸৮Εͳ͍ʣ
  15. Ͳ͏͢Δ͔ • Ͱ͖ͳ͍͜ͱ͸ແཧʹFirestoreͰ΍Βͳ͍ • ୅ସҊͱͯ͠͸Elasticsearch΍
 ͳͲΛͷར༻Λݕ౼͢Δ

  16. ࣄ݅฽ฤ

  17. ࣄ݅1: Truncateࣄ݅

  18. ͳʹ͕͓ͬͨ͜ • ອըϏϨοδͷϝΠϯCollectionʮitemsʯͷ શσʔλΛ;ͬͱ͹ͨ͠

  19. None
  20. None
  21. ΧδϡΞϧʹશফ͠Ͱ͖ͯ͠·͏

  22. ڭ܇ • ۃྗFirestoreͷWebίϯιʔϧ͔Βૢ࡞͸͠ͳ͍ํ͕ྑͦ͞͏ • ͱ͸͍͑ϑΟϧλػೳศརͳͷͰͲ͏ͯ͠΋࢖͏έʔε͸ଟ ͍ŋŋŋ • ຊ൪ӡ༻͢Δ্Ͱ͸͔ͳΓݖݶߜͬͨ΄͏͕ྑͦ͞͏ • ࣗલͰ؅ཧը໘Λ࡞Δ

    • ϖʔδωʔγϣϯ࣮૷஍ຯʹͩΔ͍ɻ؅ཧը໘࡞Δ͔Ͳ͏͔ ͸޻਺ͱ҆શੑͷτϨʔυΦϑ
  23. ࣄ݅2: શσʔλۭͬΆࣄ݅

  24. ͳʹ͕͓ͬͨ͜ • ອըϏϨοδͷϝΠϯCollectionʮitemsʯͷ த਎Λ΄΅શۭͯͬΆʹͯ͠͠·ͬͨ σʔλͷശ͸͋Δ͕த਎͕titleҎ֎શͯফ͑ͯ͠·ͬͨঢ়ଶ

  25. Ͳ͏ͯ͜͠͏ͳͬͨ const itemData = itemDoc.data(); const title = itemData.title; batch.set(itemCollection.doc(itemData.itemId),

    { title: title.replace(/ /, ‘’) });
  26. Ͳ͏ͯ͜͠͏ͳͬͨ const itemData = itemDoc.data(); const title = itemData.title; batch.set(itemCollection.doc(itemData.itemId),

    { title: title.replace(/ /, ‘’) }); શσʔλΛḪٴతʹมߋ͢Δόο ν಺ɺطଘͷσʔλʹTFUͯ͠͠·ͬ ͨͨΊ্ॻ͖ͯ͠͠·ͬͨ
  27. Ͳ͏ͯ͜͠͏ͳͬͨ const itemData = itemDoc.data(); const title = itemData.title; batch.set(itemCollection.doc(itemData.itemId),

    { title: title.replace(/ /, ‘’) }); શσʔλΛḪٴతʹมߋ͢Δόο ν಺ɺطଘͷσʔλʹTFUͯ͠͠·ͬ ͨͨΊ্ॻ͖ͯ͠͠·ͬͨ batch.set(itemCollection.doc(itemData.itemId), { title: title.replace(/ /, ‘’) }, { merge: true }); batch.update(itemCollection.doc(itemData.itemId), { title: title.replace(/ /, ‘’) }); ͪ͜Βͷύλʔϯ͸ ҙਤͨ͠ڍಈ
  28. ڭ܇ • ςετίʔυେࣄ • طଘσʔλʹରͯ͠ߋ৽͢Δͱ͖͸ۃྗupdateΛ ࢖͏ • { merge: true

    } ͸ϨϏϡʔͰ΋ݟམͱ͕ͪ͠… • ʢFirestoreόοΫΞοϓ΍ϦετΞػೳ͕ૣ͘ཉ͍͠ʣ
  29. ·ͱΊ

  30. ૯ׅ • ଞʹ΋Collection౰ͨΓ࠷େ1ඵ1݅ͷॻ͖ࠐ Έ੍ݶ(shardingͰҰԠରԠՄೳ)ͳͲFirestoreͷ੍໿ ͸͋Δ͠Ϋη΋͋Δɻ • ͭΒΈͷ࿩͹͔Γڍ͕͛ͨɺ੍໿΍੍ݶΛཧ ղ্ͨ͠Ͱ࢖͏ͷͰ͋Ε͹͜ͷ্ͳ͘ศརͳ αʔϏεͩͱࢥ͏

  31. Thank You!