概要
裏でOpensearchを利用するサービスを構築するときの話。
現象としてはOpensearchが瞬断する状況が定期的に発生する。
原因
前提知識としてOpensearchはJVM上で動作している。
これに対して稼働中ヒープメモリ使用量が単調増加するという現象あり。
メモリ使用量が閾値に達した場合当然GC(ガベージコレクション)が発生するわけだが、このGC中は接続がタイムアウトする、つまり外から見たときにOpensearchが瞬断している状況となる。
2023現在AWS公式見解によるとこの一連の挙動は仕様。
対策方針
仕様であるならGCの発生は避けられないのでタイムアウトに対策する方針となる。
GCの所要時間は環境次第ではあるものの概ね数分。
なので「タイムアウト待ち時間を長めに設ける」としてしまうと本件以外の状況で少しつらく、タイムアウト時の接続リトライで対応するのが最も丸いように考えた。
実装
以下Pythonでopensearchpyを利用する場合の話。
OpenSearchClientのコンストラクタに以下の引数を追加することで実現できる。
OpenSearch(
....
timeout=30, # タイムアウト判定までの時間 [sec.]
retry_on_timeout=True, # リトライ有効化フラグ
max_retries=5, # リトライ最大回数
)
APIリファレンス
一言
やることはわかってもopensearchpy公式のAPIリファレンスの読解が微妙に難しかった。
同じ現象で悩んでいる方の参考になれば幸いということで。