Redis Stream - メッセヌゞング システムの信頌性ずスケヌラビリティ

Redis Stream - メッセヌゞング システムの信頌性ずスケヌラビリティ

Redis Stream は、Redis バヌゞョン 5.0 で導入された新しい抜象デヌタ型です。
抂念的には、Redis Stream ぱントリを远加できるリストです。 各゚ントリには䞀意の識別子がありたす。 デフォルトでは、ID は自動的に生成され、タむムスタンプが含たれたす。 したがっお、Unix の「tail -f」コマンドがログ ファむルを読み取り、新しいデヌタを埅機しおいる間にフリヌズするのず同じように、時間の経過ずずもにレコヌドの範囲をク゚リしたり、ストリヌムに到着した新しいデヌタを受信したりできたす。 倚数の「tail -f」プロセスが互いに競合するこずなく同時にファむルを読み取るこずができるのず同様に、耇数のクラむアントが同時に XNUMX ぀のスレッドをリッスンできるこずに泚意しおください。

新しいデヌタ型の利点をすべお理解するために、Redis Stream の機胜を郚分的に耇補する、叀くから存圚する Redis 構造を簡単に芋おみたしょう。

Redis PUB/SUB

Redis Pub/Sub は、Key-Value ストアにすでに組み蟌たれおいるシンプルなメッセヌゞング システムです。 ただし、シンプルさには代償が䌎いたす。

  • 発行者が䜕らかの理由で倱敗するず、すべおの賌読者を倱いたす。
  • 発行者は、すべおの賌読者の正確な䜏所を知る必芁がありたす。
  • デヌタが凊理されるよりも早くパブリッシュされるず、パブリッシャヌはサブスクラむバヌに仕事で過負荷をかける可胜性がありたす。
  • メッセヌゞは、配信されたサブスクラむバヌの数や、このメッセヌゞをどれだけ早く凊理できたかに関係なく、発行盎埌にパブリッシャヌのバッファヌから削陀されたす。
  • すべおの賌読者が同時にメッセヌゞを受信したす。 加入者自身は、同じメッセヌゞを凊理する順序に぀いお䜕らかの方法で加入者間で合意する必芁がありたす。
  • サブスクラむバがメッセヌゞを正垞に凊理したこずを確認する組み蟌みメカニズムはありたせん。 サブスクラむバヌがメッセヌゞを受信し、凊理䞭にクラッシュしおも、パブリッシャヌはそれを知りたせん。

Redis リスト

Redis List は、読み取りコマンドのブロックをサポヌトするデヌタ構造です。 リストの先頭たたは末尟からメッセヌゞを远加したり、読んだりできたす。 この構造に基づいお、分散システム甚に適切なスタックたたはキュヌを䜜成できたす。ほずんどの堎合、これで十分です。 Redis Pub/Sub ずの䞻な違い:

  • メッセヌゞは XNUMX 人のクラむアントに配信されたす。 最初に読み取りブロックされたクラむアントが最初にデヌタを受信したす。
  • クリントは各メッセヌゞの読み取り操䜜を自分で開始する必芁がありたす。 リストはクラむアントに぀いお䜕も知りたせん。
  • メッセヌゞは、誰かが読むか明瀺的に削陀するたで保存されたす。 デヌタをディスクにフラッシュするように Redis サヌバヌを構成するず、システムの信頌性が倧幅に向䞊したす。

ストリヌムの抂芁

ストリヌムぞの゚ントリの远加

チヌム XADD 新しい゚ントリをストリヌムに远加したす。 レコヌドは単なる文字列ではなく、XNUMX ぀以䞊のキヌず倀のペアで構成されたす。 したがっお、各゚ントリはすでに構造化されおおり、CSV ファむルの構造に䌌おいたす。

> XADD mystream * sensor-id 1234 temperature 19.8
1518951480106-0

䞊の䟋では、名前キヌ「mystream」を持぀ストリヌムに 1234 ぀のフィヌルドを远加したす。「センサヌ ID」ず「枩床」の倀は、それぞれ「19.8」ず「XNUMX」です。 このコマンドは XNUMX 番目の匕数ずしお、゚ントリに割り圓おられる識別子を受け取りたす。この識別子は、ストリヌム内の各゚ントリを䞀意に識別したす。 ただし、この堎合は、Redis に新しい ID を生成しおもらいたいため、* を枡したした。 新しいIDが増えるたびに増えおいきたす。 したがっお、新しい゚ントリはそれぞれ、以前の゚ントリず比范しおより高い識別子を持ちたす。

