2017-09-20 17 views
0

私たちは、ファイル、およびそれを処理し、データを送信し、いくつかの仕事があることを想像:外部サービス 回避重複

にデータベース

    1. を我々はプロセスに保証することができますそのファイルは一度だけ、あるいは少なくとも何かが間違っていると判断し、ユーザーにこの問題を手動で解決するよう通知しますか?

  • +0

    誰がファイルをそこに置くのですか?私は誰かを意味しますか?またはいくつかの他のプロセスのDoss? –

    +0

    @UsmanRana、はい、それは別のプロセスです – nanotexnik

    +0

    作成するデータ行には一意の識別子がありますか?ファイルはどうですか?以前に部分的に完了したファイルの再処理について心配する必要はありますか? –

    答えて

    1

    はい、できます。

    あなたができることは、名前とファイルのフラグ/ステータス(読み込んだ場合、そうでない場合は他の番号)を保存するためにデータベースにテーブルを作成することです。プロセスがその場所にあるファイルをフィードするときは、同じプロセスが名前(毎回名前が異なる場合)とデータベース内のそのファイルのフラグ/ステータスを更新するようにしてください。あなたのファイルの読み込みプロセスは、データベースからファイルの名前を取得し、あなたがどこにいてもそのファイルをダンプすることができます。完了したら、フラグをreadなどに更新する必要があります。この方法で、ファイルを複数回読み込むことを避けることができます。

    0

    データベースに2つの情報テーブルを格納します。

    1. 既に処理していたような処理済みのファイル行。
    2. ファイル自体のレコード。インクルード:
      • 処理が成功したかどうか、ファイル名
      • は、失敗した、部分的に
      • ファイルの一意性をチェックするために使用することができますSHA1ハッシュ化されたチェックサムは後で
    を成功しました

    ファイルを処理するときは、まずチェックサムが存在するかどうかをチェックします。そうであれば、処理を停止して問題をログに記録することができます。または、その情報をファイルテーブルにスローすることもできます。

    処理された行とファイルの間には、必ず外部キーの関連付けが必要です。そうすれば、何かがうまくいかない場合、手動介入をしている人が影響を受けた行を追跡することができます。

    0

    UsmanaまたはTracyの回答は、実際にファイルが複数回処理されず、ジョブが重複した要求をデータベースと外部サービス(質問の#1と#2)に送信しないことを保証していません。両方のソリューションでは、すべての処理が完了した後にログを保存して更新することを推奨しますが、最後にログを更新しようとするとエラーが発生した場合、ジョブは次に実行されるファイルを再度処理しようとし、データベースと外部サービス。 UsmanaとTracyが提案したソリューションを使って対処する唯一の方法は、トランザクション内ですべてを実行することですが、あなたのような配布環境では非常に難しい作業です。

    問題の一般的な解決策は、データベースと外部サービスに対する重複要求を正常に処理することです。実際の実装はさまざまですが、たとえばデータベースにユニークな制約を追加することができます。ジョブが重複レコードを挿入しようとすると例外がスローされます。ジョブで無視できるのは、必要なデータが既にdb。

    私の答えは、UsmanaとTracyが提案するログテーブルは必要ないとは限りません。処理ステータスを追跡するために必要ですが、分散トランザクションを使用しない限り、データベースおよび外部サービスへの重複要求は実際には発生しません。

    希望すると助かります!

    関連する問題