我有一个简短的项目,我在其中推送了许多消息(〜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
上添加了相同的问题答案 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
并在客户端中进行重复数据删除:)