ããã«ã¡ã¯ãã¡ã«ãã¤ã®ããã¯ã¨ã³ãã¨ã³ã¸ãã¢ã® @kazegusuri ã§ãã
ã¡ã«ãã¤ã§ã¯ã¡ã¤ã³ã®ãã¼ã¿ãã¼ã¹ã¨ãã¦Google Cloud Spannerãå©ç¨ãã¦ãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã«ãã£ã¦ã¯ç§éæ°åãªã¯ã¨ã¹ããSpannerã§å¦çãã¦ãã¾ãã
ããã«Spannerãã¹ã±ã¼ã«ã§ããããã«ãã¦å®å®ãããããããä¼ç¤¾å
¨ä½ã¨ãã¦éè¦ã«ãªã£ã¦ãã¾ãã
æ¬è¨äºã§ã¯æ°ã¶æéæ¦ã£ã¦ããSpannerã®ã¬ã¤ãã³ã·ãé«ããªãåé¡ã¨ãã®è§£æ±ºæ³ã«ã¤ãã¦ç´¹ä»ãããã¨æãã¾ãã
社å
ã¸ã®èª¿æ»å ±åãå«ãã¦æ¸ãã¦ãããããããªã詳細ã§é·ãå
容ã«ãªã£ã¦ãã¾ãã
ãªããã®åé¡ã®å¤§é¨åã¯Goã§Spannerã使ã£ãã¨ãã«ã ãçºçããåé¡ã®ãããJavaãªã©ã®ä»ã®è¨èªã§ã¯è©²å½ããªãå¯è½æ§ãããã¾ãã
CreateSessionåé¡
ããã§ç´¹ä»ããªãã¦ãè¯ããããåºæ¬çãªã¨ããã§ãããCreateSessionãé常ã«é
ãã¨ããåé¡ãããã¾ãã
Spannerã¯ããã©ã«ãã®è¨å®ã§ä½¿ãã¨ã»ãã·ã§ã³ããã¼ã«ãã¦ãããªãã®ã§ããªã¯ã¨ã¹ãã®ãã³ã«ã»ãã·ã§ã³ãä½ãããCreateSessionãå®è¡ãã¾ãã
ãã®CreateSessionã¯ç´600msã¯ãããã®ã§é常ã®ã¦ã¼ã¹ã±ã¼ã¹ã§ã¯çºçããã¨ééããªã使ãç©ã«ãªãã¾ããã
ãã®åé¡ã解決ããã«ã¯Spannerã¯ã©ã¤ã¢ã³ãã使ããã¨ãã®ãªãã·ã§ã³ã«ãã spanner.SessionPoolConfig ãè¨å®ããã°è¯ãã§ãã
SessionPoolConfigã®è¨å®ã¯ã©ããé常ã«éè¦ã§ãããã§ã¯èª¬æãã¾ãããåå¤ãã©ã®ãããªå½±é¿ããããã¯çè§£ãã¦ãããæ¹ãè¯ãã§ãã
ããã google-cloud-go ã®æåãä¸éãçè§£ãã¦ãããæ¹ã以éã®åé¡ã¨æ¦ãã¨ãã«æ¦åã«ãªãã¾ãã
Abortåé¡
Spannerã«ãªã¯ã¨ã¹ãæã«Abortãçºçãã¦1ç§ä»¥ä¸ãããã¨ããåã社å
ã§åºã¾ãã¾ããã
調ã¹ã¦ã¿ãã¨StreamingReadãExecuteStreamingSqlã§Abortãçºçããå ´åã«1ç§ä»¥ä¸ããã£ã¦ãããã¨ããããã¾ããã
ãªãCommitã§ã¯Abortãã¦ãé
å»¶ããªãã®ã«StreamingReadãªã©ã§ã¯é
å»¶ããã®ã調ã¹ãããã« google-cloud-go ã®å®è£
ãå®å
¨ã«è¦ç´ãã¾ããã

