4

毎日 50 万回アクセスされるページを含む数千のカタログがあります。各ページ ヒットの最後に、いくつかの CGI 変数をデータベースに挿入します。フォームが送信された場合、または検索が実行された場合、その情報の一部を別のデータベースに挿入します。これらのデータベース挿入のそれぞれから情報を返す必要はありません。これらの挿入は、ページ処理の最後に発生します。

「実行」スレッドが起動されると、ページ処理が続行され、応答を待たないことを読みました。これにより、ページ内のクエリが実行されるのを待たないため、ページの完成がスピードアップするようです。これは正しいです?

これらのデータベース挿入をこのように独自のスレッドに配置する利点はありますか?

<cffunction
    name="OnRequest"
    access="public"
    returntype="void"
    output="true"
    hint="Fires after pre page processing is complete.">

    <cfargument name="RequestedContent" type="string" required="true" />


    <!--- OUTPUT THE PAGE CONTENT --->
    <cfinclude template="#ARGUMENTS.RequestedContent#" />

    <cfscript>
        thread
            action="run"
            name="Tracking" {
            include "track1.cfm";
            include "track2.cfm";
        }
    </cfscript>

    <cfreturn />
</cffunction>
4

3 に答える 3

3

ページ内のスレッドに参加しないと、ページがすぐに終了するという点であなたは正しいです。すべてのコンテンツがユーザーに送信され、http 接続が閉じられた後、スレッドの実行が終了する可能性があります。

これはその機能の正当な使用のように聞こえると思いますが、挿入にそれほど時間がかかっている場合は、データの処理方法を確認することもできます.

于 2014-07-10T18:19:26.480 に答える
2

私は「いいえ、それを行うメリットは [ほとんど] ありません」と言うでしょう。ユーザーをさらに数ミリ秒節約できますが、ColdFusion サーバーに 2 倍の負荷をかけることになり、全体的にパフォーマンスが低下する可能性があります。サーバーがすべてのリクエストに使用できるスレッドの数は限られているため、各リクエストに使用する数を 2 倍にすると、それらをすべて使用するリスクが 2 倍になります。

また、新しいスレッドを開始すること自体にオーバーヘッドがあるため、ここでユーザーに与える利益は直線的ではありません。

挿入クエリに時間がかかり、ユーザー エクスペリエンスに影響を与えている場合は、(DB 側で) それらを調整する必要があります。

また、そのコードにパフォーマンスのボトルネックがすでにない限り、時期尚早に最適化してもあまり意味がありません。

于 2014-07-10T18:02:04.463 に答える
2

リクエストのたびにテーブルにデータを挿入するときに、テーブルのロックの問題が発生する可能性があるため、スレッドは、その変数の挿入時間について、エンド ユーザーへの分散の一部を緩和できる可能性があります。これが大量のサイトで成功を収めて使用されているのを見てきました。ただし、Adam が言及しているように、スレッドは有限であり、フリー スレッドが本当に必要なプロセスのデッドロックの問題が発生している間、いずれにせよスレッドを拘束してしまう可能性があります。

このシナリオでは、アプリケーションで挿入を 1 ~ 2 分待ち行列に入れてから、スレッドで一括挿入を実行することを検討してください。サーバーがキューをフラッシュする前に崩壊し、スレッドセーフを処理するためにもう少し作業が必要な場合、これには明らかにデータ損失のリスクがあります。ただし、挿入されたデータをすぐに必要としない場合は、うまく機能します。

于 2014-07-10T20:39:09.233 に答える