0

IOS ゲームを開発しており、バックエンドに google-app-engine を使用しています。ユーザーは、建物をタップしてゲーム内のお金を現金化できます。ユーザーはいくつかの建物をかなり速くタップし、これにより、同じオブジェクト (USER) と異なる建物で複数の同時トランザクションが発生します。

残念ながら、これは再試行が失われるため、4 ~ 5 回目のタップがタイムアウトになることを意味します。また、2回目から5回目のタップはロックにより非常に遅いということです。

私の最初の考えは、トランザクションをタスクにすることでしたが、最初の呼び出しがまだ完了していないため、関数の 2 回目の呼び出しで totalAmount が間違っています。

同じエンティティへの複数の高速更新をサポートする良い方法はありますか?

       int retries = 5;
        while (retries > 0) {

            // Wrap everything into a transaction from here
            TransactionOptions options = TransactionOptions.Builder.withXG(true);
            Transaction txn = datastore.beginTransaction(options);

                try{
                    // Ok we got the template - now check against the 

                   // Update user... with money gained 
                   // Update Building...money withdrawn

                   //Do the transaction
                    datastore.put(txn, user.getEntity());
                    datastore.put(txn, building.getEntity());
                    txn.commit();

                    // do callback code...which returns TotalMoney

                    break;

                } catch (Exception e) {
                    if(retries > 0){
                        retries--;
                    }
                    else{
                   //fail code...
                } finally {
                    if (txn.isActive()) {
                        txn.rollback();
                    }
                }
            }
4

2 に答える 2

3

一貫性のためにトランザクションが必要です。応答性のためにバックエンドを使用する必要があります。

  1. バックエンド インスタンスを使用してデータをメモリに保持し、高速更新を実現します。

  2. バックエンドでデータが更新されるたびに、タスクを開始し、データストア内のエンティティをトランザクションで更新します。

于 2012-04-24T16:54:53.567 に答える
1

1つの可能性は、XGトランザクション、またはトランザクションをまったく使用しないことです。代わりに、すべてのアクションをログに記録するトランザクションログがある方がはるかに有益です。そうすれば、タスクまたはバックエンドにトランザクションログの効果を適用させて、問題が発生した場合に最終的に一貫性を保つことができます。これにより、フロントエンドのスループットが大幅に向上し、長期的にはカスタマーサービスがはるかに簡単になります。

覚えておくべきことの1つは、エンティティグループの更新に関する一般的な経験則です。つまり、1/sの速度で更新するようにエンティティグループを設計します。実際のレートははるかに高くなりますが、これは衝突や競合を防ぐための良いルールです。

于 2012-04-24T20:12:35.633 に答える