【问题标题】:How to handle GAE datastore contention asynchronously?如何异步处理 GAE 数据存储争用?
【发布时间】:2013-01-10 18:22:29
【问题描述】:

为了避免 GAE 数据存储写入中的高延迟(峰值),我想实现一个后写缓存(使用 Java 低级 API)。这意味着数据先同步写入memcache,然后异步写入datastore,这样请求可以快速返回。

然而,这意味着我需要以某种方式也需要异步处理由数据存储争用引起的异常(例如,启动重试)。更准确地说,我需要能够在请求返回后对发生的争用做出反应。我怎样才能做到这一点?使用任务队列进行异步写入处理不是一种选择,因为据说推送到队列仅比数据存储写入快一点。

如果这是不可能的,那么实现后写缓存的好方法是什么?或者在数据丢失不是一种选择的情况下如何处理缓慢的写入。

【问题讨论】:

  • 你检查过 Objectify 4 API。保存和加载操作在其中是异步的。也许您可以使用它或从那里获得一些想法。
  • 我不是很肯定,但从我的阅读来看,Objectify 4 的异步操作似乎仍然必须在请求完成之前完成,因此它们仅相对于请求期间运行的其他代码是异步的。我认为这个问题是关于推迟写入,以便在请求返回后(可能)完成。
  • 是的,完全正确。感谢安迪的澄清。

标签: java google-app-engine caching google-cloud-datastore


【解决方案1】:

Memcache 是易失性的,它可能随时刷新数据,所以这种方法非常不可靠。

您最好使用Push Task Queue。通过DeferredTask 辅助类使用它。这里是an example

【讨论】:

  • memcache 当然只用于加速缓存读取,而不是用于持久性。问题是如何可靠地实现“write-behind”(异步)策略,使其永远不会因争用而失败。使用任务队列是一种选择。将某些东西推入队列有多快?它需要比数据存储写入要快得多才能有意义。另外,我可以将多少数据与任务相关联?谢谢!
  • 您可以将 100K 的数据发布到一个任务(当然,或者只是将密钥传递给 memcache 数据)。回复:任务队列推送与数据存储写入的性能比较...stackoverflow.com/questions/6259984/…
  • 感谢该链接:推送任务仅比数据存储写入快一点,因此这似乎不是一种选择。
  • 你说的是什么速度?吞吐量(来自不同请求的并行写入数)或单次写入的延迟?
  • 单次写入的延迟。
猜你喜欢
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多