【入門編】 Stream型:コンシューマーグループ – Redis

やあ。Redisの深淵へようこそ。
世界中で数多のシステムを支えてきたRedisだけど、その中でも「Stream型」という機能は、まるで魔法のような信頼性をシステムにもたらしてくれるんだ。

今日は、初心者のみんなが必ず壁にぶつかる「コンシューマーグループ」という概念を、専門用語の盾を置いて、日常の風景に例えて紐解いていこう。これさえマスターすれば、君のシステムは「メッセージを取りこぼさない、鉄壁の処理能力」を手に入れることになるよ。

—

1. ストリームは「伝言板」、コンシューマーは「スタッフ」

まず、RedisのStreamを「終わりのない伝言板」だと想像してほしい。メッセージが次々と貼られていく。
そして、その伝言を処理するスタッフが君のプログラムだ。

ただ、スタッフが1人だと、仕事が溜まるとパンクしてしまうよね?
そこで登場するのが「コンシューマーグループ」だ。これは「同じ仕事を担当するチーム」のこと。チームを作れば、複数のスタッフで効率よく仕事を分担できるんだ。

2. 「XGROUP」:チームを結成する

まずは、「仕事の山(Stream)」に対して「処理チーム(Group)」を作る必要がある。

「my-stream」という伝言板に対して、「my-group」というチームを作る
「0」は、「過去のメッセージから全部処理するよ」という合図だ
XGROUP CREATE my-stream my-group 0 MKSTREAM

  • `MKSTREAM`: もし伝言板がまだなかったら、自動で作ってね、という親切なオプション。

3. 「XREADGROUP」:仕事を引き受ける

チームができたなら、いよいよ仕事開始だ。ここで大事なのは「誰がどの仕事を引き受けたか」をRedisがちゃんと管理してくれること。

my-groupチームの「worker-1」というスタッフが、新しいメッセージを1つ取り出す
「>」は「まだ誰にも渡っていない新しいメッセージをくれ」という特別な合図
XREADGROUP GROUP my-group worker-1 COUNT 1 STREAMS my-stream >

ここでRedisは賢い。「worker-1がこのメッセージを引き受けたよ」というメモを裏で取っておいてくれるんだ。これが信頼性の要だよ。

4. 「XACK」:仕事の完了報告

スタッフが仕事をした後、そのまま放置したらどうなる?もし途中でエラーが起きて仕事が完了しなかったら、そのメッセージは永遠に消えてしまうよね。
だから、仕事が終わったら必ず「完了したよ!」と報告(Acknowledgment)する必要がある。

ID「1625…」のメッセージ処理が終わったので、完了報告をする
XACK my-stream my-group 1625678901234-0

この報告を受けて初めて、Redisは「よし、このメッセージは完全に処理されたな」と判断して、リストから正式に片付けるんだ。

5. 「XPENDING」:サボり(未完了)を監視する

もし、スタッフがメッセージを受け取ったのに、PCがフリーズして報告(XACK)が来なかったら?
そんな「宙ぶらりんの仕事」を見つけるのが `XPENDING` だ。

チーム内で「まだ終わっていない仕事」がないか確認する
XPENDING my-stream my-group

これを使えば、「誰がどのメッセージを放置しているか」が一目瞭然だ。あとは、別のスタッフにその仕事を代わらせるか、本人が再開するか。この仕組みのおかげで、Redisは「どんな障害があってもメッセージを失わない」という最強の信頼性を実現しているんだ。

—

ここをクリアすれば、君はもう中級者だ

どうだろう? RedisのStreamとコンシューマーグループは、実は「誰が・何を・どこまでやったか」をサボらず管理する優秀な秘書を雇うようなものなんだ。

1. XGROUP でチームを作り
2. XREADGROUP で仕事を割り振り
3. XACK で完了を報告し
4. XPENDING で未完了を監視する

この4つのステップさえ押さえておけば、君が作るシステムは、大量のデータが押し寄せても、サーバーが途中で落ちたとしても、決して音を上げない堅牢なアーキテクチャになる。

難しい言葉に惑わされず、「いかにして正確に仕事をパスし合うか」という本質だけを見ていれば、Redisは君にとって最高の武器になるはずだよ。

さあ、次のコードを書いてみよう。君のシステムが動き出す瞬間が、一番ワクワクするはずさ。

コメント

タイトルとURLをコピーしました