首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在上的每次插入/删除之后,还有回调吗?

在上的每次插入/删除之后,还有回调吗?
EN

Stack Overflow用户
提问于 2018-02-09 10:45:20
回答 1查看 697关注 0票数 3

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

我注意到,在中,通过在Datastore中实现_post_put_hook方法,可以获得一个等价的机制。然而,使用在flex环境中可用的google-cloud-datastore库似乎是不可能的。

在每次插入后是否有接收回调的方法?还是我必须在数据存储API前面设置一个“代理”API,它将在每次插入/删除之后更新我的ES索引?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-09 13:52:35

只有当您通过NDB将实体写入数据存储时,_post_put_hook() of NDB.Model才能工作,而且是的,不幸的是,NDB库仅在中可用。我不知道中有这样的特性。如果我没记错的话,Firebase实时数据库或Firestore都有写触发器,但我想您也不急于迁移数据库。

在Datastore中,您需要使用上述方法的“代理”API,或者您需要修改Datastore客户端,以便在任何成功的写op中完成此操作。后者在ElasticSearch中可能带来更高的失败和陈旧数据风险,特别是当客户端超出您的控制范围时。

我相信,如果一致和最新的搜索记录对您的用例很重要,那么定制API是有意义的。Datastore和Python / NDB (可能使用云端点)将是一种很好的方法。

我有一个类似的解决方案运行在上(尽管使用的是内置搜索API而不是ElasticSearch)。如果您选择这条路线,您应该注意两个潜在的注意事项:

  1. 即使put操作失败,也总是调用_post_put_hook()。我在下面添加了一个代码示例。您可以在文档中找到更多详细信息:模型钩钩法成功()
  2. 将数据导出到ElasticSearch或Search将延长您的响应时间。对于后台任务来说,这可能不是问题,只需调用_post_put_hook()中的导出特性即可。但是,如果用户提出了请求,这可能是一个问题。对于这些情况,可以通过使用deferred.defer()方法或创建一个push任务,将导出操作推迟到另一个线程。或多或少,它们是一样的。下面,我使用defer()
  3. 为要导出搜索记录的每种类型添加一个类方法。每当出现问题或移动应用程序/数据存储、添加新的搜索索引等时,您都可以调用此方法,然后逐批从数据存储中查询所有此类实体,并导出搜索记录。

延迟导出示例:

代码语言:javascript
复制
class CustomModel(ndb.Model):
    def _post_put_hook(self, future):
        try:
            if future.check_success() is None:
                deferred.defer(export_to_search, self.key)
        except:
            pass  # or log error to Cloud Console with logging.error('blah')

def export_to_search(key=None):
    try:
        if key is not None:
            entity = key.get()
            if entity is not None:
                call_export_api(entity)
    except:
        pass  # or log error to Cloud Console with logging.error('blah')
代码语言:javascript
复制
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48704105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档