【问题标题】:Google Datastore app architecture questionsGoogle Datastore 应用架构问题
【发布时间】:2015-07-14 09:30:30
【问题描述】:

我正在开发一个通过 JSON API 连接到 Google Cloud Datastore 的 Google AppEngine 应用程序(我正在使用 PHP)。

我正在阅读 Google 提供的所有文档,但仍有疑问:

  1. 在有关 Transactions 的文档中,有以下提及:“事务必须在属于有限数量 (5) 个实体组的实体上运行”(顺便说一下,几行之后我们可以找到:“所有事务中的数据存储操作最多可在 25 个实体组上运行”)。 我不确定什么是实体组。假设我有一个对象 Country,它仅由其种类 (COUNTRY) 和数据存储区的自动受影响的密钥 ID 标识。所以没有祖先路径,层次关系等......所有国家实体都只计入1个实体组吗?还是每个国家都数一数?

  2. 对于 Country 实体类型,我需要一个增量唯一 ID(如 SQL AUTOINCREMENT)。它必须是绝对独特且没有间隙的。此外,这种对象的创建时间不会超过几/分钟,因此无需处理争用和分片。我正在考虑有一个独特的计数器来反映自动增量并在事务中使用它。以下代码模式可以吗?: Starting transaction, getting the counter, commit the creation of the Country along with the update of the counter. Rollback the transaction if the commit fails. 这种模式是否可以防止 2 个相同 id 的影响?您能否向我确认,如果 2 个进程同时获取计数器(因此值相同),第一个提交的进程将使另一个进程失败(因此它将能够重新启动并获取新的计数器值)?

  3. documentation 还提到:“如果您的应用程序在尝试提交事务时收到异常,并不一定意味着事务失败。即使在事务已提交,最终将成功应用”!?我们应该如何处理这种情况?如果在创建我的国家时出现这种行为(问题 #2),我的自动增量 ID 会出现问题,不是吗!?

  4. 因为数据存储需要一个事务的所有写入操作仅在一次调用中完成。而且既然事务保证了事务的全部或不执行,为什么还要回滚呢?

  5. 1 次写入 / 秒的限制仅适用于实体(因此由其种类及其关键路径定义)而不是整个实体组(只有当我确定什么时我才会放心确切地说是一个实体组;-) 问题 #1)

我在这里停下来不是为了发表一篇大文章。在得到这些问题的答案后,我可能会回复其他(或改进的)问题;-)

感谢您的帮助。

[UPDATE] Country 仅用作示例类对象。

【问题讨论】:

  • 这不是一个问题,这里至少有五个问题。请分别询问。
  • 它们都是关于交易的,有些与其他有关。反正我会做的
  • 为什么要一个国家的增量ID?为什么不使用 country slug 作为 ID?使用计数器自动递增的东西..你做错了。
  • 感谢您的回答德米特里。我应该准确地说,Country 只是一个示例类,我可以说 Foo。
  • @BrentWashburne 好的,现在我同意了,我应该拆分每个问题... ;-)

标签: google-app-engine transactions google-cloud-datastore


【解决方案1】:
  1. 不,('Country', 123123)('Country', 679621) 不在同一个实体组中。但是('Country', 123123, 'City', '1')('Country', 123123, 'City', '2') 在同一个实体组中。具有相同祖先的实体在同一组中。

  2. 对国家/地区之类的事物使用自动增量听起来确实是个坏主意。只需根据国家名称生成一个 ID。

  3. 来自同一段:

尽可能构建您的 Datastore 事务,以便在多次应用同一事务时不影响最终结果。

  1. 在 db 或 ndb 等内部数据存储 API 中,您不必担心回滚,它会自动发生。

  2. 大约每个实体组每秒写入 1 次,这就是为什么您需要使组尽可能小。

【讨论】:

  • 1.那是我的恐惧......所以我们必须保持实体组尽可能小,以免产生争用,但另一方面,如果我们想使用事务,我们必须小心不要有太多的实体组......
  • 2.好的,但是假设我真的需要它。描述的代码模式好吗?
  • 3.是的,我阅读了关于尽可能多地进行幂等操作的建议,但在自动递增 id 的情况下,这听起来像是一个大问题......
  • 4.那么有什么 API 呢?我应该不关心它吗?
  • 文档说你必须做一个回滚,所以就去做吧。为什么你需要增量ID?它有可能实现,但前提是您每秒有少量写入。
猜你喜欢
  • 2011-03-11
  • 2011-06-11
  • 2018-08-25
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多