数据存储和内存缓存一致性 - Google App Engine 和 Objectify
Datastore & Memcache consistency - Google App Engine & Objectify
我在确保数据存储的一致性方面遇到了一个非常棘手的问题。
我们正在尝试每 1 分钟 (cron) 对 BigQuery 执行一次同步作业,并依靠数据存储来存储上一次同步完成时间的时间戳。
当加载对象时,我们仍然看到最终一致性,我已经到了令人毛骨悚然的时候了..
Settings 和 ParentClass 类 都作为单例存储在 Datastore 中,即只有一个。
@Entity
public class Settings {
@Parent
private Key<ParentClass> parent = ParentClass.getKey();
@Id
private Long id = 123L;
...
public Settings save(){
ofy().cache(false).consistency(ReadPolicy.Consistency.STRONG).save().entity(this).now();
return this;
}
public static Settings get(){
Settings settings = ofy().cache(false).consistency(ReadPolicy.Consistency.STRONG).load().key(Key.create(ParentClass.getKey(), Settings.class, 123L)).now();
if (settings == null) settings = create();
return settings;
}
private static Settings create(){
return new Settings().save();
}
}
有谁知道是什么导致最终一致?
编辑:web.xml 摘录:
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>asyncCacheFilter</filter-name>
<filter-class>com.googlecode.objectify.cache.AsyncCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>asyncCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
问题是 Objectify 的内部会话缓存。
最初通过在第一次 load() 之前使用 ofy().clear() 手动清除缓存来解决,然后通过升级到 Objectify 5.1.5 进一步改进。
我在确保数据存储的一致性方面遇到了一个非常棘手的问题。 我们正在尝试每 1 分钟 (cron) 对 BigQuery 执行一次同步作业,并依靠数据存储来存储上一次同步完成时间的时间戳。
当加载对象时,我们仍然看到最终一致性,我已经到了令人毛骨悚然的时候了..
Settings 和 ParentClass 类 都作为单例存储在 Datastore 中,即只有一个。
@Entity
public class Settings {
@Parent
private Key<ParentClass> parent = ParentClass.getKey();
@Id
private Long id = 123L;
...
public Settings save(){
ofy().cache(false).consistency(ReadPolicy.Consistency.STRONG).save().entity(this).now();
return this;
}
public static Settings get(){
Settings settings = ofy().cache(false).consistency(ReadPolicy.Consistency.STRONG).load().key(Key.create(ParentClass.getKey(), Settings.class, 123L)).now();
if (settings == null) settings = create();
return settings;
}
private static Settings create(){
return new Settings().save();
}
}
有谁知道是什么导致最终一致?
编辑:web.xml 摘录:
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>asyncCacheFilter</filter-name>
<filter-class>com.googlecode.objectify.cache.AsyncCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>asyncCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
问题是 Objectify 的内部会话缓存。
最初通过在第一次 load() 之前使用 ofy().clear() 手动清除缓存来解决,然后通过升级到 Objectify 5.1.5 进一步改进。