調æ»ç·¨
Spannerã®ã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªã¯å
é¨ã§çºçããã¨ã©ã¼ãå
¨ã¦spanner.Erroråã«ãã¦ãã¾ãã
Abortæã«ã¯spanner.Erroråããé
å»¶æéãåå¾ãã¦ãã®æéã ãsleepãã¦ãããªãã©ã¤ããããã«ãªã£ã¦ãã¾ãã
Commitã¨StreamingRead/ExecuteStreamingSqlã§ã¯ãã®spanner.Erroråã®ä½ãæ¹ã«éããããã¾ããã
Commitã§ã¯ã¨ã©ã¼çºçæã«gRPCã®Trailerãè¦ã¦RetryInfoã®å¤ã«ãã£ã¦é
å»¶æéãè¨å®ãã¦ãã¾ããã
ããããStreamingReadã¨ExecuteStreamingSqlã§ã¯Trailerãããããè¦ã¦ãã¾ããã
Abortæã®ãªãã©ã¤ã¯RetryInfoãè¦ã¦ããªãå ´åã¯ããã©ã«ãå¤ã§é
å»¶ããããã«ãªã£ã¦ããããã®å¤ã1ç§ã ã£ãããCommit以å¤ã®Abortã§é
ããªã£ã¦ãã¾ããã
é
å»¶æéã®å¤æã¯Trailerã®ä¸ã«å
¥ã£ã¦ããRetryInfoã®å¤ã§è¡ããããããã¾ãã¯RetryInfoãStreamingReadãªã©ã§å
¥ã£ã¦ãããã©ããã確èªãããã¨ã«ãã¾ããã
ãªãã¹ãgoogle-cloud-goèªä½ããã©ã¼ã¯ããã«è¦³æ¸¬ã§ããããã«ããããã«ã gRPCã®Interceptorã使ã£ã¦ã¨ã©ã¼çºçæã«Trailerã«å
¥ã£ã¦ããå¤ããã°ã«æ®ããã¨ã«ãã¾ããã
Readç³»ã®Abortã¯Commitã®Abortã¨éã£ã¦çã£ã¦åºãããããªãã®ã§ããªãã®ã§æ°é·ã«å¾
ã¤ãããªãã§ãããç¡äºã¨ã©ã¼ãä½åãåºã¦Trailerã«RetryInfoãå
¥ã£ã¦ãããã¨ã確èªã§ãã¾ããã
解決編
ããã¾ã§ã®è©±ããAbortãçºçããã¨ãã®é å»¶æéãé·ããªã£ã¦ããåé¡ã¯2ã¤ã®è§£æ±ºæ³ãããã¾ãã
- æ£æ»æ³: Readç³»ã§Trailerãè¦ãããããã«ãã
- è£ã®æ: ããããããã©ã«ãã®é å»¶æéãæ¸ãã
ãã®2ã¤ã®ã©ã¡ãã«ãããè¿·ã£ã¦ãããå¾è
ã®æ¹æ³ã§æ¢ã«GitHubã§Issue ã¨ãã¦ããã£ã¦ãã¾ããã
ãã®Issueã¯ããã©ã«ãã®é
å»¶æéã調æ´å¯è½ã«ããã¨ããå
容ã ã£ãã®ã§ãããã«ã®ã£ãã£ã¦å®è£
ãã¦ãè¯ããã¨ãã質åãããã¨OKã¨ãã話ã«ãªãã¾ããã
ãã¡ãããããã ãéãã¾ããã
ããããé·ãéã®ã¬ãã¥ã¼ãå¾
ã£ã¦ããã¨æ¬å½ã«ãã®å®è£
ã¯å¿
è¦ãªã®ãâ¦ï¼ã¨ãã話ã«ãã©ã£ã¦ç¾ç¶ã®åé¡ãä¼ããã¨ãããããããªããã«ã
徿¥ãã®åé¡ã«ã¤ãã¦Googleã®æ
å½è
ã¨ç´æ¥è°è«ããæ©ä¼ãã§ãã¾ããã
äºåã«åé¡ã«ã¤ãã¦ä¼ãã¦ãããã¨ã¨ç¸æå´ã§ã調æ»ãã¦ãããã¨ããæ¢ã«åé¡ãããã¨ãããã¨ã¯èªèããã¦ãã¦ã©ããã£ã¦ç´ãããè°è«ãã¾ããã
å®ã¯ãã®è°è«ã®åã«ã¯ãã§ã«é
å»¶æéã1ç§ãã100msã«ãã夿´ããã¼ã¸ããã¦ãªãªã¼ã¹ã¾ã§ããã¦ãã¾ããï¼
ãã¡ãã¨ãã¦ã¯ã¢ããªã±ã¼ã·ã§ã³ããé
å»¶æéã調æ´ã§ããããã«ãããããã§ã¯ãªãçããªã£ã¦ãããã°è¯ãã¨ãããã¨ãä¼ããã¨ããã«ããã©ã«ãã®é
å»¶æéãæ¸ãããã¨ããçµè«ã«ãªãã¾ããã
ãã ã100msãããã£ã¨æ¸ããã¦ãè¯ãããã¨ãã話ããã¦ãã¦ã徿¥æ´ã«20msã¾ã§æ¸ãã夿´ããã¼ã¸ããã¦ãã¾ããã
ãããã google-cloud-go ã® v0.36.0 㨠v0.37.0 ã§ãªãªã¼ã¹ãããã®ã§Spannerã使ãå ´åã¯å¿
ããã®ãã¼ã¸ã§ã³ä»¥éã使ãã¾ãããã
ä½è«
Abortã«é¢é£ããåé¡ã¨ã㦠Spannerã®ãã©ã³ã¶ã¯ã·ã§ã³ã®ä¸ã§Spannerã©ã¤ãã©ãªã®ã¨ã©ã¼ãã©ãããã¦ã¯ãããªãã¨ãããã®ãããã¾ãã
_, err = client.ReadWriteTransaction(ctx, func(ctx context.Context, tx *spanner.ReadWriteTransaction) error { _, err := tx.ReadRow(ctx, "Foo", spanner.Key{"foo"}, []string{...}) if err != nil { return errors.Wrap(err, "ReadRow failed") // wrap error } ... return nil }
Spannerã©ã¤ãã©ãªã®ç¹å¾´ã¨ãã¦ãã¼ã¿ãã¼ã¹ããã®åå¾ã¨Mutationã®ä½æã¯ã³ã¼ã«ããã¯é¢æ°ã®ä¸ã§å®è¡ããããã«ãªã£ã¦ãã¦ãã©ããã§Abortãçºçããã¨ãã®ãªãã©ã¤å¦çã¯å¼ã³åºãå
ã§å¤æããããã«ãªã£ã¦ãã¾ãã
ReadRow 㯠spanner.Error ãè¿ãã¾ãããå¼ã³åºãå
ã§ã spanner.Error ãè¿ã£ã¦ãããã¨ãæå¾
ãã¦ã¨ã©ã¼ãã³ããªã³ã°ãè¡ã£ã¦ããããã
errors.Wrap ãªã©ã§ReadRowã®ã¨ã©ã¼ãã©ãããã¦ãã¾ãã¨å¼ã³åºãå
ã§ã¯spanner.Errorã§ã¯ãªãã¨ã©ã¼ãè¿ã£ã¦ãããããSpannerã®ã¨ã©ã¼ã³ã¼ããåå¾ã§ããªããªãã¾ãã
Spannerã®ã¨ã©ã¼ã³ã¼ãèªä½ã¯ GRPCStatus() *status.Status
ãå®è£
ããã¨ã©ã¼ãè¿ããã¨ã§å¯¾å¦ã§ãã¾ããããããããã®ã§ç¾ç¶ã§ã¯ã¨ã©ã¼ãã©ãããã¦ã¯ãããªãã¨è¦ããæ¹ãè¯ãããã§ãã
ãã®åé¡èªä½ã®è°è«ã¨ãã¦ã¯ãã¡ãã®Issueã§è¡ããã¦ãã¾ãã
1æéæ¯ã«é ããªãåé¡

é·æéSpannerã使ã£ãã¢ããªã±ã¼ã·ã§ã³ãåããã¦ããã¨ãCreateSessionã®é
å»¶ãAbortæã®Backoffãªã©ã¨é¢ä¿ãªããã£ãã1æéåä½ã§é
ããªãã¨ããåé¡ã夿ãã¾ããã
1æéæ¯ã«å¿
ãèµ·ããããã§ã¯ãªããå¾®å¦ã«ããããã®ãä½åãçºçãã¦ããç¶æ
ã§ãã
ãã ããããããã®ã¨ã©ã¼ã®ã¾ã¨ã¾ãã®ééã¯ã»ã¼1æéã¨ãã卿æ§ãæã£ã¦ãããã¨ããSpannerã®ã³ãã¯ã·ã§ã³åä½ã§ãªã«ãããã¨æ¨æ¸¬ãã¾ããã
Spannerã¯ã©ã¤ãã©ãªå
ã§ããã©ã«ã4ã¤ã®gRPCã³ãã¯ã·ã§ã³ã使ãã¦ç®¡çããããã«ãªã£ã¦ãã¾ãã
4ã¤ã®ç¬ç«ããã³ãã¯ã·ã§ã³ãããããã§1æéåä½ã§ä½ãåé¡ãããã¨èãã¾ããã
æ´ã«ãããããã®ã¯ã¨ã©ã¼ã®å
容ãé
ããªã£ã¦ããé¨åã«ãããããªãã¿ã¼ã³ããããã¨ã§ãã
google-cloud-goã®å
é¨ã§é
ããªã£ã¦ããå ´åããgoogle-cloud-goããSpannerã¸gRPCã®ãªã¯ã¨ã¹ããéãé¨åãé
ããªã©æ§ã
ã§ãã
ã¾ãé
ããªãæ¹ã1ç§ã¨ãã§ã¯ãªã20ç§ä»¥ä¸ããã£ãããcontext.WithTimeoutã§ã¿ã¤ã ã¢ã¦ããæå®ãã¦ããã®ã«ãã以ä¸ããã£ãããã¦ãã¾ããã
ãã¾ãã«å¤ãã®å¤æ°ãããç¶æ
ã§ã©ããã調æ»ããã®ãé£ãã(ç¹ã«ãã®ã¨ãã«ã¾ã Abortåé¡ã¯è§£æ±ºãã¦ããªã)ã®ã§ã¾ãã¯ãããããªç°å¢ããã¿ã¼ã³ã§è©¦ãã¦å¾åã調æ»ãããã¨ã«ãã¾ããã
ã¯ã£ããããã£ã¦ãããã¨ã¯1æéã¨ãã卿æ§ããã£ã¦ãããã¨ã§ãã
æä½åæ¥ããæ°æ¥ããã¦ããããã®ãã¿ã¼ã³ã®çµæãå¾
ã¤ã¨ãããã¨ãã社å
ã§ã¯çª¯åé¡ã¨å¼ã°ãã¦ãã¾ãã
æ°äººã®æå¿ã§ããããã®ãäºãã®ç°å¢ã§ã¢ã¤ãã¢ãå
ã«çª¯ã«ä»è¾¼ã¿ããã¦ç¼ãä¸ãããå¾
ã¡ããã®çµæããã¿ããªã§è°è«ãã¦æ°ããã¢ã¤ãã¢ãå¾ãâ¦ã¨ããã®ãç¹°ãè¿ãè¡ãã¾ããã
ãã¼ã¯ã³ãªãã¬ãã·ã¥
1æéã¨èãã¦æåã«æãã¤ãããã¨ãã¢ã¯ã»ã¹ãã¼ã¯ã³ã®æå¹æéã§ãã
Spannerã«éããGCPã®ãªã½ã¼ã¹ã«ã¯ã¢ã¯ã»ã¹ãã¼ã¯ã³ãçºè¡ãã¦ããã使ã£ã¦ã¢ã¯ã»ã¹ããå¿
è¦ãããã¾ãã
ãã®ã¢ã¯ã»ã¹ãã¼ã¯ã³ã¯çºè¡ããã¨1æéã®æå¹æéãããæå¹æéå
ã§ã¯ä½åº¦ãå©ç¨ã§ãããããé常ã¯ãã£ãã·ã¥ãã¦ãªã¯ã¨ã¹ãéã§ä½¿ãã¾ããã¾ãã
google-cloud-goã§ã¯ãããã®ãã¼ã¯ã³ç®¡çãå
é¨çã«è¡ã£ã¦ãããããã«ãªã£ã¦ãã¾ãã
ããããã®ä»çµã¿ã«èª²é¡ãããã¾ããã
ãã¼ã¯ã³ç®¡çã®ä»çµã¿ãæå¹æéå
ã®ãã¼ã¯ã³ããªãã¨ãã«çºè¡ãããã¤ã¾ãæå¹æéãåããã¨ãã«åãã¦æ°è¦ãã¼ã¯ã³ã®çºè¡å¦çãè¡ãã¨ããããã«ãªã£ã¦ãã¾ãã
ãã®çºè¡å¦çã¯gRPCã®ã³ãã¯ã·ã§ã³åä½ã§åæã«1ã¤ããè¡ãããªãããã«ãªã£ã¦ãããããSpannerã¸ã®ãªã¯ã¨ã¹ããåæã«ãã£ãã¨ãã¦ãæåã®çºè¡å¦çãå®äºããã¾ã§å
¨ã¦ããããã¯ããã¾ãã
ã¤ã¾ããçºè¡å¦çã«æéãããã£ãå ´åã«ãã®ã³ãã¯ã·ã§ã³ã®å
¨ã¦ã®ãªã¯ã¨ã¹ããæéãããã£ã¦ãã¾ãã¾ãã
å®éã«çºè¡å¦çã«ãããæéãè¨æ¸¬ããã¨ãããã»ã¨ãã©ã¯100ms以ä¸ã§å®äºãã¦ãã¾ããããã¾ã«1ç§ç¨åº¦ããããã¨ã¯å¤æãã¾ããã
ç¾ç¶çºçãã¦ããåé¡ã®é »åº¦ããçºè¡å¦çãé常ã«é
ããªãé »åº¦ã®æ¹ãããªãä½ãã£ããããã©ãããããããé
å»¶ã®åå ã«ãªã£ã¦ãããã¯èªä¿¡ã¯ãªãã£ãã§ããã
100msç¨åº¦ã§ãå¯è½ã§ããã°é
å»¶ãæ¸ãããããããã®åé¡ã解決ãããã¨ã«ãã¾ããã
ãã®åé¡ã¯æå¹æéãåããã¿ã¤ãã³ã°ã§åæçã«å¦çãè¡ããã¨ã«ãã£ã¦çºçãããããæå¹æéãåããåã«ããã¯ã°ã©ã¦ã³ãã§å®æçã«ãã¼ã¯ã³ãåçºè¡ã§ããã°è¯ãã¨èãã¾ããã
Goã§ã¯ãã¼ã¯ã³çºè¡ã®ä»çµã¿ã¯ oauth2.TokenSource ã使ã£ã¦å®è£
ãããã¨ãå¤ããGoogleã®ã¢ã¯ã»ã¹ãã¼ã¯ã³ããã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«å¾ã£ã¦å®è£
ããã¦ãã¦ãgoogle-cloud-goãã©ã¤ãã©ãªããããããå©ç¨ããå½¢ã«ãªã£ã¦ãã¾ãã
google-cloud-goã§ã¯ oauth2.TokenSourceã®ä»»æã®å®è£
ãæå®å¯è½ã«ãªã£ã¦ãã¾ãã
goroutineã使ã£ã¦ããã¯ã°ã©ã³ãã§ãã¼ã¯ã³ã宿çã«åçºè¡ãã oauth2.TokenSource ãå®è£
ã㦠google-cloud-go ã§ä½¿ããããã«ãã¾ããã
å®éã«ãã®ä¿®æ£ãé
å»¶ããåé¡ã®ãã£ãç°å¢ã«å°å
¥ããã¨ããã1æéæ¯ã«çºçãã¦ããé
å»¶ã2,3å²ç¨åº¦æ¸ãããã«ãªãã¾ããã
æã£ããããå¤ãæ¸ã£ããªã¨ããææ³ã¨ããã¯ãã¾ã å¥ã®åé¡ãããã¨ãã課é¡ãæ®ãã¾ããã


gRPC忥ç¶
1æéã¨ãã卿ããããããªãã®ã¯google-cloud-goãgRPCã®å®è£
ãè¦ã¦ãä»ã«æãæµ®ãã°ãã«èª¿æ»ãé£èªãã¦ãã¾ããã
ããæ¥ä»ã®ãã¼ã ããSpannerã¸ã®gRPCã³ãã¯ã·ã§ã³ããã¾ã«Transient Failureã«ãªãã¨ãã話ãèãã¾ããã
Transient Failureã¨ããã®ã¯æ¬æ¥ã¯æ¥ç¶ãç¶æãã¦ããã¯ãã®Spannerã¸ã®ã³ãã¯ã·ã§ã³ãåæããã¦ããç¶æ
ã®ãã¨ã§ãã
gRPCã§ã¯åæãããã¨ãã¦ãããã¯ã°ã©ã³ãã§åæ¥ç¶ãè¡ããã¾ãããã³ãã¯ã·ã§ã³ãå¤éå(subchannel)ããã¦ããå ´åã¯ä»ã®çãã¦ããã³ãã¯ã·ã§ã³ã使ãããã«ãªã£ã¦ããããåé¡ã¯ããã¾ããã
ããããã®åæãçµæ§çºçããã¨ãããã¨ã§èª¿æ»ãã¦ã¿ã¾ããã
調æ»èªä½ã¯2ã¤ã®æ¹æ³ã§è¡ãã¾ããã
1ã¤ã¯gRPCã®å
é¨ãã°ã表示ãããã¨ã§ãã
grpc-goã§ã¯grpclogããã±ã¼ã¸ã使ã£ã¦ãããè¨å®ããè¡ãã°ç´°ãããã°ãæ®ãããã«ãªãã¾ãã
ãã®ä¸ã«ã³ãã¯ã·ã§ã³(channel)ã®ç¶æ
ã«å¤åããã£ãã¨ãã®ãã°ãå«ã¾ãã¦ãã¾ãã
ãã1ã¤ã¯gRPCã®Channelzã使ããã¨ã§ãã
Channelzã¯gRPCå
é¨ã®ã³ãã¯ã·ã§ã³ã®ç¶æ
ãã¢ãã¿ãªã³ã°ããä»çµã¿ã¨ãã®ç¶æ
ã«ã¢ã¯ã»ã¹ããAPIãããã¾ãã
Channelzã®åç
§ã«ã¯gdebugã¨ããWebUIã®ãã®ãããã¾ãããèªä½ããCLIã® channelzcli ã使ãã¾ããã
ãã°ãChannelzãè¦ãã¨1æéæ¯ã«ã³ãã¯ã·ã§ã³ãåæããã¦ãããã¨ããããããã®æéã«ã¡ããã©é
å»¶ãçºçãã¦ãããã¨ããããã¾ããã
GCPã®ãµãã¼ãã«ç¢ºèªããã¨ããSpannerãµã¼ãã¼å´ãã1æéæ¯ã«ã³ãã¯ã·ã§ã³ãåã£ã¦ããã®ã¯ééããªãã¨ãããã¨ã§ããã
ãããããªãåæ¥ç¶æã«é
å»¶ãçºçããã®ãã¨ããåé¡ã«ã¤ãã¦èª¿æ»ãããã¨ã«ãã¾ããã
google-cloud-goã¯è¤æ°ã®gRPCã³ãã¯ã·ã§ã³ãã©ã¤ãã©ãªå´ã§æ±ã£ã¦ãã¾ãã
ã©ã¤ãã©ãªå
ã§Spannerã®ã»ãã·ã§ã³ç®¡çãè¡ã£ã¦ãã¦ãããã»ãã·ã§ã³ã¯1ã¤ã®ã³ãã¯ã·ã§ã³ã«ç´ä»ãã¦ç®¡çããã¦ãã¾ãã
æ¬æ¥ãªã1ã¤ã®ã³ãã¯ã·ã§ã³ãå¤éåãã¦ããã°ãã³ãã¯ã·ã§ã³ã®ä¸ã®ä¸é¨ã®subchannelãåæãããã¨ãã¦ãã¢ã¯ãã£ããªãã®ã ããå©ç¨ããã¯ãã§ããã
ããããã»ãã·ã§ã³ã®å¶ç´ã®ããã³ãã¯ã·ã§ã³èªä½ã¯å¤éåã¯ããã«è¤æ°ã®ã³ãã¯ã·ã§ã³ãæ±ãããã«ãªã£ã¦ãã¾ãã
ãã®ç¶æ
ã§ã³ãã¯ã·ã§ã³ãåæãããã¨åæ¥ç¶ã¾ã§ã®éã¯ãªã¯ã¨ã¹ããæããããªããªãããå
¨ã¦ããããã¯ããã¾ãã
ãªãããã®åå ã§åæ¥ç¶ã¾ã§ã«æéãããã£ã¦ããã¨æ¨æ¸¬ãã¦ä½ãé
ããªã£ã¦ããã®ãã調æ»ãã¾ããã

DNSåé¡
ãã¨ãã¨GKEã®ç°å¢ã§DNSãä¸å®å®ã«ãªã£ã¦ããã¨ãã話ãããå¥ä»¶ã§èª¿æ»ãã¦ãããã¨ããã£ã¦ãDNSãä½ãå½±é¿ãã¦ããã®ã§ã¯ãªããã¨ããæ¨æ¸¬ã¯åæãããã¦ãã¾ããã
ãããgRPCãæ¥ç¶ãç¶æãããã¨ã¨1æéã®å¨ææ§ããåé¡ããã¯å¤ãã¦ãã¾ããã
忥ç¶ããããã«ã¯DNSãå¼ãç´ããã¨ã«ãªãã®ã§ããã§å度DNSã®é
å»¶çæãã§ã¦ãã¾ããã
ä¸é¨ã®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯DNSã®åé¡ã«å½±é¿ãããªãããã« dnscache ãå°å
¥ãã¦ã¢ããªã±ã¼ã·ã§ã³ã¬ãã«ã§ãã£ãã·ã¥ãã¦ãã¾ãã
æ¬æ¥ã¯ã¤ã³ãã©ã¬ãã«ã§è§£æ±ºããæ¹ãè¯ãã§ãããã¾ãã¯åé¡ãåãåããããã«ãSpannerã¸ã®ã¢ã¯ã»ã¹é¨åã«ãåæ§ã«dnscacheãå°å
¥ãããã¨ã«ãã¾ããã
spanner.NewClientWithConfig ã®ãªãã·ã§ã³ã§ option.WithGRPCDialOption ã使ããã¨ã§gRPCã®DialOptionãæå®å¯è½ã§ãããããã§ grpc.WithContextDialerã使ãã¨Dialerã®æåããããããã®ã§ãããã使ã£ã¦dnscacheãå°å
¥å¯è½ã§ãã
ãã®dnscacheã®ä¿®æ£ãããããã®ãåé¡ã®ç°å¢ã«å°å
¥ããã¨ããå
¨ã¦ã®é
å»¶ããªããªãã¾ããï¼
å®éã«åé¡ãããGKEã®ä¸ã§DNSã®è§£æ±ºãä½åº¦ããã£ã¦ãé
ããªãã±ã¼ã¹ã¯ãã¾ã«ãããã®ã®ãã»ã¨ãã©ã®å ´åã¯é
ããªããã¨ã¯ãªãã§ãã
ã§ãããã¼ã¯ã³ãªãã¬ãã·ã¥ã®åé¡ã¨åæ§ã«æã£ã以ä¸ã«å¹æãããã¾ããã
grpc-goã®ãã°
DNSã®ãã£ãã·ã¥ã§å
¨ã¦ã解決ãããã¨æã£ããå¥ã®ç°å¢ã§ã¯ã¾ã åé¡ãå¼ãç¶ãçºçãã¦ãã¾ããã
ã³ãã¯ã·ã§ã³ãåãã¦ããç¶æ
ã§ã¢ã¯ã»ã¹ãããã¨ãã¦ãªãã©ã¤ãç¶ããã¨ãããã®ã§ããã
google-cloud-goã§ã¯gRPCã®ãªã¯ã¨ã¹ããFailFastã«ãªã£ã¦ããã®ã§ããªã¯ã¨ã¹ããæãããã¨ããã¨ãã«ã³ãã¯ã·ã§ã³ãåãã¦ãã(Transient Failure)ã¨ããã«Unavailableã¨ã©ã¼ãè¿ã£ã¦ãã¾ãã
ãããã©ã¤ãã©ãªå´ã§backoffããªãããªãã©ã¤ããããgRPCã®åæ¥ç¶ãå®äºããã¾ã§å¾
ã¤ããã«ãªã£ã¦ãã¾ãã
gRPCã®åæ¥ç¶å¦çã¯ããã¯ã°ã©ã¦ã³ãã§è¡ãããããã忥ç¶èªä½ã«æéããããã¨ãã®æåã«ãªããDNSãé
ãå ´åã«ãå
¨ãåãæåã«ãªãã¾ãã
DNSã®ãã£ãã·ã¥ãå°å
¥ãã¦ãã¾ã 忥ç¶ã«æéããããã¨ãããã¨ã§å度調æ»ãã¾ããã
調æ»ãããã¨grpc-goã®ãã¼ã¸ã§ã³ãç°å¢ã«ãã£ã¦ç°ãªããã¨ããããã¾ããã
以åããChannelzãå
¨ç°å¢ã§ä½¿ããããã«ããããgrpc-goã®ãã¼ã¸ã§ã³ã1.16.0以ä¸ã«ãã¦ãã¾ãããããã®æç¹ã§ãã¼ã¸ã§ã³ã¯1.19.0ã¾ã§ã§ã¦ãã¾ããã
åãã¼ã¸ã§ã³ã®diffãè¦ã¦ããã¨1.17.0ãã1.18.0ã§gRPCã®æ¥ç¶å¨ãã®ã³ã¼ãã大å¹
ã«å¤æ´ããã¦ããããããå½±é¿ãã¦ããã®ã§ã¯ãªããã¨èãã¾ããã
å®éã«è©¦ãã¦ã¿ã㨠1.16.0ã¨1.17.0ã§ã¯ãã®åé¡ã¯çºçããªããã1.18.0ã¨1.19.0ã§ã¯åæ¥ç¶ã«æéããããç¶æ³ãåç¾ã§ãã¾ããã
grpc-goã®Issuesãè¦ã¦ã¿ãã¨ããã¤ãåæ§ã®å ±åãããã¦ãã¾ããã
æå
ã§ã¯åé¡ã®åç¾ã¨ä¿®æ£æ¹æ³ãããã£ã¦ããããæ¢åã®Issue ä¸ã§åç¾ã³ã¼ããéãã¾ããã
ä¿®æ£èªä½ã¯ããã«ããã¾ããããããããªãªã¼ã¹ããªããªããããªãã£ããããä¸é¨ã®ç°å¢ã§ã¯masterãã©ã³ããç´æ¥ä½¿ã£ã¦åé¡ã解決ããã¦ãããã¨ã確èªãã¾ããã
ç¾å¨ã§ã¯ããããªãªã¼ã¹ã® 1.19.1 ã 1.20.0 ãã§ã¦ããã®ã§ãææ°ã®ãªãªã¼ã¹çã使ã£ã¦ããã°åé¡ãªãç¶æ³ã«ãªãã¾ããã
ã¾ã¨ã
Spannerã«é¢ããåé¡ã¨ãã®è§£æ±ºã«ã¤ãã¦ç´¹ä»ãã¾ããã
Spannerèªä½ã¯ã¹ã±ã¼ã©ãã«ã§ã¬ã¹ãã³ã¹ãæ©ãç´ æ´ããããµã¼ãã¹ã§ãã
䏿¹ã§ Cloud Spanner ã§ã¯æ¥ç¶é¨åã®åé¡ãã©ã¤ãã©ãªã«è¨èªéã§å·®ããã£ãããã¾ãã
Javaã§ã¯å¤ãã®å©ç¨è
ãããããåé¡ã¯è§£æ±ºããã¦ããã§ãããGoã§ãããã ãã®åé¡ããã£ãã®ã§ä»ã®è¨èªã§é¸æããå ´åã«ã¯æ³¨æããæ¹ãè¯ãã§ãããã
ãããããããããªåé¡ããã£ããã®ã®ãã¯ãSpannerèªä½ã®ããã©ã¼ãã³ã¹ã¯ãããè¯ãã¨æãã¦ãã¾ãã
ç¾ç¶ã§ã¯ããªãé«è² è·ãªç°å¢ã§ãSpannerã¸ã®åç´ãªãªã¯ã¨ã¹ãã§ããã°95%ileã§5ms以ä¸ã99%ileã§ã50msãã100msãããªããããã®ã¬ã¹ãã³ã¹ã§ãã
ã¾ã ã¾ã ææ¾ãã§ä½¿ã£ã¦ãããç¶æ
ã§ã¯ãªãã§ãããã¡ã«ãã¤ã§ã¯google-cloud-goãgRPCã®åé¡ã解決ãã¦Spannerã使ã£ã¦ããããã¨æã£ã¦ãã¾ãã