GCP Pub/Sub,如果已有活动订阅,您能否在新订阅上重播旧消息
Posted
技术标签:
【中文标题】GCP Pub/Sub,如果已有活动订阅,您能否在新订阅上重播旧消息【英文标题】:GCP Pub/Sub, can you replay old messages on a new Subscription if there is already an active Subscription 【发布时间】:2020-03-11 21:37:18 【问题描述】:在 GCP Pub/Sub 中,我有一个主题和一个订阅 1,并开始发布消息。
我可以添加另一个订阅 Subscription2,并且我可以重播在创建 Subscription2 之前发布的旧消息,它允许吗? (卡夫卡允许)
什么时候我会失去对消息的访问权限(在保留期内)?删除所有订阅?保持至少一个活动订阅将允许 PubSub 添加新订阅并重播旧消息?
我还可以将主题的保留期延长到 7 天以上吗?
编辑:消息将被持久化到数据库,但我对 pub/sub 架构更感兴趣
【问题讨论】:
【参考方案1】:基于 Subscription1 存在的事实,依靠能够重播 Subscription2 中的消息是不好的。在 Subscription2 存在之前发布的消息不提供任何保证。唯一的例外是,如果您要在 Subscription1 上捕获快照,然后在 Subscription2 上查找该快照,那么您将看到在 Subscription2 存在之前发布的消息。但是,您只会看到不超过 7 天的消息。因此,如果快照超过 7 天,您将看不到旧消息。
无法将保留期延长至 7 天以上。总的来说,Kolban 的评估符合 Cloud Pub/Sub 的目标:它是一种可靠的消息传输服务。消息保留的目标是确保如果订阅者在一段时间内宕机,一旦他们恢复,他们将收到在这段时间内发送的消息。快照和搜索也是如此:这些对于从订阅者的错误部署中恢复的情况特别有用,订阅者可能已经确认了它不应该拥有的消息。使用 seek 可以重播这些消息,以便在订户固定后可以正确处理它们。
【讨论】:
如果我可以在过去 7 天内每天创建(自动化)快照,这是否允许可靠地使用其他订阅上的消息?是什么阻止我这样做 没有什么能阻止它。您只需要设置自动化。并且您无法确认订阅上的任何消息,从该订阅中获取您想要接收所有消息的快照。 哦,好的,不确认 Subscription1 上的任何消息将需要大量的管道(因为 Subscription1 与 Subscription2 相比提前),我可以在所有订阅中重放快照,并确认消息Subscription1,不应该影响 Subscription2?不是吗。 假设您有 Subscription1,然后设置了消息 A、B 和 C。您确认消息 A。现在,您拍摄快照。然后创建 Subscription2。您寻找您为 Subscription1 拍摄的快照。现在,您只会收到消息 B 和 C。如果您每天拍摄 Subscrtion1 的快照并继续 ack 消息,那么您在查找时将不会收到这些 acked 消息。您可以在拍摄后续快照之前先在 Subscription1 上搜索,但这意味着所有消息也将重新传递到 Subscription1。【参考方案2】:发布到主题的消息仅在发布这些消息之前可供订阅使用。如果您在下午 1 点发布消息并在下午 2 点订阅,则在下午 2 点之前发布的任何消息都不可能适用于该订阅。
我将 Pub/Sub 视为一种传输和交付技术,而不是将其视为存储库。如果您认为您可能需要在订阅之前发布的消息,请考虑添加一个特殊订阅者的设计模式,该订阅者接收发布的每条消息并将其插入数据存储区以供后续检索。
如果您现在发现需要历史消息,则可以在该存储中查询历史项目,同时订阅随后将到达的新项目。
【讨论】:
您可以这样做,但考虑到您必须进行自己的偏移管理等,它违背了发布/订阅的目的。将尝试一些时间来检查我们是否可以在 Subscription2 上消费消息考虑到在使用重放之前订阅 1 处于活动状态,因此在创建之前已发布。 只是为了补充答案,不可能增加保留期,only to decrease it,这是在订阅级别设置的。以上是关于GCP Pub/Sub,如果已有活动订阅,您能否在新订阅上重播旧消息的主要内容,如果未能解决你的问题,请参考以下文章