2

特定のメッセージをシーケンス番号とともに送信するサーバーをリッスンしています。私のクライアントは、シーケンス番号が重複しているかどうか、またはシーケンス番号が欠落しているかどうかを追跡するためにシーケンス番号を解析しますが、これは単一の増分シーケンス番号を期待するラッパー オブジェクトによって一般的に呼び出されます。残念ながら、この特定のサーバーは、各サブストリーム内でのみインクリメンタルなシーケンス番号の異なるストリームを送信します。言い換えれば、より単純なサーバーでは次のように送信されます。

1,2,3,4,5,7

私が報告するだけ1,2,3,4,5,6,7で、ラッパー ツールは 1 つのメッセージが失われたことを通知します。残念ながら、このより複雑なサーバーは私に次のようなものを送ります:

A1、A2、A3、B1、B2、A4、C1、A5、A7

(ただし、文字は実際には数値コードでもありますが、便利です)。上記は A6 以外にギャップはありませんが、1 つの数値をラッパー オブジェクトに報告する必要があるため、報告できません。

1,2,3,1,2,4,1,5,7

間違って解釈されるからです。そのため、クライアントで受け取ったものを 1 つのインクリメンタル ストリームに凝縮したいと考えています。例

A1、A2、A3、B1、B2、A4、C1、A5、A7

実際には次のように変換する必要があります。

1、2、3、4 (B1 は実際には 4 番目の一意のメッセージであるため)、5、6、7、8、10 (9 は A6、B3、C2、または別の文字 1 である可能性があるため)

その場合、これは 1 つのメッセージ (A6) を見逃したと見なされます。別のシーケンス例:

A1、A2、B1、A7、C1、A8

次のように報告できます。

1,2,3,8,9,10

最初の 3 つは論理的に有効な順序であり、欠落がないためです。次に、A7 を取得します。これは、4 つのメッセージ (A3、A4、A5、および A6) を見逃したことを意味するため、ラッパーが判断できるように 8 を報告します。その後、C1 が入ってきて、それで問題ないので 9 番を付け、A8 が次に期待される A になったので 10 番を付けます。

ただし、この動作を作成する方法を見つけるのに苦労しています。それについて行くにはどのような方法がありますか?

4

1 に答える 1

1

ストリームごとに、そのストリームのシーケンスが正しいことを確認してください。次に、集約されたものとして見たすべての有効なシーケンス番号のカウントを発行します。擬似コード:

function initialize()
    for stream in streams do
        stream = 0
    aggregateSeqno = 0

function process(streamId, seqno)
   if seqno = streams[streamId] then
      streams[streamId] = seqno + 1
      aggregateSeqno = aggregateSeqno + 1
      return aggregateSeqno
   else then
      try to fix streams[streamId] by replying to the server

function main()
   initialize()
   while(server not finished) do
      (streamId, seqno) = receive()
      process(streamId, seqno)
于 2013-01-10T23:58:35.600 に答える