首页 > 解决方案 > Google Cloud Functions 和 Sheets v4 API 之间的并发问题

问题描述

我有 2 个与管理 Google Cloud Functions 之间的并发性相关的问题。

设置是我有一个 slackbot 可以使用“checkoff”斜杠命令。这个斜杠命令向另一个 Slack 用户发送是/否按钮是否授权检查。当用户单击一个选项时,它会将该响应发送到 Google Cloud 函数,该函数 1) 将响应发送回 Slack 以关闭按钮,以及 2) 如果使用 Sheets v4 API (电子表格.values) 在 Google Sheet 中获得授权,则记录检查.附加

问题 1:向是/否按钮发送垃圾邮件的用户会在功能确认并关闭按钮之前触发对云功能的多个 Slack 请求。这会导致生成多个 Cloud Functions 并在工作表中记录多个检查。如果我可以维护状态,我可以保存请求中的唯一信息并检查以确保该请求尚未得到服务。是否有使用 Cloud Functions 执行此操作的模式?

问题#2:有时独立用户在相似的时间授权多个检查。这些请求会产生独立的 Cloud Function 实例,这些实例会尝试附加到工作表。在极少数情况下,另一个函数在第一个函数的读取然后写入之间写入导致覆盖。我会使用读写锁来处理这个问题,但没有办法在我知道的 Cloud Functions 之间共享并发资源。

(不太重要)问题 #3:我真的很想批量写入电子表格,但它似乎与第一名的无服务器计算背道而驰。有没有办法做到这一点?

任何帮助表示赞赏。

标签: concurrencygoogle-cloud-functionsgoogle-sheets-api

解决方案


Cloud Functions 和 Firestore 也有类似的问题。在我的情况下,我以“订单/123”的形式收到有关新数据和更新数据的通知,然后我在 Firestore 中创建了订单的副本,问题是有时多个通知同时到达,导致订单重复因为比赛条件。我对这个问题的解决方案是使用谷歌云任务,https://console.cloud.google.com/cloudtasks,我有一个接收通知的云函数,它将一条消息添加到队列中以并发 1 ,然后其他云功能负责处理。

Receive notification -> Post message to queue (concurrency 1) -> Process message 

在这种情况下,我每个客户有 1 个队列,我相信有更好的方法,但现在这已经足够了。您可以稍后将客户路由到相同的队列,但始终让相同的客户在同一个队列中。


推荐阅读