2013-09-06 2 views
2

Я пытаюсь найти способ обработки сообщений в том порядке, в котором они были отправлены от отправителя, поскольку NServiceBus не гарантирует, что сообщения будут обрабатываться в определенном порядке.Как обрабатывать порядок сообщений в nservicebus?

Отправитель - это система заказов, которая публикует команды createOrder и reviseOrder. Отправитель позволяет пользователю отправлять несколько ревизий в один и тот же порядок, поэтому одновременно могут быть ревизии 4 и версии 3 в очереди. Каждая ревизия имеет номер версии и код причины, связанный с ней, который управляет некоторой бизнес-логикой, поэтому мы не можем игнорировать какие-либо изменения или, по крайней мере, ее часть.

Несколько идей, которые я имел, перечислены ниже -

  1. магазин номер версии с целевой записи. Отправитель отправляет свой номер ревизии в каждое сообщение о ревизии. Обработчик сравнивает номера версий отправителя и получателя, если они соответствуют записи, обновляется иначе сообщение помещается в конец очереди. При таком подходе, если сообщение ревизии 2 выходит из строя и переходит в очередь ошибок, версия 3 никогда не будет обработана.

  2. Отправитель отправляет историю всех кодов причин для всех изменений для каждого сообщения о ревизии. Поэтому, если сообщение ревизии 2 выходит из строя, сообщение версии 3 будет содержать все коды причин. Эти коды причин будут записаны в месте назначения, но любая бизнес-логика, связанная с кодом предыдущей версии, может не произойти.

Как мы проектируем для этого сценария?
Также есть идеи о том, как обрабатывать неудавшиеся сообщения о пересмотре?

Некоторые рекомендации действительно оценены.

Спасибо.

ответ

6

Из одного из основных принципов, лежащих в основе NserviceBus, является то, что вы должны создавать свои системы таким образом, чтобы заказ не имел значения. Сказав, что я построил упорядоченную систему с NSB до, вот как я решил сделать это:

  • Добавить порядковый номер для всех сообщений
  • в приемнике проверить порядковый номер последний видел номер + 1, если не бросить аут исключения последовательности
  • Включить повторные попытки второго уровня (так что, если они вышли из строя, они попытаются еще раз позже, надеюсь, после того, как правильно было получено сообщение)

Как правило, это работает довольно хорошо, однако иногда материал будет немного удаляться, если что-то hing не работает слишком долго, и требуется ручное вмешательство для повторной проверки.

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

  • Добавить номер версии для всех полей, которые вы можете изменить с пересмотром
  • только обновит поле, если номер ревизии в сообщении,> = последний пересмотр в БД

У этого есть куча преимуществ.

  • Это не зависит от того,
  • Это снижает нагрузку только требуя от приемника для обработки каждого сообщения, когда
  • это дело очень хорошо с ошибками, не останавливая все, если есть проблема с одним сообщением ,

Но он имеет следующие недостатки:

  • Добавлена ​​сложность в БД
  • Его в конце концов, последовательны, если вы посмотрите на БД может содержать только некоторые из правок пользователь сделал.
  • Если rev2 ошибки и rev3 правильно обрабатываются некоторые из пользователей редактирует обыкновение быть там, но некоторые из них будут
+0

Спасибо Люк. – maddog

+2

На ваш взгляд, насколько важно, чтобы NServiceBus обеспечивал поддержку на уровне базового уровня для этого сценария? –

+0

@UdiDahan в сценарии, который у нас был, я думаю, что мы допустили ошибку, чтобы требовать порядка. Если бы мне пришлось это сделать снова, я бы сделал нечто похожее на то, что я описал выше. Я думаю, что лучшим вариантом является поддержка любого порядка в обработчиках, а не обеспечение порядка в рамках, но это только мое мнение. –

Смежные вопросы