1

これが私の問題を保存してほしいように思われる場合は申し訳ありませんが、少し前に stact に出くわしたことがあり、慣れるのに便利なライブラリのようであり、目前の問題にはうまくいくと思います.

ソースコードを見てみましたが、そこにはたくさんあります!:) どこから始めればいいのかわからない。

私が必要としているのは、非同期 Web リクエストを定期的に送信し、結果をローカルに保存するコンポーネント (Actor?) です (結果の解析が最初に行われます)。他のスレッドは、さまざまなタイミングで結果を要求します。

私が見る限り、結果をリクエストした人に結果を返すには、スケジューラ、ファイバー、およびチャネルが必要です。次のようなもの:

private static readonly ConcurrentDictionary<Uri, ServerLoad> ServerLoads = new ConcurrentDictionary<string, ServerLoad>();
public Channel<Request<IEnumerable<ServerLoad>>> ServerLoadChannel { get; private set; 
public LoadRetriever(Inbox inbox, Fiber fiber, Scheduler scheduler, ILoadBalancerConfiguration config)
{
    this.inbox = inbox;
    this.fiber = fiber;
    this.scheduler = scheduler;

    this.scheduler.Schedule(
        0,
        config.FetchIntervalMilliSecs,
        fiber,
        () =>
            {
                foreach (var server in config.Servers)
                {
                    // need someway to send async web request to url in
                    // server.LoadRetrievalAddress and save/update result
                    // in ServerLoads dictionary
                }
            });

    this.ServerLoadChannel = new ConsumerChannel<Request<IEnumerable<ServerLoad>>>(this.fiber, 
        request => request.Respond(ServerLoads.Values));
}

}

これは当面はすべて理論上のものであり、完全に間違っている可能性があります。私が抱えている主な問題は、非同期要求 (WebClient.DownloadStringAsync() および DownloadStringCompleted) を実行することです。AsyncResultChannel の逆を行うもの

ヒント/例/正しい方向へのプッシュをいただければ幸いです!

(stact のタグを作成しようとしましたが、私の評判は十分ではありません:S)

4

2 に答える 2

2

さて、ここにいくつかのことがあります。まず、以下を使用して、Actor であるクラスを作成する必要があります。

public class MyServerCoordinator : Actor 
{}

次に、そのアクターは構成をロードし、サーバー インスタンスごとに別のアクターを作成します。これにより、構成された各サーバーが独自のスケジュールで情報を取得できるようになります。

次に、以下を使用して、タイプごとに ActorFactory を作成する必要があります。

var factory = ActorFactory.Create((i,f,s) => new MyServerCoordinator(i,f,s));
var actor = factory.GetActor();

メッセージ パッシングでは、生の CLR 型を使用する代わりに、アクター間で交換するメッセージごとにメッセージ クラスを作成する必要があります。

また、各アクターのコンストラクターで、スケジュールされた更新とは別に要求を処理するための受信ループをセットアップできます。アクターは、送信者への応答チャネルを含むリクエストを送信することで、相互に通信できます。これにより、サーバーごとのアクターがコーディネーターに話しかけることができます。

MyServerCoordinator(Inbox inbox)
{
    inbox.Loop(loop =>
    {
        loop.Receive<Request<ServerData>>(request =>
        {
            request.Respond(new ServerDataResult(_myCurrentValue)); 
            loop.Continue();
        });
    }
}

各アクターには独自のファイバーがあるため、同時コレクション タイプやロック メカニズムを使用する必要はありません。アクター モデルはメッセージ パッシングを介して同時実行を処理するため、セマフォなどは使用されません。

AnonymousActor.New() インライン宣言を使用して非アクター コードからアクターと対話する方法を確認するために、単体テストのサンプルのいくつかを確認することもできます。

于 2011-08-29T02:28:14.533 に答える
1

開始するのに適した場所は、おそらく Cashbox https://github.com/Cashbox/Cashboxです。古いバージョンの Stact で書きましたが、ほとんどの概念は問題なく移植できるはずです。

https://github.com/Cashbox/Cashbox/blob/master/src/Cashbox/Engines/FileStorageEngine.csは、すべてのアクター ベースの魔法が発生する場所です。https://github.com/Cashbox/Cashbox/blob/master/src/Cashbox/Engines/FileStorageEngine.cs#L182は、リクエストを作成してレスポンスを待つことがすべてです。

于 2011-08-29T02:21:48.090 に答える