1

おおよそ次のようなPHPとMySQLを使用して新しいプロジェクトを開始しています。

毎分、さまざまなユーザーの API から To Do トランザクションのリストを取得しています。

例:

user1 send $1 to user2
userx send $2 to usera
userw send $0.50 to user2

etc..

user1 が $1 を user2 に送りたいとします。成功するか、資金が不足しているか、ユーザーのスペルが間違っているために失敗するかの 2 つの可能性があります。失敗した場合は、ユーザーにメッセージを送信します。

私は今、いくつかの選択肢に直面しています:

オプション1

処理が必要なトランザクションを含むデータベース テーブルを作成し、それらを毎分処理する cronjob を使用します。ここでのリスクは、スクリプトがエラーまたはタイムアウトに対して実行される可能性があり、他のトランザクションがデータベース テーブルで進行中と表示される可能性があることです。そのため、タイムスタンプと照合するための 2 つ目のスクリプトが必要になります。

オプション 2

トランザクションを受け取った後にトランザクションごとに呼び出され、応答を返す API または関数を作成します。そこから別の API または関数を呼び出して、その応答を処理するか、次のトランザクションに進むことができます。ただし、スクリプトの実行が停止した場合にそれらを失う危険がないため、それらをデータベース テーブルに配置する必要があります。したがって、次のように機能します。すべてのトランザクションをデータベーステーブルに入れます-トランザクションを開始します-トランザクションが終了したらテーブルから削除します-トランザクション2を開始します.


トランザクションのリストがどれくらい長くなるかわからないため、どちらのオプションにも欠陥があります。長い場合、PHP を長時間実行するのは最適ではありません。set timeout をゼロに設定するのは危険です。PHPで拡張できるソリューションを作成しようとしています。そこで、オプション 3 を考えていました。


オプション 3 (最適なソリューション?)

API を使用して 10 件のトランザクションを返します。

データベースで、スクリプトに送信されたことを示すフラグと、送信された時刻を示すタイムスタンプを設定します

PHP スクリプトは API から 10 個のトランザクションを取得します - 10 個のトランザクションを処理します。

トランザクションが完了したら、このテーブルから削除し、完了したトランザクション テーブルにコピーします。

timesent が X 分 (10 トランザクションの実行時間の上限に基づく) よりも大きい場合、cronjob スクリプトで 3 分ごとにチェックします。大きい場合は、送信しないように設定して、再度送信できるようにします。


ご覧のとおり、これに関する私の思考プロセス全体を書き留めて、意見を求めています。私が見逃したものがあるはずです。また、これらは実際の金融取引ではないことに注意してください。これは、明確にするために私が使用できる最良のメタフォーです。

4

2 に答える 2

1

現在のテクノロジースタックからの最小限の差異を使用してそれを実行したい場合は、正しい方向に進んでいます。基本的に、最低限の MQ またはジョブ サーバーを再作成しています。

ジョブ/タスク/トランザクション キューに最低限必要な機能は次のとおりです。

  • ジョブ (user1 が $2 を user2 に送信)
  • 状態 (準備完了、処理中、エラー、完了)

あなたもきっと欲しくなる

  • 最後のエラー文字列 (何が起こったのかを理解できるように)
  • おそらく再試行回数 (失敗する前に再試行する必要があるタスクの場合、一時的なエラーが原因で失敗する可能性があるもの)

cron ジョブの処理を並列化することに決めた場合、特に大規模なバッチで操作を開始する場合は、スクリプトのどのインスタンスに処理用のジョブがあるかを追跡する必要があります。(そして、それを行う場合、特定のトランザクションが迅速に終了することを確認するか、単一の遅いジョブの背後にあるすべてのジョブを効果的に停止できるかを監視する必要があります)

API からフェッチするか、データベースから直接フェッチするかにかかわらず、6 つのうち 6 つ、もう 1 つが半ダースです。

于 2009-01-09T22:40:26.113 に答える
0

そのトランザクションのリクエストが受信されたときに、各トランザクションを処理することをお勧めします。

IE ボブは「送金」ボタンをクリックして、20 ドルをアリスに送金します。このトランザクションを処理する関数を呼び出して、「トランザクションが成功しました」または「問題が発生しました..」というメッセージをすぐに表示します。

トランザクション処理に時間がかかる場合は、AJAX を介して処理を実行し、サーバー側で処理が行われている間、「処理中..」というプログレス バーを表示して、yoursite.com/transactions.php?result=success&id=$idまたはにリダイレクトすることができます。yoursite.com/transactions.php?result=failure&id=$id

于 2009-01-06T13:12:39.000 に答える