我的应用程序目前面临一个问题,即竞争条件有时会导致多个线程将相同的值写入数据存储。
伪代码如下所示:
public void writeToDatastore(ValueObject obj){
boolean objectExists = checkDatastoreForObject(obj);
if(!objectExists){
doSomeStuff();
writeObjectToDatastore(obj);
}
}
有时,两个或多个线程在写入任何内容之前从数据存储中读取数据,这会导致对象的多个示例被持久化。
添加 synchronized
关键字(或其他并发构造)修复了这个问题—前提是只有一个应用程序示例在运行。
如何在分布式环境中解决这些类型的并发问题?
2条答案
按热度按时间ki0zmccv1#
从应用程序引擎调用数据存储时,请使用事务。首先尝试获取()实体以查看它是否在那里。如果不是,则放置()实体。
下面是一些使用app engine api演示事务的示例代码:https://github.com/googlecloudplatform/java-docs-samples/blob/master/appengine/datastore/src/test/java/com/example/appengine/transactionstest.java
83qze16e2#
请参阅:https://cloud.google.com/appengine/articles/scaling/contention
避免数据存储争用—当单个实体或实体组更新过快时,会发生数据存储争用。数据存储将对并发请求排队等待轮到它们。在队列中等待超过超时时间的请求将引发并发异常。如果您希望每秒更新单个实体或写入实体组的次数超过几次,那么最好尽早重新设计,以避免在部署应用程序后可能发生的争用。