2017-03-16 3 views
0

要するに、私のプロジェクトは処理できるデータよりも速くデータを受信して​​おり、データベース(EF6からSQL Server 2016)ベストプラクティスのアプローチが何であるか分かりません(Service Brokerを介したデータベースへのオフロード?他に何か?)書き込みイベントは十分に速く処理されないため、カスケードイベントログと重大なメモリクラッシュが発生します。イベントの処理が非常に高速で処理が困難なため、問題のあるバックログが発生する

書き込みイベントは低優先度であり、非同期タスクを使用しています。書き込みイベントは多くのデータと多くの関係を伴い、EFはそれらを効率的に処理していません(私はAddRangeを使用していますが、EFは多くのシングルインサートですべてを送信しています。 。

私はリレーションシップを元に戻そうとしましたが、データベースに処理を移しました。バッチ処理された「遅延」キュー(「空の私」イベントをトリガーする観測可能なキューインプリメンテーションしきい値が満たされたとき)、インバウンド書き込みイベントを非常に迅速に処理できる(キュー内の要求をダンプして移動する)が、これは私をどこにでも持ち込まなかった(驚くことではない。基本的に組み込みのメッセージキューの上にメッセージキューを追加しましたか?)。

私が間違っている場合は私を修正してください。しかし、EFは私が持っているものと同じくらい重い、関係の重いものとして正しいツールではないようです。 )。したがって、これを賢明に解決するために、EFをバイパスして、独自の一括書き込みクエリを実行するのは理にかなっているのですか?これはService Brokerにとって適切な使用ですか? Service Brokerを使用すると、データセットをキューに追加するだけで、フロントエンドが移動できるようになり、データベースはいつでもリレーションシップを処理して構築できます。これらの解決策は合理的かベストプラクティスか、間違った木を鳴らしていますか(あるいは口紅を豚に載せているかもしれません)?

ありがとうございます。

+0

をマージ

  • 一括更新を削除挿入しますダの連続一定のストリームを取得していますta、またはbursts?バーストの場合は、間にキューを置くことができます。 RabbitMQ、Kafka、Redisなどの外部ブローカー。作家はバースト後追いつくだろう。 DB書き込み層が処理できるスループットが一貫性のあるストリームの場合は、書き込みSQLを最適化し、プレーン・バッチSQLに移動して、DB内のいくつかのインデックスまたはトリガーを削除します。最後に、高速のnoSQLデータ・ストアを調べる必要があるかもしれません。 –

  • +0

    @PiotrGwiazdaこれは時折持続的なバーストを伴う一定の流れです。私はそれらの外部のブローカーを見ていきます、ありがとう!私はデータ層に焦点を当て自分のSQLをロールバックする必要があることに同意します。結局、アプリケーションの吸気段階では、関係について気にしません(それは私がEFを下げていると思います)。それが私のコストがどこにあるのであれば、それらのタスクを割り当てることが理にかなっていますデータベースに転送します。 –

    答えて

    1

    私が間違っているなら、私を修正し、私が

    を持って 何としてEFはあなたが書き込み重いとの関係-重いような何かのために 右のツールではないように私には思えるしてくださいそうです。

    デフォルトでは、エンティティフレームワークは保存するすべてのレコードに対して1つのデータベース往復を実行します。INSANELY slowです。

    免責事項:私はEntity Framework Extensions

    の持ち主だ(ライブラリは無料ではありません)

    このライブラリには、あなたは、Entity Frameworkのパフォーマンスを向上させることができます。

    複数のエンティティを一度に保存すると、私たちのライブラリが役立つかもしれませんが、試してみる価値はありますか。

    例として、BulkSaveChangesはSaveChangesとまったく同じですが、必要なデータベースの往復を大幅に減らすことで高速になります。

    • バルクのSaveChanges
    • バルク
    • バルク
    • バルク

    // Easy to use 
    context.BulkSaveChanges(); 
    
    // Easy to customize 
    context.BulkSaveChanges(bulk => bulk.BatchSize = 100); 
    
    // Perform Bulk Operations 
    context.BulkDelete(endItems); 
    context.BulkInsert(endItems); 
    context.BulkUpdate(endItems); 
    
    // Customize Primary Key 
    context.BulkMerge(endItems, operation => { 
        operation.ColumnPrimaryKeyExpression = 
         endItem => endItem.Code; 
    }); 
    
    +0

    お返事ありがとうございました!私がEFに固執すれば、私はさらにあなたの内線を掘り下げます。しかし、私は、フロントエンドが受領時に関係を気にしないので、私のフロントエンドからデータ層に作業をシフトするだけで、より多くのメリットが得られると考えています。データ層だけでそれを行うことができますが無駄に見える。 –

    関連する問題