concurrency - 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:我真的很想批量写入电子表格,但它似乎与第一名的无服务器计算背道而驰。有没有办法做到这一点?
任何帮助表示赞赏。
解决方案
Cloud Functions 和 Firestore 也有类似的问题。在我的情况下,我以“订单/123”的形式收到有关新数据和更新数据的通知,然后我在 Firestore 中创建了订单的副本,问题是有时多个通知同时到达,导致订单重复因为比赛条件。我对这个问题的解决方案是使用谷歌云任务,https://console.cloud.google.com/cloudtasks,我有一个接收通知的云函数,它将一条消息添加到队列中以并发 1 ,然后其他云功能负责处理。
Receive notification -> Post message to queue (concurrency 1) -> Process message
在这种情况下,我每个客户有 1 个队列,我相信有更好的方法,但现在这已经足够了。您可以稍后将客户路由到相同的队列,但始终让相同的客户在同一个队列中。
推荐阅读
- c# - 如何在 C# 中设置 Crystal 报表的数据集
- c# - C# 无法使用 TLS1.2 在 Windows 7/Windows Server 上创建 ssl/tls 安全通道
- android - 处理flutter和google play游戏
- c++ - MFC:我们怎样才能轻松地从 CTreeCtrl 切换到 CTreeView?
- python - 如何使用pypdf2打开pdf文件
- javascript - 选择“无线电按钮”选项时,如何禁用其他Opitons?
- bigdecimal - 无法以大数字作为参数从 web3 调用合约函数
- php - 为什么 bindValue 将字段设置为最后一个值?
- c# - 使用三元运算符的 LINQ 选择查询
- google-cloud-platform - 谷歌 colab 与谷歌云存储数据出口