如何在不使用 Dataflow 且不使用 Python 中的 ACK 的情况下排除 Pubsub 中的重复消息?

How to rule out duplicate messages in Pubsub without using Dataflow and without using ACK in Python?

我有一个用例,其中我想在不确认消息的情况下阅读 Pubsub 中的消息。我需要有关如何排除 "duplicate messages" 的可能性的帮助,当我不确认传递的消息时,它会保留在 Pubsub 存储中。

我想到的解决方案:

  1. 将拉取的消息存储到 Datastore 中,看看它们是否相同。
  2. 在运行时存储拉取的消息并检查我的消息是否重复 O(n) 时间复杂度和 space 复杂度 O(n)。
  3. 将提取的消息存储在一个文件中,并从文件中的消息中比较新传入的消息。
  4. 使用数据流并排除可能性(最不期望)

我看到 Pubsub 中没有像 Kafka 类似的功能,我认为。

在这个问题上你建议的最佳方法是什么/或者我可以使用的任何其他替代方法?

我正在使用 python google-cloud-pubsub_v1 创建一个 python 客户端并从 Pubsub 中提取消息。

我正在分享拉取数据的逻辑代码

subscription_path = subscriber.subscription_path(
    project_id, subscription_name)
    NUM_MESSAGES = 3

    # The subscriber pulls a specific number of messages.
    response = subscriber.pull(subscription_path, max_messages=NUM_MESSAGES)

    for received_message in response.received_messages:
        print(received_message.message.data)

听起来 Pub/Sub 可能不是完成这项工作的正确工具。似乎您正在尝试将 Pub/Sub 用作持久数据存储,这不是预期的用例。确认是云 Pub/Sub 消息生命周期的基本组成部分。 Pub/Sub 如果消息在提供的消息保留期(不能超过 7 天)后未被确认,则消息将被删除。

我建议您考虑使用像 Cloud Spanner 这样的 SQL 数据库。然后,您可以为每条消息生成一个 uuid,将其用作重复数据删除的主键,并以事务方式更新数据库以确保没有重复。

如果您提供更多关于您计划如何处理已删除重复邮件的信息,我可能会为您提供更好的答案。