1

2 つの Azure Web ジョブがあります。1 つ目は、PDF を取得して個々のページ イメージに分割し、2 つ目の Web ジョブが個々のページを処理するように別のメッセージをキューに入れるように指示する受信メッセージを取得します。QC インスタンスでは問題なく動作しましたが、本番環境に移行しようとすると、2 番目のジョブで奇妙なエラーが発生し始めましたが、一貫性はありませんでした。最初のジョブが実行され、ファイルがページ イメージに分割されます。それはうまくいっています。すべてのページ イメージが作成され、すべてのページ メッセージがキューに入れられることを確認しました。ただし、2 番目のジョブでは、一部のメッセージのみが正しく処理されています。残りは、WebJob 診断でこのエラーを示します。

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Microsoft.Azure.WebJobs.Host.FunctionInvocationException: 関数の実行中に例外が発生しました: Functions.ProcessBatchPage ---> System.Data.SqlClient.SqlException: ネットワーク関連またはインスタンス固有のエラーが発生しましたSQL Server への接続の確立中。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: SQL ネットワーク インターフェイス、エラー: 52 - ローカル データベース ランタイムのインストールが見つかりません。SQL Server Express が正しくインストールされ、ローカル データベース ランタイム機能が有効になっていることを確認してください。) ---> System.ComponentModel.Win32Exception: Theシステムは指定されたファイルを見つけることができません

しかし、奇妙なことに、このエラーはローカル データベース ランタイムと SQL Server Express に言及しており、コードのどこにも参照していません。システムは Azure SQL DB を指しています。仕事は ADO.Net で、接続文字列をハードコーディングして、構成ベースの接続文字列の問題を排除しようとしました。しかし、奇妙なのは、メッセージの特定の部分にしか発生しないことです。他は完璧に処理します。

最後に、ジョブをローカルでデバッグして実行し (まだ Azure 上の実際のキューと DB を指している)、同じ問題が発生しました。ただし、ジョブはコードの最初の行としてジョブ ID を含むコンソール行を出力します。正常に処理されたジョブについては、この writeline が表示されます。失敗した人には、何も見えません。ジョブが実際に正しく起動していないようです。(失敗したジョブの実行時間も 50 ~ 100 ミリ秒と非常に短い)

4

1 に答える 1

2

私はいくつかの仕事で同じ問題を抱えており、解決策を見つけるためにこれらの記事に出くわしました:

論文の記事から:

一時的な障害の原因:

クラウド環境では、データベース接続の失敗や切断が定期的に発生することがわかります。これは、Web サーバーとデータベース サーバーが物理的に直接接続されているオンプレミス環境と比較して、より多くのロード バランサーを使用しているためです。また、マルチテナント サービスに依存している場合、サービスの呼び出しが遅くなったりタイムアウトしたりすることがあります。他のケースでは、あなたがサービスを頻繁に利用しているユーザーである可能性があり、サービスは、サービスの他のテナントに悪影響を及ぼさないようにするために、意図的にあなたを抑制 (接続を拒否) します。

スマートな再試行/バックオフ ロジックを使用して、一時的な障害の影響を軽減します

Microsoft Patterns & Practices グループには、(Entity Framework 経由ではなく) SQL Database アクセスにADO.NETを使用している場合に、すべてを実行するTransient Fault Handling Application Blockがあります。再試行のポリシー (クエリまたはコマンドを再試行する回数と試行間の待機時間) を設定し、SQL コードを using ブロックでラップするだけです。

public void HandleTransients()
{
   var connStr = "some database";
   var _policy = RetryPolicy.Create < SqlAzureTransientErrorDetectionStrategy(
    retryCount: 3,
    retryInterval: TimeSpan.FromSeconds(5));

    using (var conn = new ReliableSqlConnection(connStr, _policy))
    {
        // Do SQL stuff here.
    }
}

Entity Frameworkを使用する場合、通常は SQL 接続を直接操作するわけではないため、この Patterns and Practices パッケージを使用することはできませんが、Entity Framework 6 では、この種の再試行ロジックがフレームワークに組み込まれています。同様の方法で再試行戦略を指定すると、EF はデータベースにアクセスするたびにその戦略を使用します。

Fix It アプリでこの機能を使用するには、DbConfiguration から派生するクラスを追加し、再試行ロジックを有効にするだけです。

// EF follows a Code based Configuration model and will look for a class that
// derives from DbConfiguration for executing any Connection Resiliency strategies
public class EFConfiguration : DbConfiguration
{
    public EFConfiguration()
    {
        AddExecutionStrategy(() => new SqlAzureExecutionStrategy());
    }
}
于 2016-03-13T09:33:58.123 に答える