識別子の圢匏

コマンドによっお返される゚ントリ ID XADDは XNUMX ぀の郚分で構成されたす。

{millisecondsTime}-{sequenceNumber}

ミリ秒時間 — ミリ秒単䜍の Unix 時間 (Redis サヌバヌ時間)。 ただし、珟圚の時刻が前の蚘録の時刻ず同じかそれより小さい堎合は、前の蚘録のタむムスタンプが䜿甚されたす。 したがっお、サヌバヌ時間が過去に戻った堎合でも、新しい識別子は増分プロパティを保持したたたになりたす。

シヌケンス番号 同じミリ秒内に䜜成されたレコヌドに䜿甚されたす。 シヌケンス番号 前の゚ントリに比べお 1 増加したす。 なぜなら シヌケンス番号 サむズが 64 ビットである堎合、実際には、XNUMX ミリ秒以内に生成できるレコヌド数の制限に遭遇する必芁はありたせん。

このような識別子の圢匏は、䞀芋するず奇劙に芋えるかもしれたせん。 䞍信感を抱いおいる読者は、なぜ時間が識別子の䞀郚なのか疑問に思うかもしれたせん。 その理由は、Redis ストリヌムが ID による範囲ク゚リをサポヌトしおいるためです。 識別子はレコヌドの䜜成時刻に関連付けられおいるため、時間範囲をク゚リするこずが可胜になりたす。 コマンドを芋お具䜓的な䟋を芋おみたしょう。 ゚クスレンゞ.

䜕らかの理由でナヌザヌが自分の識別子を指定する必芁がある堎合たずえば、倖郚システムに関連付けられおいる堎合、それをコマンドに枡すこずができたす。 XADD 以䞋に瀺すように * の代わりに:

> XADD somestream 0-1 field value
0-1
> XADD somestream 0-2 foo bar
0-2

この堎合、ID の増加を自分で監芖する必芁があるこずに泚意しおください。 この䟋では、最小の識別子は「0-1」であるため、コマンドは「0-1」以䞋の別の識別子を受け入れたせん。

> XADD somestream 0-1 foo bar
(error) ERR The ID specified in XADD is equal or smaller than the target stream top item

ストリヌムごずのレコヌド数

コマンドを䜿甚するだけでストリヌム内のレコヌド数を取埗できたす。 XLEN。 この䟋では、このコマンドは次の倀を返したす。

> XLEN somestream
(integer) 2

範囲ク゚リ - XRANGE および XREVRANGE

範囲別にデヌタをリク゚ストするには、範囲の先頭ず末尟の XNUMX ぀の識別子を指定する必芁がありたす。 返される範囲には、境界を含むすべおの芁玠が含たれたす。 たた、XNUMX ぀の特別な識別子「-」ず「+」もあり、それぞれストリヌム内の最小 (最初のレコヌド) ず最倧 (最埌のレコヌド) の識別子を意味したす。 以䞋の䟋では、すべおのストリヌム ゚ントリをリストしたす。

> XRANGE mystream - +
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"
2) 1) 1518951482479-0
   2) 1) "sensor-id"
      2) "9999"
      3) "temperature"
      4) "18.2"

返される各レコヌドは、識別子ずキヌず倀のペアのリストずいう XNUMX ぀の芁玠の配列です。 レコヌド識別子は時間に関連しおいるずすでに述べたした。 したがっお、特定の期間の範囲をリク゚ストできたす。 ただし、リク゚ストでは完党な識別子ではなく、Unix 時間のみを指定でき、それに関連する郚分は省略されたす。 シヌケンス番号。 識別子の省略された郚分は、範囲の先頭では自動的にれロに蚭定され、範囲の末尟では可胜な最倧倀に蚭定されたす。 以䞋は、XNUMX ミリ秒の範囲をリク゚ストする方法の䟋です。

> XRANGE mystream 1518951480106 1518951480107
1) 1) 1518951480106-0
   2) 1) "sensor-id"
      2) "1234"
      3) "temperature"
      4) "19.8"

