0

私は Google App Engine で小さなプロジェクトに取り組んでおり、システムがリアルタイムの BID/ASK スプレッドを表示する株式市場と同様に、参加者が偽物を売買できるサイトを実装しようとしています。

簡単な例として:

  • 売り手が 10 ボックスを 8.00 で販売する注文を出します (注文 1)
  • 買い手はその後、最大 9.00 で 5 ボックスを購入する注文を出します (注文 2)。

2 番目の注文が行われると、システムは複数のタスクを実行する必要があり、すべてのタスクが正常に完了することが条件となります。

  • 購入者から箱の代金を支払う資金 (8.00 x 5) を受け取って、販売者に渡します。
  • 箱(5)を売り手から受け取り、買い手に渡す
  • 注文を完了として更新 (OID 2 ) または一部約定 (OID 1) として更新して、二重に一致しないようにします。
  • 各参加者から料金を受け取り、システム アカウントに追加します

ある参加者から別の参加者に資金を移動するだけなら、途中でシステムに障害が発生しても安全に移動できます。しかし、上記のすべてのタスクが正しく完了することを確認し、それらのいずれかが失敗した場合にロールバックすることは、App Engine では非常に複雑に思えます。

さらに、私の「オーダー ブック」とオーダー マッチング エンジンは現在シングル スレッドです (ロックにミューテックスを使用しています)。

だから(最後に) - 私の質問は:

  • すべてのステップが正しく完了することに依存する複数のステップがある App Engine を使用する場合のベスト プラクティスはありますか?
  • オーダーブックをマルチスレッド化する方法、またはシングルスレッドのままにする方法について、誰か提案はありますか?このコアピースがサイトのスケーリングにブロックされないようにするためのベストプラクティスはありますか? タスクを使用して注文の追加/更新/キャンセルをキューに入れ、本を直接の参加者の入力から切り離すことを考えました。

ありがとう、私はあなたの助けを楽しみにしています!

4

2 に答える 2

1

商品の注文を順番に並べることができれば、オフラインで注文をクリアできると思います。「オフライン」とは、一日の終わりに私のところに来て、注文の順序を教えてくれれば、どの取引が行われたかを教えてくれることを意味します. 問題の 1 つは、トランザクションが決済されているはずのときに買い手が資金を持っていない場合はどうなるかということです。これには、次の 2 つの方法で対処できます。

  1. 資金をエスクローに入れて、清算できる注文ができるようにします。
  2. 資金が利用できない場合にそれらをクリアしようとすると、買い注文をドロップします。

あなたが提案したように、資金移動が正しいことを確認するために、おそらくクロスエンティティグループトランザクションが必要になるでしょう (つまり、資金は作成も破棄もされません)。

注文を時間順に並べることができます (例:paced_at = db.DateTimeProperty(auto_now_add=True))。2 つの注文が同時に発生する場合は、何か (できれば公平で決定論的なもの) を使用して、引き分けにします。数値 ID (決定論のため) のハッシュ (公平性のため) は、ここでは悪い選択ではないかもしれません。

App Engine は、アプリが多数の同時インスタンスを持つことができるという意味で、本質的にマルチスレッドです (ただし、インスタンスは必ずしも同じプロセス内のスレッドであるとは限りません)。インスタンスは自動的に作成され、現在、インスタンス数を 1 に制限する方法はありません。アプリの状態が (ローカル メモリ、memecache、またはその他の場所ではなく) Datastore にあり、トランザクションが正しい場合、あなたのアプリは「無料で」マルチスレッド化されます。もちろん、あなたの取引が正しいことは些細なことではありません。

覚えておくべきもう 1 つのツールは、タスクがトランザクションに対応できることです。これは、タスクを使用してオフラインでブック クリアを行いたい場合に便利です。

于 2013-04-13T12:07:57.843 に答える