如何在Pubsub中排除重复消息,而不使用Dataflow和Python中的ACK?

如何在Pubsub中排除重复消息,而不使用Dataflow和Python中的ACK?,python,publish-subscribe,google-cloud-pubsub,websub,Python,Publish Subscribe,Google Cloud Pubsub,Websub,我有一个用例,我想在不确认消息的情况下阅读Pubsub中的消息。我需要关于如何排除“重复消息”的可能性的帮助,当我不确认传递的消息时,“重复消息”将保留在Pubsub store中 我想到的解决方案: 将拉取的消息存储在数据存储中,并查看它们是否相同 在运行时存储拉取的消息,并检查我的消息是否重复O(n)时间复杂度和空间复杂度O(n) 将拉取的消息存储在文件中,并比较来自文件中消息的新传入消息 使用数据流并排除可能性(最低预期) 我发现Pubsub中没有类似于卡夫卡的偏移功能 在这件事上,您建议

我有一个用例,我想在不确认消息的情况下阅读Pubsub中的消息。我需要关于如何排除“重复消息”的可能性的帮助,当我不确认传递的消息时,“重复消息”将保留在Pubsub store中

我想到的解决方案:

  • 将拉取的消息存储在数据存储中,并查看它们是否相同
  • 在运行时存储拉取的消息,并检查我的消息是否重复O(n)时间复杂度和空间复杂度O(n)
  • 将拉取的消息存储在文件中,并比较来自文件中消息的新传入消息
  • 使用数据流并排除可能性(最低预期)
  • 我发现Pubsub中没有类似于卡夫卡的偏移功能

    在这件事上,您建议的最佳方法是什么/或我可以使用的任何其他替代方法

    我正在使用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用作持久数据存储,而这不是预期的用例。确认是云发布/订阅消息生命周期的基本部分。如果发布/订阅邮件在提供的邮件保留期(不能超过7天)后未经确认,则会将其删除

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


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

    听起来,发布/订阅可能不是适合这项工作的工具。似乎您正试图将Pub/Sub用作持久数据存储,而这不是预期的用例。确认是云发布/订阅消息生命周期的基本部分。如果发布/订阅邮件在提供的邮件保留期(不能超过7天)后未经确认,则会将其删除

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


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

    UDP方案在这里可能会更好一些,因为它不需要客户端确认,但需要注意的是,无法保证交付。我对google pubsub不太熟悉,所以我会深入研究文档,看看这是否是一个更好的方案,因为它不需要客户确认,但需要注意的是,交付是不保证的。我对google pubsub不太熟悉,所以我会深入研究文档,看看这是否是我的想法。我需要使用一些数据库来存储数据。因此,我的用例是:我将一个{Key,Value}json数据发送到Pubsub,并尝试在web上显示从“最后一个读取点(Pubsub的消息存储)”提取的数据,但我不确认这些消息。如果我拉一些信息,比如说10条信息,那么有可能旧的信息被拉出来,而不是新的信息,并显示在网络上。我有同样的想法,我需要使用一些数据库来存储数据。因此,我的用例是:我将一个{Key,Value}json数据发送到Pubsub,并尝试在web上显示从“最后一个读取点(Pubsub的消息存储)”提取的数据,但我不确认这些消息。如果我拉一些消息,比如说10条消息,那么有可能旧消息被拉出来,而不是新消息,并显示在web上。