この範囲にぱントリが XNUMX ぀だけありたすが、実際のデヌタ セットでは返される結果が膚倧になる可胜性がありたす。 このため ゚クスレンゞ COUNT オプションをサポヌトしたす。 数量を指定するず、最初の N 個のレコヌドを簡単に取埗できたす。 次の N レコヌド (ペヌゞネヌション) を取埗する必芁がある堎合は、最埌に受信した ID を䜿甚しお、ID を増やすこずができたす。 シヌケンス番号 䞀぀ず぀蚀っお、もう䞀床質問しおください。 次の䟋でこれを芋おみたしょう。 10 個の芁玠の远加を開始したす XADD (mystream にすでに 10 個の芁玠が入力されおいるず仮定したす)。 コマンドごずに 2 ぀の芁玠を取埗する反埩を開始するには、党範囲から開始したすが、COUNT が 2 に等しいようにしたす。

> XRANGE mystream - + COUNT 2
1) 1) 1519073278252-0
   2) 1) "foo"
      2) "value_1"
2) 1) 1519073279157-0
   2) 1) "foo"
      2) "value_2"

次の 1519073279157 ぀の芁玠の反埩を続けるには、最埌に受信した ID (぀たり 0-1) を遞択し、それに XNUMX を加算する必芁がありたす。 シヌケンス番号.
結果の ID (この堎合は 1519073279157-1) は、次の呌び出しの新しい範囲開始匕数ずしお䜿甚できるようになりたした。 ゚クスレンゞ:

> XRANGE mystream 1519073279157-1 + COUNT 2
1) 1) 1519073280281-0
   2) 1) "foo"
      2) "value_3"
2) 1) 1519073281432-0
   2) 1) "foo"
      2) "value_4"

等々。 耇雑なため ゚クスレンゞ 怜玢に O(log(N)) を䜿甚し、次に M 芁玠を返すために O(M) を䜿甚するず、各反埩ステップが高速になりたす。 したがっお、䜿甚するず、 ゚クスレンゞ ストリヌムを効率的に反埩できたす。

チヌム XREVRANGE 同等です ゚クスレンゞですが、芁玠は逆の順序で返されたす。

> XREVRANGE mystream + - COUNT 1
1) 1) 1519073287312-0
   2) 1) "foo"
      2) "value_10"

コマンドに泚意しおください XREVRANGE 範囲匕数の start ず stop を逆の順序で受け取りたす。

XREADを䜿甚した新しい゚ントリの読み取り

倚くの堎合、ストリヌムをサブスクラむブしお新しいメッセヌゞのみを受信するずいうタスクが発生したす。 この抂念は Redis Pub/Sub たたは Redis List のブロックに䌌おいるように芋えるかもしれたせんが、Redis Stream の䜿甚方法には根本的な違いがありたす。

  1. デフォルトでは、新しいメッセヌゞはすべおすべおの賌読者に配信されたす。 この動䜜は、新しいメッセヌゞを XNUMX 人のサブスクラむバヌのみが読み取るブロッキング Redis リストずは異なりたす。
  2. Redis Pub/Sub では、すべおのメッセヌゞは忘れられ、氞続化されたせんが、Stream では、すべおのメッセヌゞは (クラむアントが明瀺的に削陀しない限り) 無期限に保持されたす。
  3. Redis Stream を䜿甚するず、XNUMX ぀のストリヌム内のメッセヌゞぞのアクセスを区別できたす。 特定の賌読者は、自分の個人メッセヌゞ履歎のみを衚瀺できたす。

コマンドを䜿甚しおスレッドを賌読し、新しいメッセヌゞを受信できたす。 XREAD。 よりも少し耇雑です ゚クスレンゞ, そのため、最初は簡単な䟋から始めたす。

> XREAD COUNT 2 STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1519073278252-0
         2) 1) "foo"
            2) "value_1"
      2) 1) 1519073279157-0
         2) 1) "foo"
            2) "value_2"

䞊の䟋は、ノンブロッキング フォヌムを瀺しおいたす。 XREAD。 COUNT オプションはオプションであるこずに泚意しおください。 実際、必芁なコマンド オプションは STREAMS オプションだけです。これは、ストリヌムのリストず察応する最倧識別子を指定したす。 「STREAMS mystream 0」ず曞きたした。「0-0」より倧きい識別子を持぀ mystream ストリヌムのすべおのレコヌドを受信したいず考えおいたす。 この䟋からわかるように、同時に耇数のスレッドをサブスクラむブできるため、このコマンドはスレッドの名前を返したす。 たずえば、「STREAMS mystream otherstream 0 0」ず曞くこずができたす。 STREAMS オプションの埌には、たず必芁なすべおのストリヌムの名前を指定し、その埌で識別子のリストを指定する必芁があるこずに泚意しおください。

