【问题标题】:Bulk write to ElasticSearch from Firestore using Google Cloud Functions使用 Google Cloud Functions 从 Firestore 批量写入 ElasticSearch
【发布时间】:2021-09-25 21:14:30
【问题描述】:

目前我正在为我的数据库使用 Firestore,并且我有一个用户集合。每当创建用户文档或将用户文档更新到用户集合时,云函数都会获取用户文档并将其保存在 Elastisearch 中。

我开始担心这种架构的可扩展性。例如,假设有数千个云函数同时开始向 Elasticsearch 写入文档,那么 Elasticsearch 会处理这个负载吗?谷歌云中是否有更好的解决方案?

例如,这些云函数能否将用户文档写入队列,并让队列另一端的云函数获取 100 个文档并将它们批量写入 Elasticsearch。

我是 Google 云的新手,如果您能给我一些想法、视频和要阅读的东西,我将不胜感激。

谢谢

【问题讨论】:

    标签: firebase elasticsearch google-cloud-platform google-cloud-firestore


    【解决方案1】:

    ElasticSearch 对每个索引可以拥有的文档数量没有限制,但有一些限制,例如最大文档大小和documentation 中提到的批量写入。

    最大文档大小:100KB [可在 7.7+ 中配置]

    最大索引负载大小:10MB

    批量索引最大值:每批 100 个文档

    据我所知,Google Cloud 没有全文搜索 API。

    谈到批量写入,如果实时可用性(添加后立即可用的数据)如果不是问题,那么您可以将新文档与添加的时间戳一起存储在 Firestore 中,如果文档已被添加,则可以使用布尔值Elasticsearch 中的索引。

    然后,您可以每 N 分钟运行一次预定的云函数,而不是使用 onCreate 触发器运行云函数,这将:

    1. 查询未添加到 Elasticsearch 中的文档
    2. 批量生产 100 个(对于 1000 个/批次的限制)
    3. 将它们上传到 Elasticsearch

    这样,每个云功能运行的文档更多,因此效率更高,但如果您需要立即使用新数据,那么这将不起作用。

    【讨论】:

    • 数据不需要立即从 firestore 发送到 elasticsearch。所以你的想法似乎很有趣。但是,我发现它存在一个问题。您必须在 firestore 中的每个用户文档中保留一个布尔变量,以告知您文档是否已复制到 elasticsearch。将一批 100 个文档复制到 elasticsearch 后,您将需要在 firestore 中更新这些用户文档。不是很贵的手术吗?此外,这种方法仅适用于更新和创建。不利于删除。
    • @AimnBlbol 它的成本是$0.18/100K writes。我没有进行任何计算,但这听起来仍然比为每个文档运行云功能便宜。
    • 如果用户文档从firestore中删除了,你的预定云函数如何知道从elasticsearch中删除它
    • @AimnBlbol 您可以使用onDelete 触发器运行函数,但我们只需修改上面的方法。让我们将布尔值更改为具有 3 个可能值的字符串,added, pending, deleted。当函数运行时,您可以检查“待处理”,这些是要添加的文档,“已删除”的文档将被删除。
    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多