cache-stnsdのキャッシュ延命処理を見直した

これまでcache-stnsdにおいてはサーバ側の障害発生時に、自動でキャッシュを延命するように、最後にリクエストが失敗した時刻を記録しておき、リクエストが失敗しているならば、キャッシュを執行させないという処理を行っていました。

しかし、例えばプリフェッチの感覚や、キャッシュの失効時間と、リクエストの失敗し始めるタイミングによってはうまくこの機構が利用できないケースが有りました。

それを改善するために、キャッシュの失効処理の際には事前に status エンドポイントへのリクエスト実行することで、失効処理の直前にサーバとの通信状況を確認するようにしました。

これにより、リクエスト自体は増える可能性がありますが、意図しない失効を避けることが出来るようになりました。

この機能自体は RaneKroon/ttlcache の機能を利用しており、下記のように失効処理の直前にコールバック関数を挟むことができます。

// ref: https://github.com/ReneKroon/ttlcache/README.md
func main() {
	checkExpirationCallback := func(key string, value interface{}) bool {
		if key == "key1" {
			// if the key equals "key1", the value
			// will not be allowed to expire
			return false
		}
		// all other values are allowed to expire
		return true
	}
	cache := ttlcache.NewCache()
	defer cache.Close()
	cache.SetTTL(time.Duration(10 * time.Second))
	cache.SetExpirationCallback(expirationCallback)
        ...
}

設定するコールバック関数の戻り値が偽の場合、キャシュをTTL文延命することができます。

キャッシュを利用している箇所において、変更が少ない情報かつ、万が一誤った情報が返却されても影響が少ないケースの場合に使える実装だと思うので、知っておくとどこかでお得かもしれません。

カテゴリー: tech