NServiceBus: сообщения в виде синглетонов - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время у нас есть Singleton Saga (реализовано как здесь: https://lostechies.com/jimmybogard/2015/04/17/saga-implementation-patterns-singleton/), которое повторно отправляет сообщение после определенного времени ожидания.

Это работает нормально, так как соответствующий обработчик может перехватить сообщение и выполнитьэто все. К сожалению, например, в дни установки, обработчик, чтобы поймать сообщения, остановился, но Saga с его блаженным невежеством продолжает генерировать сообщения. В зависимости от времени, когда обработчик не был рядом, очередь полна сообщений.Сообщения запускают только полную загрузку, достаточно только одного сообщения за один раз на шине. У меня есть несколько возможностей здесь:

  • Самый простой способ - получить доступ к очереди (каким-либо образом) ипроверьте, есть ли Сообщение. Из того, что я видел, это невозможно из коробки
  • Я установил атрибут [TimeToBeReceived]. Это облегчило бы боль во время простоев Handler
  • Я представляю государство в саге. Хендлер должен будет написать сообщение самостоятельно.Автобус, который затем обрабатывается Сага.Это похоже на подход, подобный «Saga», но делает его зависимым от обработчика.

Самое простое решение - сделать так, чтобы иметь возможность пометить сообщение как одиночный, но я не нашеллюбой намек, как это сделать.Второй самый простой подход, проверка очереди, также не кажется таким легким с данными интерфейсами.

Есть ли какие-то упущенные возможности или есть подход, который лучше соответствовал бы образу мышления за NServiceBus?

1 Ответ

0 голосов
/ 05 июня 2018

TimeToBeReceived - хороший вариант, но он не помогает, когда конечная точка запущена и работает.У сообщений не будет времени на истечение срока, и они будут обработаны.

Подход саги может работать, но это будет означать, что существуют серии сообщений с некоторым уникальным идентификатором для каждой серии.Я не видел этого в вашем описании.

Учитывая, что конечная точка обработки может быть отключена в любой момент времени, я предполагаю, что есть общее исходное сообщение (не уникальное), отправленное, возможно, несколько раз, в то время как конечная точкавнизЯ бы имел обработчик в отдельной конечной точке и настроил бы эту конечную точку на отбрасывать старые сообщения при запуске . Таким образом, все сообщения, приходящие, когда конечная точка не работает, будут отбрасываться.Есть несколько предостережений с этим.

  1. Все сообщения в очереди будут удалены.Поэтому нужно быть осторожным, какие другие сообщения отправляются в очередь.
  2. Если вы хотите, чтобы обработчик отвечал на первое сообщение в серии, это не сработает, поскольку нет способа узнать, было ли первое сообщениеотправляется, когда конечная точка работала или нет.

В случае, если вторая пуля - это то, с чем вы сталкиваетесь, наличие состояния неизбежно.

...