並列Pingライブラリ作るよ
使う環境は.NET 5.0
言語はみんな大好きC#
グランドデザインとして
~50ホストくらい想定
ホスト毎にインスタンスを作らない
ある程度のバランシングを行う
なぜホスト毎にインスタンスを立ち上げないのか?
RaspPiで動かした場合、割と早くスケール出来ない可能性がある
ごっこ遊びしたい僕の趣味w
可動モデル
ホスト:インスタンス=m:nの多対多モデル
稼働ルーチン
Pingを飛ばす(Timeoutは指定済み)
戻ってきた物をChannelに吐き出す
指定時間遅延する
1に戻る
ホスト選択アルゴリズム
ホストはUni-directionalなRing collectionに放り込んである。
Pivotを一個進める
進めた先が指定時間経っており、Pingを飛ばすにふさわしい状態ならホストデータと、前回完了からの経過時間を通知して終了
稼働中であったり、一巡が早すぎて指定時間経っていない場合は、ふさわしいホストが見つかるまで一時的にコレクションからDetachする。
見つかったら、先にDetachしたホストデータを今いる場所の先にAttachして終了
インスタンス毎の再稼働遅延時間の自動調停法
TargetHostCandidatesにIsRecentlyTimedOut{get; private set;}仕込む
詳細詰めてないけど、是でLockFree出来るかも?なアイディア
単方向でなく双方向連結リストにする
終端は最初と結合する(RingListの構造)
上記を2つ用意する
以下、CurrentListがA、AlternativeがBとする。
PivotをAdvanceしてCandicateHostの取得
ActivatableならWorkingにマークしてBのPivotの一個前(終端側)にくっつける
Waiting/WorkingならBのPivotの後(先端側)にくっつける
以下繰り返して、Aが空になったら、Bをプライマリ、AをAlternativeにSwap
この場合、AからのElementのDetachがAtomicかつBへのElementのAttachはAtomic。だけどAとBの操作はUn-Atomicである条件をのめるなら多分LockFreeに出来る
と思ったけど、双方向連結リストの場合、一度のInterlockedで両方を操作できないから、Lockの粒度を小さくすることは出来るけど、LockFree二は出来ないかも