google-cloud-platform - GCP 发布/订阅 : Life of a Message

标签 google-cloud-platform streaming google-cloud-pubsub

我正在尝试了解 GCP Pub/Sub,但对 Pub/Sub 中消息的生命周期有疑问。事实上,我用了this article作为我的引用。在这篇文章中,他们说:

Once at least one subscriber for each subscription has acknowledged the message, Pub/Sub deletes the message from storage.

所以我的第一个问题是:例如,我有一个订阅 A,它连接到订阅者 X 和订阅者> Y. 根据文档,当订阅者 X 收到消息并向订阅 A 发送 ACK 时,Pub/Sub 将从存储中删除该消息,而无需考虑订阅者 Y 是否收到消息。换句话说,Pub/Sub 并不关心所有订阅者是否都收到了消息,只有一个订阅者收到消息,Pub/Sub 就会从存储中删除该消息吗?请问我说得对吗?

然后,在文章的下面部分,文章说:

Once all subscriptions on a topic have acknowledged a message, the message is asynchronously deleted from the publish message source and from storage.

我在这里感到有点困惑。我的理解是,例如,我有一个有 N 个订阅的主题,每个订阅有 M 个订阅者,Pub/Sub 只需要知道对于每个订阅,至少有一个订阅者已确认该消息,它将删除该消息来自存储的消息。请问我说得对吗?

我还发现,在文档中,我们有两个概念:发布转发器订阅转发器。我可以问最后几个问题吗:

  • 订阅发布转发器订阅转发器之间有什么关系? (例如,订阅仅包含一个发布转发器和一个订阅转发器?)
  • 发布转发器订阅转发器之间的关系是一对一、一对多、多对一或多对多,请问?
  • 一个订阅者是否可以与多个订阅关联?
  • 一旦订阅者消费了一条消息(这里我说这条消息是不重复的,它没有副本,它是唯一的),这个订阅者有可能重新消费吗? -消费/重新阅读这条消息?

如果我有什么理解错误的地方,请指出,我真的很感激。

谢谢大家!!!

最佳答案

这里有相当多的内容需要解压。最好不要将订阅视为附属于订阅者,并且要理解这两者是不同的。 订阅是一个命名实体,它希望接收发布到某个主题的所有消息。 订阅者是代表订阅运行来接收和处理消息的实际客户端。一个主题可以有多个订阅。一个订阅可以有多个订阅者。如果订阅中有多个订阅者,则假设没有重复传递并且订阅者确认收到的所有消息,则发布到主题的每条消息都将传递给该订阅的一个订阅者。这称为负载平衡:消息的处理分布在许多订阅者上。如果一个主题有多个订阅,每个订阅有一个订阅者,那么每个订阅者都会收到所有消息。这称为扇出:每个订阅者都会收到发布的完整消息集。当然,可以将这两者结合起来,每个订阅有多个订阅者,在这种情况下,每条消息将被传递给每个订阅的一个订阅者。

转发器只是负责传递消息的服务器。发布转发器从发布者接收消息,订阅转发器向订阅者发送消息。消息传递路径上的所有关系(从发布者到发布转发器、发布转发器到订阅转发器、订阅转发器到订阅者)都可以是多对多关系。

订阅者与单个订阅相关联。但是,正在运行的作业可以有多个订阅者在其中运行,例如,可以在不同的订阅上多次实例化订阅者客户端库。

以上所有内容都假设了一个重要的警告:假设没有重复的交付。一般来说,Cloud Pub/Sub 保证至少一次交付。这意味着,即使订阅者正确确认的消息也可能被重新传递(无论是发送给同一订阅者还是不同的订阅者),在这种情况下,订阅者需要在后续传递时确认该消息。一般来说,对于在确认截止日期到期之前确认消息的行为良好的订阅者来说,重复率应该非常低,在 0.1% 的范围内。

关于google-cloud-platform - GCP 发布/订阅 : Life of a Message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66762282/

相关文章:

google-chrome - Mp4下载导致浏览器播放文件而不是下载

flash - 基于嵌入式闪存的 mp3 播放器

go - 如果我的接收器工作,为什么我有 'Undelivered Messages'?

firebase - Google DialogFlow V2 履行中出现神秘错误(Google Assistant 模拟器空响应、请求、错误选项卡)

google-cloud-platform - GCP - 如何在 GCP 中查看一个 VM 成本?在计费帐户中,我看到所有计算引擎的成本

json - 如何在 Express 4 中将 Promise 的 yield 结果作为流发送?

google-cloud-platform - gcloud-java pubsub API : how to set "Return Immediately" flag

python - Google PubSub 和自动缩放计算引擎实例 (Python)

Docker Swarm 创建服务无法从远程存储库中提取

python - 通过在 Google Cloud Dataflow - Apache Beam 中使用 Python SDK 推断模式来读取和写入 avro 文件