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

Cloud Functions in Go at Mercari

BABAROT
July 13, 2019

Cloud Functions in Go at Mercari

BABAROT

July 13, 2019
Tweet

More Decks by BABAROT

Other Decks in Technology

Transcript

  1. マイクロサービスの成果を可視化する
    @b4b4r07 (Jul 13, 2019) / Go Conference 19 Summer in Fukuoka
    Cloud Functions in Go at Mercari

    View Slide

  2. BABAROT / @b4b4r07
    Mercari, Inc.

    SWE @ Microservices Platform
    Blog / tellme.tokyo

    View Slide

  3. View Slide

  4. View Slide

  5. Monolith Microservices
    Current status
    Migrating ...

    View Slide

  6. Monolith Microservices
    Current status
    Migrating ...
    Why Microservices?

    View Slide

  7. https://speakerdeck.com/tcnksm/kai-fa-zhe-xiang-kefalseji-pan-wotukuru?slide=22

    View Slide

  8. https://speakerdeck.com/tcnksm/kai-fa-zhe-xiang-kefalseji-pan-wotukuru?slide=22

    View Slide

  9. https://speakerdeck.com/tcnksm/kai-fa-zhe-xiang-kefalseji-pan-wotukuru?slide=22

    View Slide

  10. https://speakerdeck.com/tcnksm/kai-fa-zhe-xiang-kefalseji-pan-wotukuru?slide=22

    View Slide

  11. https://speakerdeck.com/tcnksm/kai-fa-zhe-xiang-kefalseji-pan-wotukuru?slide=22

    View Slide

  12. https://speakerdeck.com/tcnksm/kai-fa-zhe-xiang-kefalseji-pan-wotukuru?slide=22

    View Slide

  13. Scaling
    Organization
    Solving
    Technical Issues
    組織を再編し組織としてのアウトプットを

    最大化するため
    技術的な課題を解決するため

    View Slide

  14. Scaling
    Organization
    Solving
    Technical Issues
    組織を再編し組織としてのアウトプットを

    最大化するため
    技術的な課題を解決するため
    果たして本当にこれらが解決されているか?

    View Slide

  15. Scaling
    Organization
    Solving
    Technical Issues
    組織を再編し組織としてのアウトプットを

    最大化するため
    技術的な課題を解決するため
    果たして本当にこれらが解決されているか?
    Let's measure!

    View Slide

  16. Go

    Google Cloud Functions

    View Slide

  17. DevStats

    View Slide

  18. Agenda
    •Cloud Functions Go, DevStats
    •Cloud Functions How we use
    •Cloud Functions Tips

    View Slide

  19. Agenda
    •Cloud Functions Go, DevStats
    •Cloud Functions How we use
    •Cloud Functions Tips

    View Slide

  20. 1. Cloud Functions Go, DevStats

    View Slide

  21. What's DevStats?

    View Slide

  22. •Datadog Dashboard
    •Go package for building a collector
    •Collectors
    DevStats

    View Slide

  23. マイクロサービスの数やそれに関わる人数、
    デプロイ数など、マイクロサービスとその
    開発者に関わるさまざまなメトリクス
    (Developer Metrics)を可視化した
    Datadogのダッシュボード
    Datadog Dashboard

    View Slide

  24. Go package for building a collector
    Collector(Developer Metricsとして可
    視化するのに必要なデータソースから

    メトリクスを生成しデータストアに保存する
    Cloud Function)を実装するために必要
    な機能を抽象化して提供するパッケージ

    View Slide

  25. Go package for building a collector
    Collector(Developer Metricsとして可
    視化するのに必要なデータソースから

    メトリクスを生成しデータストアに保存する
    Cloud Function)を実装するために必要
    な機能を抽象化して提供するパッケージ

    View Slide

  26. Collectors
    devstatsパッケージを使って実装された
    各メトリクスの収集器のあつまり。

    例えば、deploy collectorであれば、

    デプロイに関する情報を収集しタグ付け、
    メトリクスを作成し(producer)、 任意の
    データストア(Datadogなど)に送信する
    (exporter)。

    View Slide

  27. Collectors
    devstatsパッケージを使って実装された
    各メトリクスの収集器のあつまり。

    例えば、deploy collectorであれば、

    デプロイに関する情報を収集しタグ付け、
    メトリクスを作成し(producer)、 任意の
    データストア(Datadogなど)に送信する
    (exporter)。
    devstats project
    collectors
    data
    Cloud Functions

    View Slide

  28. Collectors
    devstatsパッケージを使って実装された
    各メトリクスの収集器のあつまり。

    例えば、deploy collectorであれば、

    デプロイに関する情報を収集しタグ付け、
    メトリクスを作成し(producer)、 任意の
    データストア(Datadogなど)に送信する
    (exporter)。
    devstats project
    collectors
    data
    1. produce
    Cloud Functions

    View Slide

  29. Collectors
    devstatsパッケージを使って実装された
    各メトリクスの収集器のあつまり。

    例えば、deploy collectorであれば、

    デプロイに関する情報を収集しタグ付け、
    メトリクスを作成し(producer)、 任意の
    データストア(Datadogなど)に送信する
    (exporter)。
    devstats project
    collectors
    data
    1. produce 2. export
    Cloud Functions

    View Slide

  30. Why DevStats?

    View Slide

  31. マイクロサービスの強みを活かして、

    「本当に組織全体としてのAgilityが上がっているのか」

    を計測することは重要である。

    View Slide

  32. 生産性の高い組織において開発者数とデプロイ数は比例関係にある

    View Slide

  33. Agenda
    •Cloud Functions Go, DevStats
    •Cloud Functions How we use
    •Cloud Functions Tips

    View Slide

  34. 2. Cloud Functions How we use

    View Slide

  35. Event-driven serverless compute platform
    Cloud Functions
    ” ”

    View Slide

  36. Event-driven serverless compute platform
    Cloud Functions
    ” ”

    View Slide

  37. DC VM/Container Serverless
    •物理マシン
    •リソース
    •アプリケーション
    技術の発展による管理・運用対象の変化
    •物理マシン
    •リソース
    •アプリケーション
    •物理マシン
    •リソース
    •アプリケーション

    View Slide

  38. VM/Container Serverless
    •好きなだけ/好きなようにスケールできる
    •ベンダー依存がなくポータビリティがある
    •要件に合わせて実行環境を変更できる
    •実行はベアメタルほど高速に動作しないが
    ビルド・テスト・デプロイのサイクルを開発者
    に移譲できるので高速に開発できる
    Containers vs Severless
    •関数の呼び出しのたびに起動され課金され
    るのでアイドル時間のコストを抑えられる
    •インフラやリソースを管理しなくてよく、

    コードを書くことだけに集中できる
    •テクノロジがブラックボックス
    •ベンダー依存でありロックインされる可能性
    もある

    View Slide

  39. Serverless
    Containers vs Severless
    •関数の呼び出しのたびに起動され課金され
    るのでアイドル時間のコストを抑えられる
    •インフラやリソースを管理しなくてよく、

    コードを書くことだけに集中できる
    •テクノロジがブラックボックス
    •ベンダー依存でありロックインされる可能性
    もある

    View Slide

  40. Containers vs Severless
    •比較して語られることも多いが別物の技術
    •適材適所で使うことで真価を発揮できる
    •今回のDevStatsではCloud Functionsを
    使ったほうがいいと判断した

    View Slide


  41. Cloud Functions

    View Slide

  42. Background function
    Two ways to Go
    HTTP function
    HTTPリクエストによって呼び出される関数

    標準ライブラリのhttp.HandlerFunc型に従う
    イベントに応答して起動される関数

    e.g. Cloud Storageバケットのコンテンツが

    変更されたとき

    View Slide

  43. Background function
    Two ways to Go
    HTTP function
    HTTPリクエストによって呼び出される関数

    標準ライブラリのhttp.HandlerFunc型に従う
    イベントに応答して起動される関数

    e.g. Cloud Storageバケットのコンテンツが

    変更されたとき

    View Slide

  44. HTTP function
    HTTP request

    View Slide

  45. HTTP function

    View Slide

  46. Background function
    Two ways to Go
    HTTP function
    HTTPリクエストによって呼び出される関数

    標準ライブラリのhttp.HandlerFunc型に従う
    イベントに応答して起動される関数

    e.g. Cloud Storageバケットのコンテンツが

    変更されたとき

    View Slide

  47. Event
    Background function
    Trigger Subscribe

    View Slide

  48. Event
    Background function
    Trigger Subscribe
    Cloud SchedulerなどでTriggerすれば

    関数の定期実行ができる

    View Slide

  49. Background function

    View Slide

  50. Cloud Functions How we use
    in DevStats

    View Slide

  51. Go package "devstats"
    Collector(Developer Metricsとして可
    視化するのに必要なデータソースから

    メトリクスを生成しデータストアに保存する
    Cloud Function)を実装するために必要
    な機能を抽象化して提供するパッケージ

    View Slide

  52. Go package "devstats"
    devstatsパッケージでここをインターフェースを取り決める
    producer exporter

    View Slide

  53. Go package "devstats"

    View Slide

  54. HTTP function case

    View Slide

  55. microservices-kubernetes
    Number of deploys
    Collector
    1. call 2. trigger
    マイクロサービスごとのKubernetes

    マニフェストを管理するリポジトリ

    View Slide

  56. microservices-kubernetes
    Number of deploys
    Collector
    1. call 2. trigger
    POST /deploys
    HTTP request
    マイクロサービスごとのKubernetes

    マニフェストを管理するリポジトリ

    View Slide

  57. microservices-kubernetes
    Number of deploys
    Collector
    1. call 2. trigger
    POST /deploys
    HTTP request
    マイクロサービスごとのKubernetes

    マニフェストを管理するリポジトリ
    3. produce

    View Slide

  58. microservices-kubernetes
    Number of deploys
    Collector
    1. call 2. trigger
    POST /deploys
    HTTP request
    マイクロサービスごとのKubernetes

    マニフェストを管理するリポジトリ
    3. produce
    4. export

    View Slide

  59. microservices-kubernetes
    Number of deploys
    Collector
    1. call 2. trigger
    POST /deploys
    HTTP request
    マイクロサービスごとのKubernetes

    マニフェストを管理するリポジトリ
    3. produce
    4. export
    devstats.deploys
    env
    service corp tool
    kubectl

    View Slide

  60. Spinnaker webhook
    Number of deploys
    Collector
    1. call 2. trigger
    POST /deploys
    HTTP request
    3. produce
    4. export
    devstats.deploys
    env
    service corp tool
    Kubernetesリソースを

    GUI経由で扱えるコンポーネント
    spinnaker

    View Slide

  61. https://speakerdeck.com/b4b4r07/kubernetes-manifests-management-and-operation-in-mercari

    View Slide

  62. Background function case

    View Slide

  63. Cloud
    Scheduler
    Cloud
    Pub/Sub
    Number of developers
    Collector
    1. message 2. trigger

    View Slide

  64. Cloud
    Scheduler
    Cloud
    Pub/Sub
    Number of developers
    Collector
    1. message 2. trigger
    microservices-terraform
    マイクロサービスごとの開発者

    を定義したTerraformリポジトリ

    View Slide

  65. Cloud
    Scheduler
    Cloud
    Pub/Sub
    Number of developers
    Collector
    1. message 2. trigger
    microservices-terraform
    3. produce
    マイクロサービスごとの開発者

    を定義したTerraformリポジトリ

    View Slide

  66. Cloud
    Scheduler
    Cloud
    Pub/Sub
    Number of developers
    Collector
    1. message 2. trigger
    microservices-terraform
    3. produce
    4. export
    マイクロサービスごとの開発者

    を定義したTerraformリポジトリ

    View Slide

  67. Cloud
    Scheduler
    Cloud
    Pub/Sub
    Number of developers
    Collector
    1. message 2. trigger
    microservices-terraform
    マイクロサービスごとの開発者

    を定義したTerraformリポジトリ
    3. produce
    4. export
    devstats.developers
    env
    service corp

    View Slide

  68. https://speakerdeck.com/b4b4r07/terraform-ops-for-microservices

    View Slide

  69. Deploys per Day per Developers

    View Slide

  70. devstats.deploys / Day / devstats.developers

    View Slide

  71. devstats.deploys / Day / devstats.developers

    View Slide

  72. Agenda
    •Cloud Functions Go, DevStats
    •Cloud Functions How we use
    •Cloud Functions Tips

    View Slide

  73. 3. Cloud Functions Tips

    View Slide

  74. •Naming policy
    •Limitations
    •Dependencies
    Tips

    View Slide

  75. Naming policy
    main以外なら自由

    View Slide

  76. Naming policy
    エントリーポイントとなる関数名も自由なので、
    (w, r)のシグネチャーを持つエクスポート関数が他にもある場合、

    コードを見ただけではエントリーポイントかどうか分からない...

    View Slide

  77. Naming policy
    エントリーポイントとなる関数名も自由なので、
    (w, r)のシグネチャーを持つエクスポート関数が他にもある場合、

    コードを見ただけではエントリーポイントかどうか分からない...

    View Slide

  78. Naming policy
    エントリーポイントとなる関数名も自由なので、
    (w, r)のシグネチャーを持つエクスポート関数が他にもある場合、

    コードを見ただけではエントリーポイントかどうか分からない...
    =決め打ちにすると分かりやすくなる

    View Slide

  79. Naming policy
    ちなみに、

    このスタイルはGoogle/Googlerのコードでよく見られた例

    View Slide

  80. Limitations

    Functions が Subscribe できる Pub/Sub は同じプロジェクト

    View Slide

  81. Dependencies
    •外部パッケージの依存関係解決にはgo mod (dep)が使える
    •Cloud Functionsの実行環境上でgetするのは面倒なためローカルで取得して

    エントリーポイントが書かれた関数コードと一緒にアップロードする

    View Slide

  82. Wrap-up!

    View Slide

  83. •マイクロサービスの成果を測るために DevStats という仕組み
    をCloud Functions ✕ Goで作った
    •「推測するな、計測せよ」のプラクティスはコードだけでなく

    アーキテクチャにも
    Conclusion

    View Slide

  84. We're hiring!
    @b4b4r07

    View Slide