GraphQL Subscriptionを Redis KeySpaceで実装する ~その1~

今回はRedisのkeyspaceを使用してGraphQLのSubscriptionを実装したいと思います。以前にRedisのPub/Subを使って実装した記事を書きました。

Go GraphQl Redis PubSub でリアルタイムチャット (gqlgen websocket) - matsu tech blog

今回はGraphQLのSubscriptionの部分は同じですが、Redis上で通知を行う仕組みをPub/Subからkeyspaceという技術に変更して行いたいと思います。 これによりPub/Subでは単に messageという形式で単純な通知しか受けることしか出来ませんでしたが、keyspaceではRedisの特定のイベント(SETやDEL)に対しても通知を受けることができるようになります。

keyspaceの概要とGraphQLの実装2回に分けてお送りしていきます。今回はkeyspaceの概要編です。

keyspace notifications

keyspace notificationsとは

今までkeyspaceと申し上げてきましたが正確には keyspace notifications と言います。

キー・スペース通知 — Redis Documentation (Japanese Translation)

keyspace notifications は 2.8.0 以上で提供されます。 公式の説明そのままですが、以下の機能を提供します。

keyspace notifications は、Redis データセットに対するなんらかの変更イベントを、クライアントが Pub/Sub チャネルで受け取るための仕組みです。

以下は、受け取れるイベントの例です:

  • あるキーに作用するすべてのコマンド

  • LPUSH 操作を受けたすべてのキー

  • database 0 の中で、expire されたすべてのキー

keyspaceは二つのタイプの通知を受け取ることができます。

 __keyspace@0__:key event
 __keyevent@0__:event key
  • 前者はSubscribeしているkeyに対して行われる全てのイベント(SETやDEL)
  • 後者ではSubscribeしているイベントに対してどのようなKEYを対象にしているか

keyspaceを有効にするには設定を変える必要があります。

この機能は少なからず CPU パワーを使用するため、デフォルトではは無効になっています。通知は redis.conf の ‘notify-keyspace-events’ か CONFIG SET を通して有効にすることができます。

以上がkeyspace notification の説明となります。 説明だけでは理解し辛いのでCLIを叩いて確認してみましょう

redis-cli でkeyspaceを試す

筆者はDocker環境を使います。

FROM redis:latest
COPY ./redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

redis.confファイルに以下を追加しましょう

notify-keyspace-events KEA

それではDockerを起動します。

コンテナにアタッチして二つのターミナルを開いて下さい。

まずは片方のターミナルで __keyspace@0__:hoge を Subscribeします。

subscribe __keyspace@0__:hoge

もう一方のターミナルで SET コマンドを実行します。

set hoge huga

Subscribeしているチャネルで SET の通知を受け取ることができました。


次は __keyevent@0__:set で SETコマンド実行時にどのKEYに対して行われているかを受け取ってみましょう。

subscribe __keyevent@0__:set

setは小文字でないと反応しないので注意して下さい。

次は反対のターミナルで再度SETコマンドを実行します。

set hoge huga

無事 SETコマンドが KEY hoge に対して行われていることを確認することができました。

ここまでkeyspaceの動きを実際にcliを叩いて見てきましたが、最後に応用として PSUBSCRIBE というパターンマッチで通知を受け取る方法を見てみましょう。

psubscribe __keyevent@0__:*

上記のコマンドで SET,DELなど全てのイベントに対してどのKEYが指定されているのか通知を受けることができます。

さらに

psubscribe __keyevent@0__:*

上記のコマンドではすべてのKEYに対してなんのイベントが発生しているのか通知を受け取ることができます。

以上がkeyspaceの説明となります。

次回は実装編です。

最後に、 このブログではweb開発について発信していくのでまたご覧頂けると嬉しいです。 最後までお読み頂きありがとうございました。

追記

実装編はこちら

shikatech.hatenablog.com