2017-01-03 2 views
0

現在、競合状態によって複数のスレッドが同じ値をデータストアに書き込むことがあります。Google App Engineデータストアを照会する際の並行性の問題

擬似コードは次のようになります。

public void writeToDatastore(ValueObject obj){ 
    boolean objectExists = checkDatastoreForObject(obj); 

    if(!objectExists){ 
     doSomeStuff(); 
     writeObjectToDatastore(obj); 
    } 
} 

何が書かれている前に時々、二つ以上のスレッドが持続されているオブジェクトの複数のインスタンスにつながる、データストアから読み取ります。

​​キーワード(または他の同時実行性構造)を追加すると、アプリケーションのインスタンスが1つしか実行されていなければ問題が解決されます。

これらのタイプの並行性の問題は、分散環境でどのように解決できますか?

+0

あなたが値ごとにユニークな性質を持っている場合は、手動でキーIDを割り当てることができます。次に、書き込みは既存の値の先頭を上書きします。 – GAEfan

答えて

0

これを参照してください:データストアの競合を回避https://cloud.google.com/appengine/articles/scaling/contention

は - 単一のエンティティまたはエンティティグループがあまりにも急速に更新されたときにデータストアの競合が発生します。データストア は、並行待機要求を待ち行列に入れます。 で待機している要求は、タイムアウト期間を過ぎてキューに並行処理の例外をスローします。 1つのエンティティを更新するか、エンティティ グループに1秒間に何回も書き込む予定がある場合は、 のデプロイ後に可能な競合を避けるために、 のデザインを早期に再実行することをお勧めします。

1

App EngineからDatastoreを呼び出すときは、トランザクションを使用します。エンティティがそこにいるかどうかを確認するために、まずエンティティを取得しようとします。そうでなければ、エンティティをput()します。

はここでApp EngineのAPIを使用してトランザクションを示しているいくつかのサンプルコードです:https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/datastore/src/test/java/com/example/appengine/TransactionsTest.java

関連する問題