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 full-size slide

  2. BABAROT / @b4b4r07
    Mercari, Inc.

    SWE @ Microservices Platform
    Blog / tellme.tokyo

    View full-size slide

  3. Monolith Microservices
    Current status
    Migrating ...

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

  14. Go

    Google Cloud Functions

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 1. Cloud Functions Go, DevStats

    View full-size slide

  18. What's DevStats?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

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

    例えば、deploy collectorであれば、

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

    View full-size slide

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

    例えば、deploy collectorであれば、

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

    View full-size slide

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

    例えば、deploy collectorであれば、

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

    View full-size slide

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

    例えば、deploy collectorであれば、

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

    View full-size slide

  27. Why DevStats?

    View full-size slide

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

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

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  31. 2. Cloud Functions How we use

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

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

    View full-size slide


  38. Cloud Functions

    View full-size slide

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

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

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

    変更されたとき

    View full-size slide

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

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

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

    変更されたとき

    View full-size slide

  41. HTTP function
    HTTP request

    View full-size slide

  42. HTTP function

    View full-size slide

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

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

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

    変更されたとき

    View full-size slide

  44. Event
    Background function
    Trigger Subscribe

    View full-size slide

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

    関数の定期実行ができる

    View full-size slide

  46. Background function

    View full-size slide

  47. Cloud Functions How we use
    in DevStats

    View full-size slide

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

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

    View full-size slide

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

    View full-size slide

  50. Go package "devstats"

    View full-size slide

  51. HTTP function case

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

  56. 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 full-size slide

  57. 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 full-size slide

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

    View full-size slide

  59. Background function case

    View full-size slide

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

    View full-size slide

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

    を定義したTerraformリポジトリ

    View full-size slide

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

    を定義したTerraformリポジトリ

    View full-size slide

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

    を定義したTerraformリポジトリ

    View full-size slide

  64. 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 full-size slide

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

    View full-size slide

  66. Deploys per Day per Developers

    View full-size slide

  67. devstats.deploys / Day / devstats.developers

    View full-size slide

  68. devstats.deploys / Day / devstats.developers

    View full-size slide

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

    View full-size slide

  70. 3. Cloud Functions Tips

    View full-size slide

  71. •Naming policy
    •Limitations
    •Dependencies
    Tips

    View full-size slide

  72. Naming policy
    main以外なら自由

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

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

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

    View full-size slide

  76. Naming policy
    ちなみに、

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

    View full-size slide

  77. Limitations

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

    View full-size slide

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

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

    View full-size slide

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

    アーキテクチャにも
    Conclusion

    View full-size slide

  80. We're hiring!
    @b4b4r07

    View full-size slide