そこで、Throttle
実行中のクエリの途中で Timespanを変更する方法をここで尋ねたところ、 Jamesはオーバーロードがあると答え、実際に例も提供しました (すべてうまくいきました。そこからいくつかのテクニックも学びました)。
Throttle
前の週末に、受信ストリーム自体によって間隔が定義されるコードを作成しました。実際の例として、ストリームは次のように定義された一連の構造体である可能性があります
struct SomeEvent
{
public int Id;
public DateTimeOffset TimeStamp;
}
次に、受け入れ側のストリームがTimeStamp
フィールドをチェックし、それらに基づいて欠勤間隔を計算します。ジェームズのリンクされた例を少し変更すると、ストリームは次のように生成できます
Func<SomeEvent, IObservable<long>> throttleFactory = e => Observable.Timer(TimeSpan.FromTicks(throttleDuration.Ticks - (DateTimeOffset.Now.Ticks - e.TimeStamp.Ticks)));
var sequence = Observable.Interval(TimeSpan.FromSeconds(1)).Select(_ => new SomeEvent { Id = 0, TimeStamp = DateTimeOffset.Now.AddTicks(-1) }).Throttle(throttleFactory);
var subscription = sequence.Subscribe(e => Console.WriteLine(e.TimeStamp));
数ティックのタイム シフトは、説明のためのものです。
それから私はここでもっと精巧な例を持っていました.Jamesによって大いに助けられました. 要するに、ここでのアイデアは、ID ごとに (信号機に似た) 「警告灯の塔」が存在する可能性があるというものでした。黄色や赤などの色があり、どれだけの時間不在であったかによって定義される順番で点灯します。イベント。その後、イベントが到着すると、すべてのライトがオフになり、「不在タイマー」が再びゼロから開始されます。
私がぶつかった障害Throttle
は、このアイデアを使用して値を生成するように、この特定の例を変更できないように思われることです。grp => grp.Throttle(thresholdSelector(grp.Key, level), scheduler))
特に、James のコードhereでは、グループ化をオンラインでうまく実行できないようです。たぶん、私はデバッグなどに疲れ果てているだけかもしれませんが、誰かが正しい方向への微調整を提供できれば幸いです!
大きなアイデアは何ですか?イベントにはソースでタイムスタンプを付けることができますが、送信によって遅延が追加される可能性があり、これを考慮する必要があります。分散コンピューティングを扱う F# ユーザー グループのディスカッションから判断すると (そして、私自身も統合の問題にある程度精通しています)、イベントにタイムスタンプが付けられ、別のキュー システムを介して中継されるというシナリオでは、次の 2 種類のケースが作成されます。
- 技術的なタイムアウト:定義された間隔内で、一部のエンドポイントでイベントが観察されませんでした。
- ビジネス タイムアウト:多くのイベントが発生する可能性があります。たとえば、キュー システムからの一時的な持続的なイベント バースト (重複も含む) などがありますが、それらのタイムスタンプは「かなり前」です。
<編集: Brandon は、 2 .で与えられた私の例に関して有効な点を指摘しています。「ビジネスタイムアウト」がないことを実際にどのように解釈する必要がありますか? イベントが到着していない場合、生成する唯一の有効なタイムアウト イベントは「技術的な」ものだけです。それらがバーストで到着した場合、受信者はイベント間の時間差に関心があり、それに応じてカラー イベントを発生させたいと考えています。 ? または、ビジネス イベントのタイムスタンプに従ってタイマーをリセットし、バーストが到着したときに最後のタイムスタンプを取得する必要があります (これも、許容されるタイムアウト期間より長くなる可能性があります)。複雑で面倒なので、例としてこれをやめたほうがいいでしょう。
それが書かれているので、結合を実行する方法を知りたいと思っていますgrp => grp.Throttle(thresholdSelector(grp.Key, level), scheduler))
。これが複雑になる場合は、ブランドンの投稿も回答としてマークする傾向があります(グループ化はかなり複雑だと思います)。