为什么PubSub在收到确认后会重新发送消息?

时间:2018-10-15 05:55:36

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

我有一个简短的项目,我在其中推送了许多消息(〜1000条消息),然后尝试在单个线程上处理它们,但仍然收到重复消息。

这是PubSub的理想行为吗?

这是创建订户的代码

    ExecutorProvider executorProvider =
            InstantiatingExecutorProvider.newBuilder().setExecutorThreadCount(1).build();

    // create subscriber
    subscriber = Subscriber.newBuilder(subscriptionName, messageReceiver).setExecutorProvider(executorProvider).build();
    subscriber.startAsync();

这里是演示:https://github.com/andonescu/play-pubsub

我已经推送了1000条消息,每个进程花费了300毫秒(故意添加了延迟),然后调用了ack()。订阅的确认时间为10。基于所有这些,我不应该收到重复的消息,但是我已经收到了超过10%的消息。

这是日志:https://github.com/andonescu/play-pubsub/blob/master/reports/1000-messages-reader-status

我在https://github.com/GoogleCloudPlatform/pubsub/issues/182

上添加了相同的问题

1 个答案:

答案 0 :(得分:1)

通过PubSub文档看起来非常细心,我发现了以下部分:

  

但是,消息有时可能会乱序发送或多次发送。通常,要容纳多于一次的传递,则要求您的订户在处理消息时必须是幂等的。您可以使用Cloud Dataflow PubsubIO对Cloud Pub / Sub消息流进行一次处理。 PubsubIO对自定义消息标识符或由Cloud Pub / Sub分配的消息标识符重复删除消息。

https://cloud.google.com/pubsub/docs/subscriber#at-least-once-delivery

在我看来,Cloud Dataflow PubsubIO是关键。

或使用UniqueId并在客户端中进行重复数据删除:)