3

10秒ごとにWebサービスにリクエストを送信し、ローカルデータベースでデータを変更したり、その逆を行ったりする同期アプリケーションがあります。便宜上、また論争を解決するために、要求と応答の SOAP メッセージのペアをログに記録したいと考えています。

しかし、私の経験から言うと、SQLite データベースに同じ要求と応答を詰め込み、多くのスペースを必要とします。

より少ないディスク容量で同じレベルのログ詳細化を実現するにはどうすればよいですか? 実際、メッセージ全体をログに記録する利点はありますか? 完全なメッセージの代わりに、パラメーター値を切り取ってログに記録できるのではないでしょうか?

おそらく、メッセージを圧縮する (またはデータの一部を含む完全なメッセージを拡張/取得する) ことができ、より少ないデータを格納できますが、必要な場所にソース メッセージを取得する機能を備えた別のメカニズムがあるでしょうか?

サンプル: リクエスト:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetModifiedItems>
         <tem:Key>abcdef</tem:Key>
      </tem:GetModifiedItems>
   </soapenv:Body>
</soapenv:Envelope>

応答:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetModifiedItemsResponse xmlns="http://tempuri.org/">
         <GetModifiedItemsResult xmlns:a="http://schemas.datacontract.org/2004/07/Exchange" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:Body i:type="a:lst">
               <a:List>
                  <a:BaseItem i:type="a:asd">
                     <a:ISDELETED i:nil="true"/>
                     <a:ID>1</a:ID>                     
                     <a:SYSUSER>b2</a:SYSUSER>
                  </a:BaseItem>
                  <a:BaseItem i:type="a:asd">
                     <a:ISDELETED i:nil="true"/>
                     <a:ID>2</a:ID>
                     <a:SYSUSER>b3</a:SYSUSER>
                  </a:BaseItem>
               </a:List>
            </a:Body>
            <a:Msg>SUCCESS</a:Msg>
         </GetModifiedItemsResult>
      </GetModifiedItemsResponse>
   </s:Body>
</s:Envelope>
4

4 に答える 4

1

わかった。すべてをログに記録するように WCF を設定するのは非常に簡単です。ここに例を示します。IMessageInspector インターフェイスを使用したい。

質問の2番目の部分について。大量のデータ ストレージの使用。2つの答えがあります。あなたは大量のデータストレージを使い果たします。

  1. 各メッセージは大きい (XML はデータ ストレージの効率については不明)。
  2. あなたはたくさんのメッセージを保存しています。

したがって、各部分からの寄与を減らしたいと考えています。

最初は、あなたが正しく推測したとおりです。データを圧縮することで、ペイロード サイズを減らすことができます。単純な情報理論から、データの圧縮率はデータの性質に依存することがわかっています。この場合、XML は簡単に圧縮できます。事前にわかっているスキーマの量に応じて、スキーマを多かれ少なかれ圧縮できます

次に、ペイロードの数を減らすことができます。保存されたリクエストの数を定期的に切り捨てるだけで、ストレージを制限できます。

ただし、ストレージ メカニズムとして SQLite を使用することは絶対にないことを最後に指摘しておきます。私の経験から、P/Invoke オーバーヘッドはサーバーのパフォーマンスを大幅に制限します。また、SQLite の同時実行モデルは非常に貧弱であり、サーバーでの同時要求の数も制限されます。

率直に言って、ストレージにフラット ファイルだけを使用する以外に何か必要があるかどうかを尋ねなければなりません。クエリが必要な場合は、XML NoSQL ソリューションに切り替えることをお勧めします。

XML NoSQL データベースを使用することのもう 1 つの利点は、アプリケーション サーバーがダウンした場合でも、箱から出してクエリを実行できることです。

さて、代わりに XML からデータを抽出するか、それとも互換性のない形式で保存するかについては...私はそれが非生産的であると主張します。実際のリクエストを保存することで、回帰テストにリクエストを再送信する小さなアプリを作成できます。

于 2013-05-13T10:54:13.560 に答える
1

ログは 2 つの主要な目的を実行します。

  1. アプリケーションの問題が発生した場合のデバッグ/トレース
  2. 監査証跡

これらを達成するには、可能な限りログを記録する必要があります。したがって、SOAP メッセージ全体をログに記録します。ディスク容量を節約するために、断続的に圧縮され、定期的にアーカイブされる適切な名前 (日付と時刻を含む) のフラット ファイルに格納できます。

幸運を。お役に立てれば

于 2013-05-18T05:10:01.890 に答える