$30 off During Our Annual Pro Sale. View Details »

Spanner Low Level APIは何が「Low」なのか

Keke
September 18, 2019

Spanner Low Level APIは何が「Low」なのか

Keke

September 18, 2019
Tweet

More Decks by Keke

Other Decks in Technology

Transcript

  1. Spanner Low level API
    は何が「Low
    」なのか
    Keke (Twitter: @_k_e_k_e)
    GCPUG YOKOHAMA
    2019/09/18

    View Slide

  2. $ WHO I AM
    Keke (Twitter: @_k_e_k_e)
    New Grads Merpay.inc SRE Team
    Cashless and Chaos engineering are my interest
    Twitter: https://twitter.com/_k_e_k_e

    View Slide

  3. ⽬的

    View Slide

  4. Cloud Spanner Low Level API
    を知ることによって
    Spanner
    について理解を深め
    Client Library
    について興味を持ってもらうこと

    View Slide

  5. Cloud Spanner Low Level API
    を知ることによって
    Spanner
    について理解を深め
    Client Library
    について興味を持ってもらうこと
    Spanner
    界隈が盛り上がると嬉しい:)

    View Slide

  6. 1 Self Introduction
    Todays
    Talk
    API Level
    2
    3 Spanner Client

    Raw gRPC
    5
    Spanner Low Level API

    View Slide

  7. MERPAY'S 4 LAYER ARCHITECTURE
    5-Step Ordering Process
    1
    Client, Merchant
    2
    API Gateway
    3
    API Service
    4
    Backend Service

    View Slide

  8. API Level

    View Slide

  9. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner Client
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    API LEVELS

    View Slide

  10. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner Client
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    よく使うのはSpanner Client
    かラッパー

    View Slide

  11. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner Client
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    ラッパーはSpanner Client

    ラッピングため多種多様

    View Slide

  12. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner Client
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    基本的にはSpanner Client
    を使う

    View Slide

  13. Spanner Client

    View Slide

  14. Spanner Client
    の基礎

    View Slide

  15. Spanner Client
    の基礎
    例:
    簡単なSELECT

    Statement
    を作成

    View Slide

  16. Spanner Client
    の基礎
    Spanner client
    を作成

    View Slide

  17. Spanner Client
    の基礎
    トランザクションを⾏う

    View Slide

  18. Spanner
    Low Level API

    View Slide

  19. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner
    のクライアントパッケージ
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    API LEVELS
    メリットなし

    View Slide

  20. API LEVELS
    google.golang.org/genproto/googleapis/spanner/admin/instance/v1
    ・インスタンス⾃体に関わる
    API
    google.golang.org/genproto/googleapis/spanner/admin/database/v1
    ・データベース⾃体に関わる
    API
    google.golang.org/genproto/googleapis/spanner/v1
    ・データベース操作に関わる
    API
    Spanner Low Level API
    に相当するもの
    Admin API
    に相当するもの
    Admin API
    に相当するもの

    View Slide

  21. Dive into Spanner Client
    ここでは何をしているのか?
    Client
    作成とRPC

    View Slide

  22. Dive into Spanner Client (Client part)
    Google API
    を呼び出すための
    gRPC Client
    を作成している
    NewClient

    View Slide

  23. Dive into Spanner Client (Client part)
    https://github.com/googleapis/google-cloud-go/blob/3091fb2e285e8d80c4266000a6eeb05cacc61e28/spanner/apiv1/spanner_client.go#L126-L145
    (
    注)
    この部分はspanner.NewClient()
    によって間接的に呼ばれている
    Cloud Spanner API
    を呼び出すため
    のConnection
    を作成

    View Slide

  24. Dive into Spanner Client (Client part)
    https://github.com/googleapis/google-cloud-go/blob/3091fb2e285e8d80c4266000a6eeb05cacc61e28/spanner/apiv1/spanner_client.go#L139
    gRPC Client
    を作成

    View Slide

  25. Dive into Spanner Client (RPC part)
    Google API
    に対してRPC
    を⾏っている
    RPC

    View Slide

  26. Dive into Spanner Client (RPC part)
    SQL
    を実⾏するリクエスト
    RPC
    https://github.com/googleapis/go-genproto/blob/1774047e7e5133fa3573a4e51b37a586b6b0360c/googleapis/spanner/v1/spanner.pb.go#L517-L591
    (
    注)
    この部分はQuery()
    によって間接的に呼ばれている

    View Slide

  27. gRPC
    クライアントを作って
    Request
    すればいい

    View Slide

  28. Spanner Low Level API

    View Slide

  29. なにができるの?

    View Slide

  30. Client
    を作成しよう

    View Slide

  31. Client
    を作成する
    google.golang.org/api/transport/grpc
    を使う

    Google API
    を使うための
    gRPC
    クライアント

    View Slide

  32. Google API
    のためのgRPC Client
    の作成

    View Slide

  33. 1. Manage Session

    View Slide

  34. Session
    とは
    gRPC ChannelとSpanner Sessionの関係
    (引用: 「gRPC Channel と Cloud Spanner Session の関係」
    詳解 google-cloud-go/spanner — セッション管理編 http://bit.ly/2QeroOk)

    View Slide

  35. Session
    とは
    Low Level API
    でできること

    CreateSession

    Session
    を作成

    GetSession

    Session
    を作成

    DeleteSession

    Session
    を削除

    ListSession

    Session
    を列挙

    View Slide

  36. 注意: Session
    のLabel
    とFilter
    について
    Session
    はデータベースが保有するものなので
    他のClient
    のSession
    を消さないように
    =>
    識別するためのLabel
    とFilter

    View Slide

  37. Session
    とは
    Session
    が増減するタイミング

    Session Pool Manager
    によって作成・削除

    DB
    オペレーションの
    Read / Write
    に応じて
    Session
    を保持する理由

    Session
    は⾼価である
    Session
    の注意点

    Session
    リークなど
    ・使わない
    Session

    Session Pool
    に返さない

    View Slide

  38. Session
    とは
    Session
    が増減するタイミング

    Session Pool Manager
    によって作成・削除

    DB
    オペレーションの
    Read / Write
    に応じて
    Session
    を保持する理由

    Session
    は⾼価である
    Session
    の注意点

    Session
    リークなど
    ・使わない
    Session

    Session Pool
    に返さない
    データベースが保持する全
    Session

    ApproximentLastUseTime
    などを
    モニタリングして、リークしてそうな、または使⽤頻度の悪い
    Session
    を削除する

    View Slide

  39. 2. Manage Transaction

    View Slide

  40. Transaction
    ReadWriteTransaction():
    読み書きトランザクション
    ReadTransaction():
    読み専⽤トランザクション

    View Slide

  41. Transaction
    ReadWriteTransaction():
    読み書きトランザクション
    1. BeginTransactionRequest
    2. ExecuteSQLRequest
    3. CommitRequest
    ReadTransaction():
    読み専⽤トランザクション
    1. BeginTransactionRequest
    2. ExecuteSQLRequest

    View Slide

  42. Transaction
    ReadWriteTransaction()

    Apply()
    1. BeginTransactionRequest
    2. ExecuteSQLRequest
    3. CommitRequest
    ReadTransaction()

    Single()
    1. BeginTransactionRequest
    2. ExecuteSQLRequest

    CommitRequest

    ExecuteSQLRequest
    Temporary

    Transaction

    API
    的には
    Transaction
    を指定していないだけ

    View Slide

  43. ExecuteSQL Query Mode
    1
    3
    実⾏結果だけ返ってくる
    NORMAL
    実⾏計画が返ってくる
    PLAN
    実⾏計画 +
    実⾏結果 +
    統計情報が返ってくる
    PROFILE
    2
    3
    ExecuteSQL Query
    Mode
    https://cloud.google.com/spanner/docs/reference/rpc/goo
    gle.spanner.v1#google.spanner.v1.ExecuteSqlRequest.Qu
    eryMode

    View Slide

  44. Raw gRPC

    View Slide

  45. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner
    のクライアントパッケージ
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    API LEVELS

    View Slide

  46. RAW GRPC
    から実装するメリットとデメリット
    メリット
    ・特にない
    デメリット
    ・⾃分で
    DialOptions
    を設定する必要がある

    Credentials
    関連

    func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption

    func WithTransportCredentials(creds credentials.TransportCredentials) DialOption

    User Agent
    の設定

    func WithUserAgent(s string) DialOption

    View Slide

  47. メリット
    デメリット
    ・特にない
    ・⾃分で
    DialOptions
    を設定する必要がある

    Credentials
    関連

    func WithPerRPCCredentials(creds credentials.PerRPCCredentials) DialOption

    func WithTransportCredentials(creds credentials.TransportCredentials) DialOption

    User Agent
    の設定

    func WithUserAgent(s string) DialOption
    まとめてくれる
    Google
    のサービスを呼び出すための
    gRPC
    クライアントを使う
    google.golang.org/api/transport/grpc
    RAW GRPC
    から実装するメリットとデメリット

    View Slide

  48. gRPC Client

    google.golang.org/api/transport/grpc
    を使おう
    ただそれだけ

    View Slide

  49. 02
    03
    04
    01 ⽤途に応じてラッピング
    Rapper Client
    googleapis/google-cloud-go/spanner
    Spanner Client
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    API LEVELS
    メリットなし

    View Slide

  50. まとめ

    View Slide

  51. 02
    03
    04
    01 ⽤途に応じてラッピング
    ラッパーパッケージ
    googleapis/google-cloud-go/spanner
    Spanner Client
    google.golang.org/genproto/googlea
    pis/spanner/v1
    Spanner Low Level API
    gRPC
    のレベルからSpanner
    Low Level API
    を叩く
    Raw gRPC
    API LEVELS

    View Slide

  52. 何が「Low
    」だったのか

    Session
    は勝⼿に作られるものだった

    gRPC
    のコネクションを繋いだ移⾏を操作できる

    Session
    を指定して
    Transaction
    を⾛らせることも

    Session

    Metadata
    を取得などなど
    Session
    レベル
    1.
    2. Transaction
    レベル

    Transaction
    を作る →
    Close
    するだけだった
    ・データベースの
    Transaction
    操作

    Transaction ID
    で⼀意に決まってるので、それをもとに
    ・ トランザクションの中の複数
    gRPC
    リクエストが存在していた

    View Slide

  53. Spanner low Level API
    の使い時
    キャパシティマネジメント
    1.

    Session leak
    の発⾒
    ・アプリケーション

    View Slide

  54. Thank you :)
    Keke
    Twitter: @_k_e_k_e

    View Slide