我想将我的Cloud Datastore内容与ElasticSearch中的索引同步。我希望ES索引始终与Datastore的内容保持同步。
我注意到,通过在数据存储区Model
中实现_post_put_hook
方法,Appengine Python标准环境中提供了一种等效机制。但是,这似乎不可能使用可在flex环境中使用的google-cloud-datastore
库。
有没有办法在每次插入后收到回调?或者我是否必须在数据存储区API之前放置一个“代理”API,它将在每次插入/删除后更新我的ES索引?
答案 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)。如果你选择这条路线,你应该知道两个潜在的警告:
NDB.Model
,即使put操作失败也是如此。我在下面添加了一个代码示例。您可以在文档中找到更多详细信息:model hooks,
hook methods,
check_success()
将数据导出到ElasticSearch或Search API会延长您的响应时间。这可能对后台任务没有问题,只需调用_post_put_hook()
中的导出功能即可。但是如果用户提出请求,这可能是个问题。对于这些情况,您可以通过使用_post_put_hook()
方法或创建推送任务将导出操作推迟到其他线程。或多或少,它们是相同的。下面,我使用deferred.defer()
。
为要导出搜索记录的各种类型添加类方法。每当出现问题或移动应用程序/数据存储区时,添加新的搜索索引等,您可以调用此方法,然后逐批从数据存储区查询该类型的所有实体,并导出搜索记录。
延期导出示例:
defer()
```