Использование Cloud Pub / Sub таким способом является анти-паттерном и может вызвать проблемы. Если вы сразу же подтвердите сообщение после его получения, но до его обработки, что вы будете делать, если по какой-то причине произойдет сбой подписчика? Pub / Sub не будет повторно доставлять сообщение и, следовательно, может никогда не обработать его потенциально.
Поэтому вы, вероятно, хотите дождаться подтверждения, пока сообщение не будет обработано. Но тогда вы не сможете закрыть подписчика, потому что тот факт, что сообщение является ожидающим, будет потерян, и, следовательно, истечет срок подтверждения, и сообщение будет доставлено.
Если вы хотите, чтобы клиент получал только одно сообщение за раз, вы можете использовать FlowControlSettings на клиенте. Если вы установите MaxOutstandingElementCount на 1, то на receiveMessage
будет одновременно доставляться только одно сообщение:
subscriber = Subscriber.newBuilder(projectSubscriptionName, new PubSubRoeMessageReceiver())
.setFlowControlSettings(FlowControlSettings.newBuilder()
.setMaxOutstandingRequestBytes(10L * 1024L * 1024L) // 10MB messages allowed.
.setMaxOutstandingElementCount(1L) // Only 1 outstanding message at a time.
.build())
.build();
Имейте в виду, что если у вас большой объем невыполненных небольших сообщений в то время, когда вы запускаете подписчика и намереваетесь запустить нескольких подписчиков, вы можете столкнуться с неэффективной балансировкой нагрузки, как объяснено в документации .