Почему PubSub пересылает сообщения, когда они были подтверждены? - PullRequest
0 голосов
/ 15 октября 2018

У меня короткий проект, в котором я отправляю несколько сообщений (~ 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 голосов
/ 15 октября 2018

просто выглядел очень внимательно в документации PubSub, и я обнаружил следующую часть:

Однако сообщения иногда могут доставляться не по порядку или более одного раза .В целом, для обеспечения доставки более одного раза требуется, чтобы ваш подписчик был идемпотентом при обработке сообщений.Вы можете добиться ровно однократной обработки потоков сообщений Cloud Pub / Sub с помощью Cloud Dataflow PubsubIO.PubsubIO дедуплицирует сообщения в пользовательских идентификаторах сообщений или в сообщениях, назначенных Cloud Pub / Sub.

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

Похоже, что Cloud Dataflow PubsubIO является ключом в моем случае.

или используйте UniqueId и выполните дедупликацию в клиенте :)

...