Cloud Functions in Go at Mercari

8238c3c0be55b887aa9d6d59bfefa504?s=47 BABAROT
July 13, 2019

Cloud Functions in Go at Mercari

8238c3c0be55b887aa9d6d59bfefa504?s=128

BABAROT

July 13, 2019
Tweet

Transcript

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

    in Fukuoka Cloud Functions in Go at Mercari
  2. BABAROT / @b4b4r07 Mercari, Inc.
 SWE @ Microservices Platform Blog

    / tellme.tokyo
  3. None
  4. None
  5. Monolith Microservices Current status Migrating ...

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

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

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

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

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

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

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

  13. Scaling Organization Solving Technical Issues 組織を再編し組織としてのアウトプットを
 最大化するため 技術的な課題を解決するため

  14. Scaling Organization Solving Technical Issues 組織を再編し組織としてのアウトプットを
 最大化するため 技術的な課題を解決するため 果たして本当にこれらが解決されているか?

  15. Scaling Organization Solving Technical Issues 組織を再編し組織としてのアウトプットを
 最大化するため 技術的な課題を解決するため 果たして本当にこれらが解決されているか? Let's

    measure!
  16. Go ✕ Google Cloud Functions

  17. DevStats

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

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

    •Cloud Functions Tips
  20. 1. Cloud Functions Go, DevStats

  21. What's DevStats?

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

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

  24. Go package for building a collector Collector(Developer Metricsとして可 視化するのに必要なデータソースから
 メトリクスを生成しデータストアに保存する

    Cloud Function)を実装するために必要 な機能を抽象化して提供するパッケージ
  25. Go package for building a collector Collector(Developer Metricsとして可 視化するのに必要なデータソースから
 メトリクスを生成しデータストアに保存する

    Cloud Function)を実装するために必要 な機能を抽象化して提供するパッケージ
  26. Collectors devstatsパッケージを使って実装された 各メトリクスの収集器のあつまり。
 例えば、deploy collectorであれば、
 デプロイに関する情報を収集しタグ付け、 メトリクスを作成し(producer)、 任意の データストア(Datadogなど)に送信する (exporter)。

  27. Collectors devstatsパッケージを使って実装された 各メトリクスの収集器のあつまり。
 例えば、deploy collectorであれば、
 デプロイに関する情報を収集しタグ付け、 メトリクスを作成し(producer)、 任意の データストア(Datadogなど)に送信する (exporter)。

    devstats project collectors data Cloud Functions
  28. Collectors devstatsパッケージを使って実装された 各メトリクスの収集器のあつまり。
 例えば、deploy collectorであれば、
 デプロイに関する情報を収集しタグ付け、 メトリクスを作成し(producer)、 任意の データストア(Datadogなど)に送信する (exporter)。

    devstats project collectors data 1. produce Cloud Functions
  29. Collectors devstatsパッケージを使って実装された 各メトリクスの収集器のあつまり。
 例えば、deploy collectorであれば、
 デプロイに関する情報を収集しタグ付け、 メトリクスを作成し(producer)、 任意の データストア(Datadogなど)に送信する (exporter)。

    devstats project collectors data 1. produce 2. export Cloud Functions
  30. Why DevStats?

  31. マイクロサービスの強みを活かして、
 「本当に組織全体としてのAgilityが上がっているのか」
 を計測することは重要である。

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

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

    •Cloud Functions Tips
  34. 2. Cloud Functions How we use

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

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

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

    •物理マシン •リソース •アプリケーション
  38. VM/Container Serverless •好きなだけ/好きなようにスケールできる •ベンダー依存がなくポータビリティがある •要件に合わせて実行環境を変更できる •実行はベアメタルほど高速に動作しないが ビルド・テスト・デプロイのサイクルを開発者 に移譲できるので高速に開発できる Containers vs

    Severless •関数の呼び出しのたびに起動され課金され るのでアイドル時間のコストを抑えられる •インフラやリソースを管理しなくてよく、
 コードを書くことだけに集中できる •テクノロジがブラックボックス •ベンダー依存でありロックインされる可能性 もある
  39. Serverless Containers vs Severless •関数の呼び出しのたびに起動され課金され るのでアイドル時間のコストを抑えられる •インフラやリソースを管理しなくてよく、
 コードを書くことだけに集中できる •テクノロジがブラックボックス •ベンダー依存でありロックインされる可能性

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

  41. ✕ Cloud Functions

  42. Background function Two ways to Go HTTP function HTTPリクエストによって呼び出される関数
 標準ライブラリのhttp.HandlerFunc型に従う

    イベントに応答して起動される関数
 e.g. Cloud Storageバケットのコンテンツが
 変更されたとき
  43. Background function Two ways to Go HTTP function HTTPリクエストによって呼び出される関数
 標準ライブラリのhttp.HandlerFunc型に従う

    イベントに応答して起動される関数
 e.g. Cloud Storageバケットのコンテンツが
 変更されたとき
  44. HTTP function HTTP request

  45. HTTP function

  46. Background function Two ways to Go HTTP function HTTPリクエストによって呼び出される関数
 標準ライブラリのhttp.HandlerFunc型に従う

    イベントに応答して起動される関数
 e.g. Cloud Storageバケットのコンテンツが
 変更されたとき
  47. Event Background function Trigger Subscribe

  48. Event Background function Trigger Subscribe Cloud SchedulerなどでTriggerすれば
 関数の定期実行ができる

  49. Background function

  50. Cloud Functions How we use in DevStats

  51. Go package "devstats" Collector(Developer Metricsとして可 視化するのに必要なデータソースから
 メトリクスを生成しデータストアに保存する Cloud Function)を実装するために必要 な機能を抽象化して提供するパッケージ

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

  53. Go package "devstats"

  54. HTTP function case

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


    マニフェストを管理するリポジトリ
  56. microservices-kubernetes Number of deploys Collector 1. call 2. trigger POST

    /deploys HTTP request マイクロサービスごとのKubernetes
 マニフェストを管理するリポジトリ
  57. microservices-kubernetes Number of deploys Collector 1. call 2. trigger POST

    /deploys HTTP request マイクロサービスごとのKubernetes
 マニフェストを管理するリポジトリ 3. produce
  58. microservices-kubernetes Number of deploys Collector 1. call 2. trigger POST

    /deploys HTTP request マイクロサービスごとのKubernetes
 マニフェストを管理するリポジトリ 3. produce 4. export
  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
  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
  61. https://speakerdeck.com/b4b4r07/kubernetes-manifests-management-and-operation-in-mercari

  62. Background function case

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

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

    2. trigger microservices-terraform マイクロサービスごとの開発者
 を定義したTerraformリポジトリ
  65. Cloud Scheduler Cloud Pub/Sub Number of developers Collector 1. message

    2. trigger microservices-terraform 3. produce マイクロサービスごとの開発者
 を定義したTerraformリポジトリ
  66. Cloud Scheduler Cloud Pub/Sub Number of developers Collector 1. message

    2. trigger microservices-terraform 3. produce 4. export マイクロサービスごとの開発者
 を定義したTerraformリポジトリ
  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
  68. https://speakerdeck.com/b4b4r07/terraform-ops-for-microservices

  69. Deploys per Day per Developers

  70. devstats.deploys / Day / devstats.developers

  71. devstats.deploys / Day / devstats.developers

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

    •Cloud Functions Tips
  73. 3. Cloud Functions Tips

  74. •Naming policy •Limitations •Dependencies Tips

  75. Naming policy main以外なら自由

  76. Naming policy エントリーポイントとなる関数名も自由なので、 (w, r)のシグネチャーを持つエクスポート関数が他にもある場合、
 コードを見ただけではエントリーポイントかどうか分からない...

  77. Naming policy エントリーポイントとなる関数名も自由なので、 (w, r)のシグネチャーを持つエクスポート関数が他にもある場合、
 コードを見ただけではエントリーポイントかどうか分からない...

  78. Naming policy エントリーポイントとなる関数名も自由なので、 (w, r)のシグネチャーを持つエクスポート関数が他にもある場合、
 コードを見ただけではエントリーポイントかどうか分からない... =決め打ちにすると分かりやすくなる

  79. Naming policy ちなみに、
 このスタイルはGoogle/Googlerのコードでよく見られた例

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

  81. Dependencies •外部パッケージの依存関係解決にはgo mod (dep)が使える •Cloud Functionsの実行環境上でgetするのは面倒なためローカルで取得して
 エントリーポイントが書かれた関数コードと一緒にアップロードする

  82. Wrap-up!

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

  84. We're hiring! @b4b4r07