【问题标题】:periodically delete entries in objectify定期删除objectify中的条目
【发布时间】:2013-04-13 07:16:03
【问题描述】:

我将 Google App Engine 与 Objectify 一起使用,并希望每 5 分钟删除一次数据库中的一些条目。实现这一目标的最佳方法是什么?我应该使用 Google App Engine 的 ThreadManager 还是 cron 作业?还是有别的办法?

【问题讨论】:

  • 每五分钟要删除多少个条目?
  • @IbrahimArief:很多很多,也许几十万?或者有没有办法让这些条目自动过期?
  • 那是……巨大的。自动使共享数据过期的唯一方法是在执行put operation 时使用 Memcache 中的expiration 选项,但是您的数据将是暂时的。删除数十万个实体通常也会非常昂贵,您确定规模吗?
  • @IbrahimArief:是的,理论上可能有这么多。我确实考虑过在 Memcache 中使用过期选项,但我还需要对数据进行一些操作,例如计数。数据可能是暂时的。

标签: google-app-engine cron objectify


【解决方案1】:

听起来像你想要的,每 5 分钟一次:

  • 编写数十万个实体
  • 聚合数十万个实体
  • 删除数十万个实体

使用 map/reduce 可以做到这一点。但是,它会很昂贵(每天数百美元),而且您会遇到时间问题 - 尤其是当任务队列备份时。

您应该强烈考虑将这些数据存储在 GAE 之外。获取一个 Google Compute Engine 帐户并在那里设置一个 mongodb 或 redis 实例。甚至将其托管在 AWS 上。 GAE 不太适合这种工作负载,但它不是“全有或全无” - 您可以轻松地使用云中其他部分的服务。

【讨论】:

    【解决方案2】:

    Cron 听起来很符合这里的要求,但我担心需要删除的实体的规模。 (根据 cmets,每五分钟最多几十万)。删除这么多实体需要相当长的时间,很可能超过 5 分钟,甚至可能超过前端 cron 处理程序的 10 分钟最后期限。

    一种可能的解决方案是从backend instance 中删除,因为后端可以在没有任何截止日期的情况下运行。 Cron 可用于启动查询待删除实体的进程,使用仅键查询获取其键,然后删除多个 background threads 中的实体。

    由于进程可以无限期运行,在线程报告删除完成后,您可以立即再次查询并删除下一组实体。您可以在后端使用全局内存锁来确保后续的 cron 请求不会启动单独的进程,但如果它检测到该进程已经运行,则会静默退出。所以这里的 cron 只用作删除过程的保活信号。

    附带说明,请注意,如此频繁地以这种规模查询和删除实体可能会在数据存储操作成本方面过于昂贵。

    【讨论】:

    • 我不相信这会起作用,因为您无法从单个实例中获得足够的数据存储操作吞吐量。唯一可行的方法是通过 map/reduce,仅在数据存储操作中,每天至少要花费 150 美元。如果您想读取数据,则更多……这也有时间问题。
    • @stickfigure:谢谢 Jeff,我也想知道吞吐量。尽管我很喜欢 mapreduce,但我不知道它是否提供了提问者需要的那种细粒度控制。 (我们之前在here 中讨论过它)如果是我的应用程序,我会使用某种主从模式来分配负载和删除,但与完全改变实现策略相比,这可能有点矫枉过正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2012-05-05
    • 1970-01-01
    相关资源
    最近更新 更多