Plasma - gRPC streamを利用したリアルタイムなユーザー体験

439ebe4787a98881df8a59d41baf4a43?s=47 Ryo Aoyama
September 01, 2018

Plasma - gRPC streamを利用したリアルタイムなユーザー体験

iOSDC Japan 2018

時は2018年未だに定期ポーリングを使った画面更新でリソースを無駄遣いしていませんか?
FRESHではgRPC streamを利用し、サーバープッシュ方式でイベントを受け取る事ができるミドルウェアPlasmaを開発し、リアルタイムで快適なユーザー体験を提供しています。
このトークでは、Plasmaについて実際の利用例を紹介しながらお話します。

439ebe4787a98881df8a59d41baf4a43?s=128

Ryo Aoyama

September 01, 2018
Tweet

Transcript

  1. Plasma gRPC streamΛར༻ͨ͠ϦΞϧλΠϜͳϢʔβʔମݧ 2018.8.30 THU - 9.2 SUN iOSDC Japan

    2018 #iosdc Ryo Aoyama - @ra1028fe5
  2. PROFILE Ryo Aoyama CyberAgent, Inc FRESH LIVE iOS Tech Lead

    CATS (Client Advanced Technology Studio) GitHub: ra1028 Twitter: @ra1028fe5
  3. GITHUB

  4. ܳೳਓɾ༗໊ਓͳͲͷ഑৴ऀ͕։ઃ͢Δνϟϯωϧͷੜ์ૹΛࢹௌ͠ͳ͕Βίϝϯτ ͳͲͷίϛϡχέʔγϣϯΛָ͠Ή͜ͱ͕Ͱ͖ΔɺϥΠϒ഑৴αʔϏε

  5. ຊ୊΁

  6. Q. αʔόʔͷঢ়ଶมԽݕ஌ Ͳ͏΍ͬͯ·͔͢ʁ

  7. ༷ʑͳΫϥΠΞϯτ͔Βਵ࣌ߋ৽͞ΕΔσʔλͷঢ়ଶ ͦΕΛͰ͖ΔݶΓϦΞϧλΠϜʹදࣔߋ৽͢Δʹ͸...

  8. ϙʔϦϯά...?

  9. ঢ়ଶ͕มΘ͍ͬͯͳͯ͘΋ɺଟ͘ͷແବͳϦΫΤετ͕ൃੜ... ΑΓྑ͍खஈͰঢ়ଶมԽΛݕ஌͍ͨ͠

  10. ൃ଍

  11. None
  12. PLASMA gRPC streamΛར༻ͨ͠Go੡Server Pushϛυϧ΢ΣΞ SwiftGRPCΛϥοϓͨ͠iOS༻ΫϥΠΞϯτPlasmaSwift https://github.com/openfresh/plasma https://github.com/openfresh/PlasmaSwift

  13. PLASMA HTTP/2ϕʔεͰ͋ΔgRPC͕αϙʔτ͢Δ4छྨͷ௨৴ํࣜ Unary RPC (1 Request - 1 Response) Server

    streaming RPC (1 Request - Multi Response) Client streaming RPC (Multi Request - 1 Response) Bidirectional streaming RPC (Multi Request - Multi Response)
  14. PLASMA gRPC Bidirectional Streaming ʹ 1ͭͷTCPίωΫγϣϯͰෳ਺ͷRequest/Response ͜ΕΛར༻ͯ͠Server Pushܕͷσʔλ௨৴ Λߦ͏൚༻ϛυϧ΢ΣΞ

  15. ΫϥΠΞϯτଆ͔Βߋ৽Λड͚औΓ͍ͨλΠϛϯάͰΠϕϯτλΠϓ Λࢦఆͯ͠Subscribe͠ɺ༷ʑͳλΠϛϯάͰPayloadΛड͚औΕΔ

  16. PLASMA ྫ͑͹micro servicesؒͰͷϦΫΤετ਺࡟ݮͳͲɺ ΫϥΠΞϯτʹݶΒͣ޿͘ར༻Ͱ͖Δɻ ࠓճ͸iOSͰͷར༻ʹ͍ͭͯ

  17. PLASMA gRPCΛ࢖ͬͨߪಡɾ੾அॲཧ͸iOS༻ϥΠϒϥϦͷ PlasmaSwift͕αϙʔτ Objective-C޲͚gRPCʹґଘ͍͕ͯͨ͠ɺ2018/07ʹ SwiftGRPCґଘʹ࡮৽

  18. PLASMASWIFT ओͳ໾ׂ ഉଞ੍ޚͭͭ͠઀ଓɾ੾அ௨৴ͷ஥հͱঢ়ଶอ࣋ ઀ଓ͕ҙਤͤͣ੾அͨ͠৔߹͸ɺࣗಈͰϦτϥΠ

  19. PLASMASWIFT SwiftGRPCΛར༻ͨ͠Bidirectional streamingͰ͸ɺSubscribe தʹ௨৴ঢ়ଶ͕มΘͬͨ࣌ʹɺϨεϙϯε΋Τϥʔ΋དྷͳ͘ͳ Δ৔߹͕͋ͬͨ ⚠ SystemConfigurationͷSCNetworkReachabilityΛ࢖ͬͯ௨৴ ͷ؂ࢹͱ࠶઀ଓ΋PlasmaSwiftͰΑ͠ͳʹ ͜ͷํ๏͕ਖ਼͍͔͠Ͳ͏͔͸...

  20. PLASMASWIFT enum EventType: RawRepresentable { case stats(programId: String) var rawValue:

    String { /* return event type string */ } init?(rawValue: String) { /* parse payloads */ } } let eventTypes: [EventType] let rawEventTypes = eventTypes.map { $0.rawValue } let client = PlasmaClient(host: host, port: port) client.subscribe(eventTypes: rawEventTypes, retryCount: 10) { event in switch event { case .next(let payload): // Do something case .error(let error): // Error handling } } Subscribe͢ΔΠϕϯτͷఆٛ ResultͷΑ͏ͳenumͰ஋͕౉͞ΕΔ
  21. PLASMASWIFT ServerɾClientؒͰReactiveʹΠϕϯτ͕఻ൖ͞ΕΔ ౰વReactiveSwift / RxSwiftͱͷ૬ੑ΋ ReactiveΛར༻ͨ͠ΞϓϦΞʔΩςΫνϟʹೃછΉ

  22. ͲΜͳͱ͖ʹ࢖͏ͷ͔

  23. ྫ͑͹ɺࢹௌऀͷಈ޲ΛϦΞϧλΠϜʹද͍ࣔͨ࣌͠

  24. ࢹௌ਺ ίϝϯτ਺ Ԡԉ

  25. ࢹௌ਺ ίϝϯτ਺ Ԡԉ ഑৴ͷϥΠϒײΛߴΊΔͨΊɺಈըҎ֎ ΋ϦΞϧλΠϜʹߋ৽͢Δ ಈը͚ͩͰ΋ෛՙ͕ߴ͍ͷͰɺPlasmaΛ ࢖ͬͯ࠷খݶͷϦιʔεͰ࣮ݱ

  26. ྫ͑͹ɺ഑৴ऀͷઃఆͰ͙͢ʹࢹௌऀଆʹ Կ͔Λද͍ࣔͨ࣌͠

  27. Ξϯέʔτ ςϩοϓ

  28. Ξϯέʔτ ςϩοϓ ಈըͷਐߦʹ߹Θͤͯɺ഑৴Ϣʔβʔ͕ઃ ఆ͢Δͱɺଈ࣌ʹ൓өͤ͞Δඞཁ͕͋Δ

  29. ҙ֎ͱখ͍͞...ʁ

  30. খ͍͔͞Βͦ͜ʂ খ͍͞୔ࢁͷػೳʹແବͳϦιʔεΛׂ͔ͳ͍

  31. CONCLUSIONS Plasma͸gRPCϕʔεͰBidirectional StreamingΛ ར༻ͨ͠൚༻ϛυϧ΢ΣΞ class Plasma: gRPC PlasmaSwiftΛར༻͢Ε͹iOS͔Β࢖͍΍͘͢ Reactiveͱͷ૬ੑ΋ αʔόʔϓογϡʹΑΔΠϕϯτ഑৴͸ɺ։ൃऀΛ

    ॿ͚Δ͚ͩͰͳ͘ɺύϑΥʔϚϯε΍UXͷ޲্ʹܨ͕Δ
  32. Thanks GitHub: ra1028 Twitter: @ra1028fe5