GCP PubSub Spring Boot重复提取消息

时间:2019-06-11 00:44:12

标签: spring-boot google-cloud-platform google-cloud-pubsub

我需要有关gcp pub / sus的问题的帮助。我有一个过程,它向pubsub发送带有过滤器的100条消息,另一个应用程序(在春季启动中)接收这些消息。当Spring Boot应用程序从pubsub接收消息(不是拉)时,处理100条消息,但是进入该进程,接收更多消息,不同的时间接收不同数量的消息,任何时候接收120条消息,另外140条消息,其他200条消息。我没有找到任何解决方案,这是我的代码:

    @Bean
    @ServiceActivator(inputChannel = "pubsubInputChannel")
    public MessageHandler messageReceiver() {
        return message -> {
            System.out.println("Message arrived! Payload: " + new String((byte[]) message.getPayload()));
            //other process of app (call other api)
            AckReplyConsumer consumer = (AckReplyConsumer) message.getHeaders().get(GcpPubSubHeaders.ACKNOWLEDGEMENT);
            consumer.ack();
        };
    }

请帮助我!

1 个答案:

答案 0 :(得分:1)

由于不同的原因,在Google Cloud Pub / Sub中可能会出现重复消息。要记住的一件事是,Cloud Pub / Sub提供了至少一次的交付,这意味着一定数量的重复项始终是可能的,因此您的应用程序必须对它们具有弹性。不过,很多重复确实确实有点高。通常,由于以下原因,通常会发生重复:

  1. 发布者多次发送邮件。如果发布者与Cloud Pub / Sub断开连接并再次发送相同的消息,则会发生这种情况。如果发生这种类型的重复,则邮件将具有不同的邮件ID。
  2. 订户花太多时间来确认消息。在您的代码中,您有<div class="msg" num="1" name="923103870"> 。此过程需要多长时间?如果超过确认消息的截止日期,则将重新发送该消息。请记住,如果此其他过程要求为所有消息都获取锁,则可能有争用问题,因为试图同时获取这些锁的请求过多,从而导致处理延迟。默认情况下,邮件的确认截止时间为十秒。使用Java客户端库时,最后期限由maxAckExtensionPeriod自动延长,默认为一小时。也可以在DefaultSubscriberFactory中为Spring设置此属性。
  3. 根本不确认消息。如果异常阻止了对//other process of app (call other api)的调用,或者发生了死锁,导致该行代码无法到达,则该消息将重新发送。
  4. 用例是large backlog of small messages之一。在这种情况下,缓冲区很容易以导致重新传递消息的方式填充客户端。