decadence

個人のメモ帳

finagle-mysql/finagle-redis connection init sql/command stack modules

これは何

finagleに以下のpatchを追加した

  • finagle-mysql: HikariCP にあるconnection-init-sqlの機能
  • finagle-redis: Connection作成時にすぐに一度だけAUTH, SELECTコマンドを発行する機能

April 2020 Patch Release Notes - Version 20.4.1

f:id:krrrr:20200506075143p:plain

finagle StackClient

finagleといえばStackClient, StackServerである。

finagle/StackClient.scala at 8175b9e69ee22045e41a7eaa61c5cde117e701c6 · twitter/finagle · GitHub

finagleではhttp client, thrift client, mysql client, redis client...などはすべてReqを受け取ってRepを返すService[Req, Rep]として表される。

ssl接続にはhandshakeがいるし、mysqlと通信するServiceならmysql protocolを通す必要がある。これらの個々の機能はstack moduleとして、ServiceFactory[Req, Rep]をwrapする形でstackとして機能を積み上げている。

様々な通信方法がある中で、基本的な機能moduleを共通化して入れ込んでいるものが、StackClient/StackServerである。

このStackClientにstackとして積み上げられたmoduleには、Roleという個々のmoduleを特定するための名前がつけられており、これらのRoleを指定することで、特定のRoleを入れ替えたり、特定のRoleの後に別のRoleを入れたりもできる。

connection init sql/command

connection init sql/commandについては、リクエスト毎にredisに認証リクエストを送る必要はないし、コネクション作成後に1度だけ実行すれば良い処理になる。

StackClientが持つmoduleのひとつに、Role.prepConnがある。このRoleでは、通信する準備が出来た状態を表し、空実装になっている

今回の実装では、このRole.prepConnの後に一度だけ処理を入れる機能をパッチとして追加した。

これでfinagle-mysqlでもkamipo traditionalをclient側から指定することが出来るようになった。