Slide 1

Slide 1 text

The way of 
 truly serverless application Firebase.Yebisu #1

Slide 2

Slide 2 text

ࣗݾ঺հ ࡾӜ ࿨໵ (ID: miup) • ࠓ೥৽ଔͰೖࣾ (ࠃ಺ࣄۀ։ൃ෦ॴଐ) • ݄̑ͷ഑ଐ͔Β Firebase Λ৮Γ࢝Ίͨ • iOS ΞϓϦ͸̐೥͘Β͍ॻ͍͍ͯΔ

Slide 3

Slide 3 text

Truly Serverless?

Slide 4

Slide 4 text

Truly Serverless • ج൫͸͢΂ͯ֎෦ BaaS, SaaS ʹґଘ • ॻ͘ͷ͸ΫϥΠΞϯτΞϓϦέʔγϣϯͱͦ ΕΒαʔϏεͱͷ࿈ܞͷΈ

Slide 5

Slide 5 text

Firebase Ͱे෼Ͱ͸ʁ

Slide 6

Slide 6 text

Firebase ͷ೉఺ • DB ͷΫΤϦ͕ѹ౗తʹऑ͍ • FireStore Ͱ΋ෳࡶͳΫΤϦ͸·͔͚ͩͳ͍

Slide 7

Slide 7 text

ΫΤϦ͕ऑ͍ͱʁ • ΫϥΠΞϯταΠυδϣΠϯ͕ඞཁ • ඇಉظ͕ॏͳͬͯͭΒ͍ • όάͷԹচ • ηϧͷߴ͞ܭࢉͱ͔͏·͍͔͘ͳ͍ https://qiita.com/miuP/items/ce3a3888d5411d2f8e70

Slide 8

Slide 8 text

Solution • Realm • ֎෦ݕࡧΤϯδϯΛ࢖͏

Slide 9

Slide 9 text

Algolia Search • શจݕࡧΤϯδϯ • ೔ຊޠରԠ • FireStore ͷશจݕࡧͷͱ͜ΖͰνϣϩͬͱ৮ ΕΒΕ͍ͯΔ
 https://firebase.google.com/docs/firestore/solutions/search


Slide 10

Slide 10 text

࿈ܞ • ॻ͖ࠐΈݖݶͷ API Key ΛΫϥΠΞϯτͰ࣋ ͯͳ͍ • όοΫΤϯυΞϓϦέʔγϣϯ͕લఏ

Slide 11

Slide 11 text

Archtecture #BDLFOE
 "QQMJDBUJPO 'JSFCBTF &YUFSOBM4FSWJDF .PCJMF"QQ : Read : Write

Slide 12

Slide 12 text

Firebase ͚ͩͰͳΜͱ͔͍ͨ͠

Slide 13

Slide 13 text

CloudFunctions • HTTP ΍ DB ΁ͷมߋΛϑοΫʹಈ࡞͢Δ Node.js ؀ڥ • ΋ͪΖΜ TypeScript Ͱ΋ॻ͚Δ • ֎෦ API Λୟ͚Δ • Push ௨஌ૹΕΔ

Slide 14

Slide 14 text

Architecture 'JSFCBTF
 
 
 &YUFSOBM
 4FSWJDF .PCJMF"QQ : Read : Write $' %#

Slide 15

Slide 15 text

Write 'JSFCBTF
 
 
 $' %# .PCJMF"QQ &YUFSOBM
 4FSWJDF callback Firebase Cloud Messaging
 Silent Push

Slide 16

Slide 16 text

Read 'JSFCBTF
 
 
 &YUFSOBM
 4FSWJDF .PCJMF"QQ %# Observe Realtime Value Get main Data

Slide 17

Slide 17 text

ίʔυྫ

Slide 18

Slide 18 text

Algent • [WIP] • Algolia ͷΫϥΠΞϯτͷ wrapper • Decodable ͳܕΛ Response Ͱࢦఆ • ˑˑˑˑˑ

Slide 19

Slide 19 text

Write functions.database.ref(‘path/to/user/{userID}').onCreate(async event => { let userID = event.params!.userID let firUser = await admin.database() .ref(`path/to/user/${userID}`) .once(‘value').then(snap => snap.val()) let userIndex = algolia.initIndex('user') let user = new User(userID, firUser) return userIndex.addObject(user) // send FCM for callback }) ref: https://qiita.com/star__hoshi/items/6ee9d1413a34ca5849eb

Slide 20

Slide 20 text

Request struct AlgoliaFeedRequest: AlgoliaRequestProtocol { typealias HitType = Algolia.Feed var indexName: String { return "feed" } var query: AlgentQuery { let query = AlgentQuery() return query } }

Slide 21

Slide 21 text

Read // search from algolia using Algent // Result, Error> Algent.shared.search(request: AlgoliaFeedRequest()) Firebase.Post.databaseRef .child(feed.objectID) .child(“likes/count") .observe(.value) { [weak self] snapshot in if snapshot.exists() { self?.likeCountString.value = "\(snapshot.value as? Int)" } else { self?.likeCountString.value = "0" } }

Slide 22

Slide 22 text

Sample • SNS ͬΆ͍΍ͭ • Feed ͱ User ͸ Algolia ͔Βݕࡧ • ͍͍Ͷʂ΍౤ߘ਺ͳͲͷมಈ͢Δ஋ͷΈΛ RealtimeDB͔ΒObserve • Silent Push ͔Βߋ৽͸ະ࣮૷

Slide 23

Slide 23 text

σϞ
 https://github.com/miuP/AlgoliaFirebaseSample

Slide 24

Slide 24 text

·ͱΊ • Truly Serverless • Firebase ͰͰ͖ͳ͍͜ͱ͸ແཧͤͣผͷࡦΛ ࿅Δ • ֎෦αʔϏεͱͷ࿈ܞ΋໰୊ͳ͍ ϞόΠϧΤϯδχΞ͚ͩͰαʔϏε࡞Δͧʙʂ

Slide 25

Slide 25 text

Q&A