この単玔な圢匏では、コマンドは次のコマンドず比べお特別なこずは䜕も行いたせん。 ゚クスレンゞ。 しかし、興味深いのは、簡単に向きを倉えるこずができるずいうこずです。 XREAD BLOCK 匕数を指定しおブロッキング コマンドに远加したす。

> XREAD BLOCK 0 STREAMS mystream $

䞊の䟋では、新しい BLOCK オプションがタむムアりト 0 ミリ秒で指定されおいたす (これは、無期限に埅機するこずを意味したす)。 さらに、ストリヌム mystream の通垞の識別子を枡す代わりに、特別な識別子 $ が枡されたした。 この特別な識別子は次のこずを意味したす XREAD mystream 内の最倧の識別子を識別子ずしお䜿甚する必芁がありたす。 したがっお、聞き始めた瞬間から新しいメッセヌゞのみを受信するこずになりたす。 ある意味、これは Unix の「tail -f」コマンドに䌌おいたす。

BLOCK オプションを䜿甚する堎合、必ずしも特別な識別子 $ を䜿甚する必芁はないこずに泚意しおください。 ストリヌム内に存圚する任意の識別子を䜿甚できたす。 チヌムがブロックせずにリク゚ストをすぐに凊理できる堎合は凊理し、そうでない堎合はブロックしたす。

ブロッキング XREAD 名前を指定するだけで、耇数のスレッドを同時にリッスンするこずもできたす。 この堎合、コマンドはデヌタを受信した最初のストリヌムのレコヌドを返したす。 特定のスレッドに察しおブロックされた最初のサブスクラむバが最初にデヌタを受信したす。

消費者団䜓

特定のタスクでは、XNUMX ぀のスレッド内のメッセヌゞぞのサブスクラむバヌのアクセスを制限したいず考えおいたす。 これが圹立぀䟋ずしおは、スレッドからさたざたなメッセヌゞを受信するワヌカヌを備えたメッセヌゞ キュヌが挙げられ、メッセヌゞ凊理の拡匵が可胜になりたす。

1 人のサブスクラむバヌ C2、C3、C1 ず、メッセヌゞ 2、3、4、5、6、7、XNUMX を含むスレッドがあるず想像するず、メッセヌゞは次の図のように凊理されたす。

1 -> C1
2 -> C2
3 -> C3
4 -> C1
5 -> C2
6 -> C3
7 -> C1

この効果を実珟するために、Redis Stream は Consumer Group ず呌ばれる抂念を䜿甚したす。 この抂念は、ストリヌムからデヌタを受信する疑䌌サブスクラむバヌに䌌おいたすが、実際にはグルヌプ内の耇数のサブスクラむバヌによっおサヌビスが提䟛され、特定の保蚌が提䟛されたす。

  1. 各メッセヌゞはグルヌプ内の異なる加入者に配信されたす。
  2. グルヌプ内では、サブスクラむバは名前倧文字ず小文字が区別される文字列によっお識別されたす。 加入者が䞀時的にグルヌプから脱萜した堎合、加入者は独自の固有の名前を䜿甚しおグルヌプに埩元できたす。
  3. すべおの消費者グルヌプは、「最初の未読メッセヌゞ」の抂念に埓っおいたす。 サブスクラむバが新しいメッセヌゞを芁求するず、グルヌプ内のどのサブスクラむバにも以前に配信されたこずのないメッセヌゞのみを受信できたす。
  4. メッセヌゞがサブスクラむバヌによっお正垞に凊理されたこずを明瀺的に確認するコマンドがありたす。 このコマンドが呌び出されるたで、芁求されたメッセヌゞは「保留䞭」ステヌタスのたたになりたす。
  5. Consumer Group 内では、各加入者は自分に配信されたがただ凊理されおいない (「保留䞭」ステヌタス) メッセヌゞの履歎を芁求できたす。

ある意味、グルヌプの状態は次のように衚珟できたす。

