1

WCFサービスからの送信データ/メッセージに優先順位を付けられるようにしたいと思います。

基本的なシナリオは次のとおりです。

  1. クライアントはサーバーからデータストリームを要求します。データストリームはライブで大規模であり、終わりがない可能性があります(機器監視データ)。これをHighPriorityDataStreamと呼びます。
  2. クライアントが追加データを要求します。これをLowPriorityDataと呼びます。

帯域幅は制限されています(ダイヤルアップモデムまたは衛星を考えてください)。LowPriorityDataの要求が行われたときに、現在のHigPriorityDataStreamが中断または遅延されないことが非常に重要です。

私はすでにソケットベースのレガシーシステムを持っていますが、これはデータがソケットバッファに配置される順序を手動で制御することによって実現されます。優先度の高いデータがバッファに配置され、余地がある場合は、優先度の低いデータが追加されて、残りのバッファがいっぱいになります。

このプロセスをWCFで再設計しようとしています...すぐに使用できるソリューションがわからないため、カスタムチャネル動作を作成する必要があるかもしれないと考えていますが、私がそのルートに行く前のコミュニティ:)

4

2 に答える 2

0

一般的なすぐに使えるソリューションはないと思います。解決策は、他の要件によって異なります。クライアントごとまたはサーバー全体(すべてのクライアント)ごとに帯域幅を制御しますか?同じプロキシから優先度の低い操作を呼び出しますか、それとも新しい操作のために新しいプロキシを開始しますか?より優先度の高い操作を同時に実行しますか?着信リクエストを優先しますか?

最も簡単なソリューションは、クライアントごとに帯域幅を制御し、すべての呼び出しに同じプロキシを再利用し、同時に1つの優先度の高い操作のみを完了し、要求をFIFO順に処理することを想定しています。サービスの実装を[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession、ConcurrencyMode = ConcurrencyMode.Single)]でマークするだけではありません(これは、NET.TCPを介して公開されるサービスのデフォルト設定である必要があります)。この設定は、同じクライアントプロキシからのすべての呼び出しに対して同じサービスインスタンスを再利用しますが、一度に1つの呼び出しのみが処理されます(他の呼び出しは、処理されるかタイムアウトになるまでキューで待機します)。

よろしく、ラディスラフ

于 2010-08-10T08:12:55.350 に答える
0

何度も調べた後(Ladislavの思慮深いアイデアに感謝します)、私はコミュニケーション層にビジネス層の問題を解決するように依頼しているという結論に達しました。問題をより適切に説明するために、複数の接続と1つのデータソースがあります。データソースは、自身のデータソース(ライブデータストリームと永続化されたデータベース)から収集するデータに優先順位を付け、優先順位に基づいてさまざまなクライアントにデータを送り返す必要があります。明確にするために、クライアントには役割ベースのIDに基づく相対的な優先順位があり、データソースには優先順位があり(永続データよりもライブデータを優先します)、データソース内の個々のフィールドには優先順位があります(他のすべてが等しい、フィールドXは常にフィールドYの前に送信する必要があります)。

これはすべてしっかりとビジネスロジックであり、これらの優先度要件に基づいて入力データ項目を自動的に並べ替え、各リクエストをこの順序で処理する一連の優先度キューとして採用したソリューションです。

于 2010-08-25T20:06:18.900 に答える