2

エラー メッセージ、警告、アラート、ハートビートなどをデータベースに送信して、アラーム サマリー ダッシュボードで表示できるようにする必要がある .Net アプリケーション (まだ構築されていません) がいくつかあります。これにより、アプリの速度が大幅に低下することはありません。高速である必要があります。ダッシュボードにすぐに表示されるように、特定のメッセージに優先順位を付ける方法が必要です。

大量のメッセージが着信する可能性があり、複数のキューを作成できるため、MSMQ が最適な方法であると考えています。

アプリから直接 MSMQ にメッセージを送信する方が高速ですか? または、NetMSMQBinding を使用して WCF サービスに送信する方が高速でしょうか?

メッセージを MSMQ に直接送信すると、アプリは MSMQ と密接に結合され、後で MSMQ を廃棄して別のものを使用したい場合、私は失敗します。アラーム サマリ アプリが変更されるたびにアプリが公開されたら、アプリを変更する必要はありません。

メッセージを NetMSMQBinding を使用して WCF サービスに送信した場合でも、アプリを MSMQ に密結合しますよね?

このアラーム サマリー アプリケーションは巨大で、システム全体のすべてのアプリに影響を与える可能性があるため、正しく実行する必要があります。

4

4 に答える 4

3

MSMQとの緊密な結合を避けたい場合は、メッセージを取り込んでMSMQに送信する自家製のバス抽象化のようなものを使用することをお勧めします。そうすれば、いつでも好きなもの(RabbitMQ、直接のdb永続性、または考えられるもの)を使用する別の実装をプラグインできます。それ以外の場合は、個人的にはメッセージ処理をできるだけ低コストでできるだけ短くするようにしています。このようなmsmqのパフォーマンスに関する記事もご覧ください。

于 2012-11-16T19:25:22.610 に答える
1

私が働いている会社のあなたと同じような巨大なプロジェクトを終えたところです。

これは、NetTcpBindingを使用し、SQLServerデータベース上のすべての情報を永続化するWCFに完全に依存しています。

メインのWCFサービスは、データベースへの情報の永続化を担当します。他のwcfサービスは、データを必要とするクライアントにデータを返します(壁にぶら下がっている32インチのタッチスクリーン、デスクトップガジェット、スマートフォン)。

コントラクト定義と、ここのすべてのアプリケーション(10+)で使用されるすべてのクライアント関連のものを含む共通ライブラリがあります。このすべてのアプリケーションは、wcfサービスに対してすべてをログに記録します(常に非同期操作で):例外、警告、ハートビート、さらにはデバッグ情報。ここでのクライアントの数はそれほど多くありません。1つまたは2つのアプリを同時に実行している約60台のPCです。

ダッシュボードはWPFアプリケーションであり、wcfサービスに接続して、優先度に基づいて更新があるかどうかを確認し、それらを適切なUIに表示します。

60以上のクライアント間で15のRTUがあり、3つの異なる都市から同じサーバーに天然ガスパイプの温度(ºC)と圧力(バー)を送信します。この情報は、Tcpを介してWindowsサービスによって受信され、wcfサービスに送信されます。 (同じサーバー上)。このすべてのデータは重要です!! 重要なイベントを見つけてそのタイプのイベントに関係する人にSMSを送信するためにwcfサービスにクエリを実行し続ける別のWindowsサービスもあります。

Soooooo、IMO wcfは、目標を達成するための優れたテクノロジーです。

于 2012-11-16T19:19:02.270 に答える
1

テクノロジーの選択の結果から完全に隔離することは不可能であり、そうしようとすると、収穫逓減が発生します。

ある種の病気のように、すべてのコストで結合を回避するように私たち全員が教えられていることは知っていますが、そもそもWCFを使用する利点の1つは、特定のトランスポートにハード結合されないことです。構成を変更する場合にのみ、MSMQをTCPにスワップアウトできます。

@nieveが示唆しているように、抽象化を作成することで、実装の詳細(この場合はWCF)から実際に切り離されています。しかし、あなた自身をあなたの抽象的なバス表現に結合することはもっと良いですか?「結合」が少なくなる可能性がありますが、おそらく、より大きな難読化が犠牲になります。

WCFを介したMSMQの呼び出しには、コードが少量であり、分析のオーバーヘッドがほとんどない他の開発者が簡単に取得できるという利点があります。私はあなたがおそらく実際には存在しない問題の解決策を過剰に設計していることを臆病に提案します。

たとえば12か月以内にプロジェクトに新たに参入する開発者について考えてみてください。生産性を上げる前に、最初の2か月は学習に費やさないシステムを構築したいと考えています。ある程度あなたを切り離すように設計されたおなじみのフレームワークを使用することは、これを達成するために何らかの方法で行くかもしれません。

于 2012-11-16T21:40:03.203 に答える
0

私のテストでは、WCF と NetTcpBinding は非常に高速です (往復時間 1 ミリ秒未満)。
非同期を使用すると、一部の接続が失敗したときにアプリケーションがロックされるのを回避できます。
AsyncWcfLibは、抽象化のレベルを上げるのに役立ちます。

于 2012-11-29T00:44:35.183 に答える