プライマリーインスタンス + レプリケーション参照して, スケールアウトに対応するためには, WRITER / READER のエンドポイントをアプリケーション側で切り替える必要がある。

AWSのサイトを見たりしてここの挙動を調べたりしたが

Amazon Aurora 接続管理

そもそも経験として, マスターオンリーとか言ってライターのみ参照してライターのみに負荷行かせることとかあったからここは調べなくてよかった。

ともかく, 今までは苦もなく設定ファイルをホイホイ弄るだけで良かったが, いざ Go でこれやる時どうするんかが分からなかった。

色々と調べてみると, どうも自作するスタイルらしい。特に今使っている「 ORM sqlboiler はそうだろう。」という結論に至った。

早速make up からローカルでの WRITER / READER を起動して確認できるものを作った。

somen440/sqlboiler-cluster-executor

docker-compose での冗長構成は知見を得れるものが多かったがここでは割愛。

Cluster 対応して WRITER / READER を切り替える実装は非常にシンプルで, reader / writer 用の二つの db インスタンスを持って sqlboiler が求めるインターフェースのうち更新系は writer のものを, 参照系は reader のものとしてあげているだけ。

func (c *Cluster) QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row {
	if c.HasError() {
		return nil
	}
  // 参照系は Reader を
	return c.Reader.QueryRowContext(ctx, query, args...)
}

func (c *Cluster) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) {
	if c.HasError() {
		return nil, c.err
	}
  // 更新系(トランザクションが貼られる時)は Writer を
	return c.Writer.BeginTx(ctx, opts)
}