小编Wil*_*rin的帖子

为什么我们的 GCP Cloud Function 会从其 PubSub 订阅中收到如此多的重复项?

简而言之

有一个 Google Cloud PubSub 主题,我们向其发布 200 万条微小/小型消息。我们设置了一个云函数来处理通过该主题发送的消息。在检查日志时,我们发现许多此类消息被多次处理。总而言之,我们收到的消息数量为 150-200%(请参见最后的屏幕截图)。

问题是:这是为什么?我们如何正确配置事物以减少重复?

附加信息

  • 在发布 2M 条消息并且执行此操作的脚本完成后,订阅中的消息数似乎是正确的。我认为我们可以因此排除“发布端”重复,在本文1中标记为和。2
  • 订阅的配置由 Cloud Function 管理,我们无法编辑。所以我猜这是所有云功能的默认/强制配置。请参阅下面的屏幕截图。
  • 在“订阅者端”重复引用的最常见原因是函数需要比确认截止时间更长的时间来确认消息(例如此处)。订阅的确认截止时间设置为 600 秒,但函数运行时间最多可达几秒。
  • 我们也根本不进行批处理,这消除了经常引用的另一个原因(例如在这个问题本文中)。
  • 该函数仅限于 90 个实例。

更新 15.03.22

所以我想绝对确定这是“真正的”重复,我的意思是它是 PubSub 多次传递消息/事件,而不是我们在某个地方笨拙地引入的重复。因此,我修改了函数代码,根据外部消息 ID 形成数据存储区密钥,并context.messageId使用计数器将其写入数据存储区。如果密钥已经存在,则计数器会递增。之后我立即记录该实体。以下是 458,940 次处决的统计数据:

|-------------------|-------------------|
|      Counter      |       Logs        |
|-------------------|-------------------|
|         1         |       208,733     |
|         2         |       101,040     |
|         3         |       62,965      |
|         4         |       37,156      |
|         5         |       20,583      |
|         >5 …
Run Code Online (Sandbox Code Playgroud)

google-cloud-pubsub google-cloud-functions

5
推荐指数
1
解决办法
1158
查看次数