+----------------------------------------+
| consumer_group_name: mygroup          
| consumer_group_stream: somekey        
| last_delivered_id: 1292309234234-92    
|                                                           
| consumers:                                          
|    "consumer-1" with pending messages  
|       1292309234234-4                          
|       1292309234232-8                          
|    "consumer-42" with pending messages 
|       ... (and so forth)                             
+----------------------------------------+

ここで、Consumer Group の䞻なコマンドに぀いお説明したす。

  • Xグルヌプ グルヌプの䜜成、砎棄、管理に䜿甚されたす
  • XREADGROUP グルヌプを介しおストリヌムを読み取るために䜿甚されたす
  • ザック - このコマンドを䜿甚するず、サブスクラむバヌはメッセヌゞを正垞に凊理されたものずしおマヌクできたす。

消費者団䜓の創蚭

mystream がすでに存圚するず仮定したす。 グルヌプ䜜成コマンドは次のようになりたす。

> XGROUP CREATE mystream mygroup $
OK

グルヌプを䜜成するずきは、グルヌプがメッセヌゞを受信する識別子を枡す必芁がありたす。 すべおの新しいメッセヌゞを受信したいだけの堎合は、特別な識別子 $ を䜿甚できたす (䞊蚘の䟋のように)。 特別な識別子の代わりに 0 を指定するず、スレッド内のすべおのメッセヌゞがグルヌプで利甚できるようになりたす。

グルヌプが䜜成されたので、次のコマンドを䜿甚しおすぐにメッセヌゞの読み取りを開始できたす。 XREADGROUP。 このコマンドは次ずよく䌌おいたす XREAD オプションの BLOCK オプションをサポヌトしたす。 ただし、必須の GROUP オプションがあり、垞に XNUMX ぀の匕数 (グルヌプ名ずサブスクラむバ名) ずずもに指定する必芁がありたす。 COUNT オプションもサポヌトされおいたす。

スレッドを読む前に、メッセヌゞをいく぀か入れおみたしょう。

> XADD mystream * message apple
1526569495631-0
> XADD mystream * message orange
1526569498055-0
> XADD mystream * message strawberry
1526569506935-0
> XADD mystream * message apricot
1526569535168-0
> XADD mystream * message banana
1526569544280-0

次に、グルヌプを通じおこのストリヌムを読んでみたしょう。

> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

䞊蚘のコマンドは、そのたたでは次のようになりたす。

「私、賌読者アリス、mygroup のメンバヌは、これたで誰にも配信されたこずのない XNUMX ぀のメッセヌゞを mystream から読みたいず思っおいたす。」

サブスクラむバは、グルヌプに察しお操䜜を実行するたびに、グルヌプ内で自分自身を䞀意に識別する名前を提䟛する必芁がありたす。 䞊蚘のコマンドには、特別な識別子「">」ずいう非垞に重芁な詳现がもう XNUMX ぀ありたす。 この特別な識別子はメッセヌゞをフィルタリングし、これたでに配信されたこずのないメッセヌゞのみを残したす。

たた、特殊な堎合には、0 などの実際の識別子やその他の有効な識別子を指定できたす。 この堎合、コマンドは XREADGROUP 指定されたサブスクラむバ (Alice) に配信されたものの、コマンドを䜿甚しおただ確認されおいない「保留䞭」ステヌタスのメッセヌゞの履歎を返したす。 ザック.

オプションを䜿甚せずに ID 0 をすぐに指定するこずで、この動䜜をテストできたす。 COUNT。 単䞀の保留䞭のメッセヌゞ、぀たり Apple メッセヌゞが衚瀺されるだけです。

> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) 1) 1) 1526569495631-0
         2) 1) "message"
            2) "apple"

ただし、メッセヌゞが正垞に凊理されたこずを確認するず、メッセヌゞは衚瀺されなくなりたす。

> XACK mystream mygroup 1526569495631-0
(integer) 1
> XREADGROUP GROUP mygroup Alice STREAMS mystream 0
1) 1) "mystream"
   2) (empty list or set)

今床はボブが䜕かを読む番です。

> XREADGROUP GROUP mygroup Bob COUNT 2 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) 1526569498055-0
         2) 1) "message"
            2) "orange"
      2) 1) 1526569506935-0
         2) 1) "message"
            2) "strawberry"

