无论如何,在Google Cloud Datastore上每次插入/删除后都会收到回调吗?

时间:2018-02-09 10:45:21

标签: python google-app-engine google-cloud-datastore app-engine-flexible

我想将我的Cloud Datastore内容与ElasticSearch中的索引同步。我希望ES索引始终与Datastore的内容保持同步。

我注意到,通过在数据存储区Model中实现_post_put_hook方法,Appengine Python标准环境中提供了一种等效机制。但是,这似乎不可能使用可在flex环境中使用的google-cloud-datastore库。

有没有办法在每次插入后收到回调?或者我是否必须在数据存储区API之前放置一个“代理”API,它将在每次插入/删除后更新我的ES索引?

1 个答案:

答案 0 :(得分:4)

_post_put_hook()的{​​{1}}仅在您通过NDB将实体写入数据存储区时才有效,是的,不幸的是,NDB库仅在App Engine Python标准环境中可用。我不了解Cloud Datastore中的此类功能。如果我没记错的话,Firebase实时数据库或Firestore都有写入触发器,但我猜你也不急于迁移数据库。

在数据存储区中,您需要一个"代理"使用您建议的上述方法的API,或者您需要修改您的数据存储客户端,以便在任何成功的写操作时执行此操作。后者可能会出现更高的失败风险和ElasticSearch中的陈旧数据,特别是如果客户不在您的控制范围内。

我认为,如果一致且最新的搜索记录对您的用例非常重要,那么自定义API就有意义。数据存储区和Python / NDB(可能使用云端点)将是一种很好的方法。

我有一个类似的解决方案在GAE Python Standard上运行(尽管使用内置的Search API而不是ElasticSearch)。如果你选择这条路线,你应该知道两个潜在的警告:

    始终调用
  1. NDB.Model,即使put操作失败也是如此。我在下面添加了一个代码示例。您可以在文档中找到更多详细信息:model hookshook methodscheck_success()

  2. 将数据导出到ElasticSearch或Search API会延长您​​的响应时间。这可能对后台任务没有问题,只需调用_post_put_hook()中的导出功能即可。但是如果用户提出请求,这可能是个问题。对于这些情况,您可以通过使用_post_put_hook()方法或创建推送任务将导出操作推迟到其他线程。或多或少,它们是相同的。下面,我使用deferred.defer()

  3. 为要导出搜索记录的各种类型添加类方法。每当出现问题或移动应用程序/数据存储区时,添加新的搜索索引等,您可以调用此方法,然后逐批从数据存储区查询该类型的所有实体,并导出搜索记录。

  4. 延期导出示例:

    defer()

    ```