Djangoのキャッシュサーバーにfirebaseを使ってみた


使用背景

会社で運用しているプロダクトではAWSのRedisをキャッシュサーバーとして使っているのですが、自分で使う分には高いし、VPC内からしかアクセス出来ないし(proxyかますなどすれば出来るけど)で、面倒なので他にキャッシュサーバーとして使えるものがないかを探しました。

簡易なキャッシュ方法

メモリに乗せる

一番簡単な方法がローカルのメモリに乗せる方法かと思いますが、テストであればこれで十分ですが、本番では不十分なことが多いです。

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'default',
        'TIMEOUT': 24 * 60 * 60
    }

DBに乗せる

DBにテーブルを作って、その中にキャッシュデータを作って、それを読みに行くというもの。
当然DBへの負荷が増えますし、DBが肥大化していきます。

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',
        'TIMEOUT': 24 * 60 * 60
    }
}

テーブル作ることが必須。

python manage.py createcachetable

Firebaseで出来ないか考える

AWSは使えないし、メモリやDBではしんどいしということが考えたのが、最近良く使うFirebaseのサービスでした。
Firebaseで調べると、なんとパッケージを作ってくれている人がいるではないか。
https://github.com/christippett/django-firebase-cache

ということで、このパッケージを使ってみることにしました。

導入

使い方は簡易的な上記のものに比べると少し面倒です。

パッケージのインストール。

pip install django-firebase-cache

CACHESにセット。

CACHES = {
    'default': {
        'BACKEND': 'django_firebase_cache.FirestoreCache',
        'LOCATION': 'collection_name',
        'TIMEOUT': 24 * 60 * 60
    }
}

Firebaseのcredentialファイルをセットし、パスを通す。
ここが少し迷ったのですが、以下のような感じで、GOOGLE_APPLICATION_CREDENTIALSという環境変数にパスを通す必要があります。ドキュメントが全然充実してない、、

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './client_credentials.json'

以上で設定完了です。
これで、実際に動かしてみるとFirebaseのFireStore上にデータが入ることが確認出来るかと思います。

ここから罠が…

ここまででキャッシュは出来るようになったものの、意外と直ぐに無料枠の上限に達してしまいました。。
その場合、当然エラーが返ってくるのですが、そこでエラーを回避する処理をしておらずサイトが数時間死んでいる状態というのが続いていました。。

ちゃんとお金を払うなり、エラー処理をするなりしましょう。