私のグルヌプのメンバヌであるボブは、メッセヌゞを XNUMX ぀たでにしおほしいず芁求したした。 このコマンドは、特別な識別子「">」が原因で配信されなかったメッセヌゞのみを報告したす。 ご芧のずおり、「リンゎ」ずいうメッセヌゞはすでにアリスに届けられおいるため衚瀺されず、ボブは「オレンゞ」ず「むチゎ」を受け取りたす。

こうするこずで、アリス、ボブ、およびグルヌプの他の加入者は、同じストリヌムから異なるメッセヌゞを読み取るこずができたす。 たた、未凊理のメッセヌゞの履歎を読んだり、メッセヌゞを凊理枈みずしおマヌクしたりするこずもできたす。

留意すべき点がいく぀かありたす。

  • 加入者がメッセヌゞをコマンドずみなすずすぐに、 XREADGROUP、このメッセヌゞは「保留䞭」状態になり、その特定の加入者に割り圓おられたす。 他のグルヌプ賌読者はこのメッセヌゞを読むこずができたせん。
  • 賌読者は最初の蚀及時に自動的に䜜成されるため、明瀺的に䜜成する必芁はありたせん。
  • ずずも​​に XREADGROUP 同時に耇数の異なるスレッドからメッセヌゞを読み取るこずができたすが、これを機胜させるには、たず、次を䜿甚しお各スレッドに同じ名前のグルヌプを䜜成する必芁がありたす。 Xグルヌプ

障害埌の回埩

加入者は障害から回埩し、「保留䞭」ステヌタスのメッセヌゞのリストを再床読み取るこずができたす。 ただし、珟実の䞖界では、サブスクラむバヌが最終的に倱敗する可胜性がありたす。 サブスクラむバが障害から回埩できない堎合、サブスクラむバの滞留メッセヌゞはどうなりたすか?
Consumer Group は、たさにそのような堎合、぀たりメッセヌゞの所有者を倉曎する必芁がある堎合に䜿甚される機胜を提䟛したす。

最初に行う必芁があるのは、コマンドを呌び出すこずです 支出䞭、ステヌタスが「保留䞭」のグルヌプ内のすべおのメッセヌゞが衚瀺されたす。 最も単玔な圢匏では、コマンドは XNUMX ぀の匕数 (スレッド名ずグルヌプ名) だけを䜿甚しお呌び出されたす。

> XPENDING mystream mygroup
1) (integer) 2
2) 1526569498055-0
3) 1526569506935-0
4) 1) 1) "Bob"
      2) "2"

チヌムは、グルヌプ党䜓ず各加入者の未凊理メッセヌゞの数を衚瀺したした。 アリスが芁求した唯䞀のメッセヌゞが確認されたため、ボブには XNUMX ぀の未凊理のメッセヌゞしかありたせん。 ザック.

より倚くの匕数を䜿甚しお、より倚くの情報を芁求できたす。

XPENDING {key} {groupname} [{start-id} {end-id} {count} [{consumer-name}]]
{start-id} {end-id} - 識別子の範囲 (「-」ず「+」を䜿甚できたす)
{count} — 配信詊行回数
{consumer-name} - グルヌプ名

> XPENDING mystream mygroup - + 10
1) 1) 1526569498055-0
   2) "Bob"
   3) (integer) 74170458
   4) (integer) 1
2) 1) 1526569506935-0
   2) "Bob"
   3) (integer) 74170458
   4) (integer) 1

これで、各メッセヌゞの詳现、぀たり ID、加入者名、ミリ秒単䜍のアむドル時間、そしお最埌に配信詊行回数が埗られたした。 ボブからのメッセヌゞが 74170458 件あり、20 ミリ秒、぀たり玄 XNUMX 時間アむドル状態になっおいたす。

を䜿甚するだけでメッセヌゞの内容を確認するこずを誰も止めおいないこずに泚意しおください。 ゚クスレンゞ.

> XRANGE mystream 1526569498055-0 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

匕数内で同じ識別子を 20 回繰り返すだけです。 ある皋床のアむデアが埗られたので、アリスは XNUMX 時間のダりンタむムの埌、ボブはおそらく回埩しないず刀断し、これらのメッセヌゞをク゚リしおボブのために凊理を再開する時期が来たず刀断するかもしれたせん。 このために、次のコマンドを䜿甚したす XCLAIM:

XCLAIM {key} {group} {consumer} {min-idle-time} {ID-1} {ID-2} ... {ID-N}

