Redisのストリームについて
pubsub的に使う時に気になったところを調査
code: 起動
$ docker run -itd --name redis redis
$ docker exec -it redis redis-cli
StreamとConsumerGroup
ConsumerGroupから読み込んでAckを返していないデータ(Pendingに溜まっている)がある状態でStreamからデータを消すとどうなるの?
もしStreamからデータを消してPending情報も消えるのであれば、かなり慎重に消さないといけないし、どんどん溜まっていくので辛い
code: Pendingテスト
// Streamにデータを入れる
127.0.0.1:6379> XADD test-stream 1 test-msg "foooooo"
"1-0"
127.0.0.1:6379> XADD test-stream 2 test-msg "foooooo"
"2-0"
127.0.0.1:6379> XADD test-stream 3 test-msg "hoooooo"
"3-0"
// ConsumerGroupを作る
127.0.0.1:6379> XGROUP CREATE test-stream test-group 0
OK
// ConsumerGroupから読み込む
127.0.0.1:6379> XREADGROUP GROUP test-group consumer-a COUNT 1 STREAMS test-stream >
1) 1) "test-stream"
2) 1) 1) "1-0"
2) 1) "test-msg"
2) "foooooo"
127.0.0.1:6379> XREADGROUP GROUP test-group consumer-b COUNT 1 STREAMS test-stream >
1) 1) "test-stream"
2) 1) 1) "2-0"
2) 1) "test-msg"
2) "foooooo"
127.0.0.1:6379> XREADGROUP GROUP test-group consumer-c COUNT 1 STREAMS test-stream >
1) 1) "test-stream"
2) 1) 1) "3-0"
2) 1) "test-msg"
2) "hoooooo"
// Pendingを確認
127.0.0.1:6379> XPENDING test-stream test-group - + 1000
1) 1) "1-0"
2) "consumer-a"
3) (integer) 33401
4) (integer) 1
2) 1) "2-0"
2) "consumer-b"
3) (integer) 26265
4) (integer) 1
3) 1) "3-0"
2) "consumer-c"
3) (integer) 22189
4) (integer) 1
// 1つAckを返しておく
127.0.0.1:6379> XACK test-stream test-group 2-0
(integer) 1
// 減ってる
127.0.0.1:6379> XPENDING test-stream test-group - + 1000
1) 1) "1-0"
2) "consumer-a"
3) (integer) 73070
4) (integer) 1
2) 1) "3-0"
2) "consumer-c"
3) (integer) 61858
4) (integer) 1
// Streamからデータを消す
127.0.0.1:6379> XTRIM test-stream MAXLEN 0
(integer) 3
// Streamの中身を確認
127.0.0.1:6379> XLEN test-stream
(integer) 0
// Pendingを確認
127.0.0.1:6379> XPENDING test-stream test-group - + 1000
1) 1) "1-0"
2) "consumer-a"
3) (integer) 125287
4) (integer) 1
2) 1) "3-0"
2) "consumer-c"
3) (integer) 114075
4) (integer) 1
ちゃんとPendingの方に残ってる,
が、だめ臭い, これをXCLAIMで取ろうとしたら、nilになってしまう
code: XCLAIM
127.0.0.1:6379> XPENDING test-stream test-group - + 1000
1) 1) "1-0"
2) "consumer-test"
3) (integer) 1711
4) (integer) 3
2) 1) "3-0"
2) "consumer-c"
3) (integer) 207294
4) (integer) 1
// Streamに残っていないとデータが取れない様子
127.0.0.1:6379> XCLAIM test-stream test-group consumer-test 100 1-0
1) (nil)
// 試しにStreamにデータがある状態でのXCLAIMの挙動
127.0.0.1:6379> XADD test-stream 5 test-msg "foooooo"
"5-0"
// 読み込んでAckを返さず、Pending送り
127.0.0.1:6379> XREADGROUP GROUP test-group consumer-test COUNT 1 STREAMS test-stream >
1) 1) "test-stream"
2) 1) 1) "5-0"
2) 1) "test-msg"
2) "foooooo"
// ちゃんとデータが取れる
127.0.0.1:6379> XCLAIM test-stream test-group consumer-test 0 5-0
1) 1) "5-0"
2) 1) "test-msg"
2) "foooooo"