Как Spring Cloud Stream предотвращает получение экземплярами приложения дублирующихся сообщений? - PullRequest
0 голосов
/ 14 марта 2019

Spring Cloud Stream основан на По крайней мере один раз методе. Это означает, что в некоторых редких случаях дублирующее сообщение может прибыть в конечную точку.

Сохраняет ли Spring Cloud Stream буфер уже полученных сообщений?

IdempotentReceiver в книге «Шаблоны интеграции предприятий» предлагает: Разработайте приемник как идемпотентный приемник, который может безопасно получать одно и то же сообщение несколько раз.

Контролирует ли Spring Cloud Stream дубликаты сообщений у потребителей?

Обновление:

Абзац из Spring Cloud Stream говорит:

4.5.1. долговечность В соответствии с продуманной моделью приложений Spring Cloud Stream, подписки групп потребителей надежны. Таким образом, реализация связующего механизма гарантирует, что групповые подписки являются постоянными и что, как только одна подписка для группы была создана, группа получает сообщения, даже если они отправляются, пока все приложения в группе остановлены. Анонимные подписки недолговечны по своей природе. Для некоторых реализаций связующего (например, RabbitMQ) можно иметь недлительные групповые подписки. В общем, предпочтительно всегда указывать группу потребителей при привязке приложения к заданному месту назначения. При масштабировании приложения Spring Cloud Stream необходимо указать группу потребителей для каждой входной привязки. Это не позволяет экземплярам приложения получать дубликаты сообщений (если это не требуется, что необычно).

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Если вас беспокоит случай, когда приложение получает и обрабатывает сообщение от посредника, но выдает сбой до того, как оно подтверждает сообщение, это может произойти.Пускатели приложений Spring Cloud предоставляют поддержку для автоматической настройки постоянного хранилища метаданных сообщений , которое поддерживает IdempotentReceiverInterceptor Spring Integration .Примером этого является SFTP-приложение для начинающих .По умолчанию источник sftp использует хранилище метаданных в памяти, поэтому он не выдержит перезапуска, но может быть настроен для использования постоянного хранилища.

1 голос
/ 14 марта 2019

Я думаю, что ваше предположение об ответственности платформы Spring-Cloud-Stream неверно.Spring-cloud-stream в двух словах - это структура, отвечающая за подключение и адаптацию производителей / потребителей , предоставленных разработчиком, к брокеру (ям) сообщений, предоставляемым связывателем spring-cloud-stream (например, Kafka,Кролик, Кинезис и т. Д.).Таким образом, ответственность за соединение с брокером, получение сообщения от брокера, его десериализацию, вызов кода пользователя, сериализацию сообщения и его отправку обратно брокеру входит в сферу ответственности платформы.Таким образом, вы можете рассматривать это как чисто инфраструктуру.

То, что вы описываете, является скорее проблемой приложения, так как фактический получатель - это то, что пользователь разработает в рамках процесса разработки весеннего облачного потока, следовательноответственность за идемпотентность лежит на таком пользователе.Кроме того, большинство брокеров уже обрабатывают идемпотентность (в некотором роде), гарантируя, что конкретное сообщение было доставлено только один раз.Тем не менее, если кто-то отправит идентичное сообщение такому брокеру, он не будет знать, что оно является дубликатом, поэтому требование идемпотентности и / или дедупликации остается в силе, но, как вы можете видеть, это не так просто, учитывая количество факторовкоторые находятся в игре, где ваше понимание идемпотентности может отличаться от моего, следовательно, наши подходы могут также отличаться.И последнее (частично, чтобы доказать мою последнюю точку зрения): может безопасно получать одно и то же сообщение несколько раз. - Это все, что говорится, но что действительно означает для вас безопасно противя против другого человека?

...