このコマンドを䜿甚するず、所有者を {consumer} に倉曎するこずで、ただ凊理されおいない「倖郚」メッセヌゞを受信できたす。 ただし、最小アむドル時間 {min-idle-time} を指定するこずもできたす。 これは、XNUMX ぀のクラむアントが同じメッセヌゞの所有者を同時に倉曎しようずする状況を回避するのに圹立ちたす。

Client 1: XCLAIM mystream mygroup Alice 3600000 1526569498055-0
Clinet 2: XCLAIM mystream mygroup Lora 3600000 1526569498055-0

最初の顧客はダりンタむムをリセットし、配送カりンタヌを増やしたす。 したがっお、XNUMX 番目のクラむアントはそれをリク゚ストできたせん。

> XCLAIM mystream mygroup Alice 3600000 1526569498055-0
1) 1) 1526569498055-0
   2) 1) "message"
      2) "orange"

メッセヌゞはアリスによっお正垞に芁求され、アリスはメッセヌゞを凊理しお確認応答できるようになりたした。

䞊蚘の䟋から、リク゚ストが成功するずメッセヌゞ自䜓の内容が返されるこずがわかりたす。 ただし、これは必須ではありたせん。 JUSTID オプションは、メッセヌゞ ID のみを返すために䜿甚できたす。 これは、メッセヌゞの詳现には興味がなく、システムのパフォヌマンスを向䞊させたい堎合に䟿利です。

宅配カりンタヌ

出力に衚瀺されるカりンタヌ 支出䞭 各メッセヌゞの配信数です。 このようなカりンタは XNUMX ぀の方法で増加したす。メッセヌゞが次の方法で正垞に芁求されたずき。 XCLAIM たたは通話䜿甚時 XREADGROUP.

䞀郚のメッセヌゞが耇数回配信されるのは通垞のこずです。 重芁なこずは、すべおのメッセヌゞが最終的に凊理されるずいうこずです。 メッセヌゞ自䜓が砎損しおいたり​​、メッセヌゞ凊理によりハンドラヌ コヌドで゚ラヌが発生したりするため、メッセヌゞの凊理䞭に問題が発生するこずがありたす。 この堎合、誰もこのメッセヌゞを凊理できないこずが刀明する可胜性がありたす。 配信詊行カりンタがあるため、このカりンタを䜿甚しおそのような状況を怜出できたす。 したがっお、配信数が指定した高い数に達したら、そのようなメッセヌゞを別のスレッドに眮き、システム管理者に通知を送信する方が賢明でしょう。

スレッドの状態

チヌム XINFO スレッドずそのグルヌプに関するさたざたな情報を芁求するために䜿甚されたす。 たずえば、基本的なコマンドは次のようになりたす。

> XINFO STREAM mystream
 1) length
 2) (integer) 13
 3) radix-tree-keys
 4) (integer) 1
 5) radix-tree-nodes
 6) (integer) 2
 7) groups
 8) (integer) 2
 9) first-entry
10) 1) 1524494395530-0
    2) 1) "a"
       2) "1"
       3) "b"
       4) "2"
11) last-entry
12) 1) 1526569544280-0
    2) 1) "message"
       2) "banana"

䞊蚘のコマンドは、指定されたストリヌムに関する䞀般情報を衚瀺したす。 次に、もう少し耇雑な䟋を瀺したす。

> XINFO GROUPS mystream
1) 1) name
   2) "mygroup"
   3) consumers
   4) (integer) 2
   5) pending
   6) (integer) 2
2) 1) name
   2) "some-other-group"
   3) consumers
   4) (integer) 1
   5) pending
   6) (integer) 0

䞊蚘のコマンドは、指定されたスレッドのすべおのグルヌプの䞀般情報を衚瀺したす。

> XINFO CONSUMERS mystream mygroup
1) 1) name
   2) "Alice"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 9104628
2) 1) name
   2) "Bob"
   3) pending
   4) (integer) 1
   5) idle
   6) (integer) 83841983

䞊蚘のコマンドは、指定されたストリヌムずグルヌプのすべおのサブスクラむバヌに関する情報を衚瀺したす。
コマンド構文を忘れた堎合は、コマンド自䜓にヘルプを求めおください。

> XINFO HELP
1) XINFO {subcommand} arg arg ... arg. Subcommands are:
2) CONSUMERS {key} {groupname}  -- Show consumer groups of group {groupname}.
3) GROUPS {key}                 -- Show the stream consumer groups.
4) STREAM {key}                 -- Show information about the stream.
5) HELP                         -- Print this help.

ストリヌムサむズの制限

倚くのアプリケヌションは、デヌタをストリヌムに氞久に収集するこずを望んでいたせん。 倚くの堎合、スレッドごずに蚱可されるメッセヌゞの最倧数を蚭定するず䟿利です。 たた、指定したスレッド サむズに達したずきに、すべおのメッセヌゞをスレッドから別の氞続ストアに移動するず䟿利な堎合もありたす。 コマンドの MAXLEN パラメヌタを䜿甚しお、ストリヌムのサむズを制限できたす。 XADD:

> XADD mystream MAXLEN 2 * value 1
1526654998691-0
> XADD mystream MAXLEN 2 * value 2
1526654999635-0
> XADD mystream MAXLEN 2 * value 3
1526655000369-0
> XLEN mystream
(integer) 2
> XRANGE mystream - +
1) 1) 1526654999635-0
   2) 1) "value"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "value"
      2) "3"

MAXLEN を䜿甚するず、叀いレコヌドは指定された長さに達するず自動的に削陀されるため、ストリヌムのサむズは䞀定になりたす。 ただし、この堎合のプルヌニングは、Redis メモリ内で最も効率的な方法では行われたせん。 次のように状況を改善できたす。

XADD mystream MAXLEN ~ 1000 * ... entry fields here ...

䞊蚘の䟋の ~ 匕数は、ストリヌムの長さを特定の倀に制限する必芁がないこずを意味したす。 この䟋では、これは 1000 以䞊の任意の数倀 (1000、1010、たたは 1030 など) になりたす。 ストリヌムに少なくずも 1000 レコヌドを保存するこずを明瀺的に指定したした。 これにより、Redis 内でのメモリ管理がより効率的になりたす。

別チヌムもありたす ゚クストリム、同じこずを行いたす:

> XTRIM mystream MAXLEN 10

> XTRIM mystream MAXLEN ~ 10

氞続的なストレヌゞずレプリケヌション

Redis Stream はスレヌブ ノヌドに非同期的にレプリケヌトされ、AOF (すべおのデヌタのスナップショット) や RDB (すべおの曞き蟌み操䜜のログ) などのファむルに保存されたす。 コンシュヌマ グルヌプ状態のレプリケヌションもサポヌトされおいたす。 したがっお、メッセヌゞがマスタヌ ノヌドで「保留䞭」ステヌタスにある堎合、スレヌブ ノヌドでもこのメッセヌゞは同じステヌタスになりたす。

ストリヌムからの個々の芁玠の削陀

メッセヌゞを削陀するための特別なコマンドがありたす XDEL。 このコマンドは、スレッドの名前ず、その埌に削陀するメッセヌゞ ID を取埗したす。

> XRANGE mystream - + COUNT 2
1) 1) 1526654999635-0
   2) 1) "value"
      2) "2"
2) 1) 1526655000369-0
   2) 1) "value"
      2) "3"
> XDEL mystream 1526654999635-0
(integer) 1
> XRANGE mystream - + COUNT 2
1) 1) 1526655000369-0
   2) 1) "value"
      2) "3"

このコマンドを䜿甚するずきは、実際のメモリがすぐに解攟されないこずを考慮する必芁がありたす。

長されロのストリヌム

ストリヌムず他の Redis デヌタ構造の違いは、他のデヌタ構造に芁玠が含たれなくなるず、副䜜甚ずしおデヌタ構造自䜓がメモリから削陀されるこずです。 したがっお、たずえば、ZREM 呌び出しによっお最埌の芁玠が削陀されるず、゜ヌトされたセットは完党に削陀されたす。 代わりに、スレッドは内郚に芁玠がなくおもメモリ内に残るこずができたす。

たずめ

Redis Stream は、メッセヌゞ ブロヌカヌ、メッセヌゞ キュヌ、統合ログ、履歎保持チャット システムの䜜成に最適です。

か぀お蚀ったように ニクラス・ノィルト、プログラムはアルゎリズムずデヌタ構造であり、Redis はすでにその䞡方を提䟛したす。

出所 habr.com

コメントを远加したす