NServiceBus значительно упростит процесс настройки очередей. Это (схема msmq) является распространенным шаблоном для этой операции, но это не единственный вариант.
Вы также можете посмотреть SQL Server Service Broker и многие другие подобные технологии, чтобы сделать то же самое.
Есть несколько предостережений, о которых вы должны знать с MSMQ:
- Транзакционные очереди не могут быть сбалансированными по нагрузке, если они не являются очередью домена Active Directory. Большой вывод здесь заключается в том, что очередь должна находиться на одной машине, что означает, что она может быть потеряна, если машина потеряна (постоянная или временная). Это не большая проблема, но стоит принять к сведению
- Очереди MSMQ имеют два «режима» транзакционного и нетранзакционного. Только транзакционные очереди гарантируют доставку сообщений.
- Сообщения MSMQ сами по себе ограничены 4 МБ (или около того), и вы должны сами управлять сериализацией (хотя сериализация .NET по умолчанию довольно проста с сериализатором XML). Если вы хотите, чтобы сообщения размером более 4 МБ, вам нужно либо управлять ими вне очереди, либо управлять несколькими сообщениями в очереди самостоятельно (BizTalk имеет способ сделать это, так что это не большая проблема). 4 МБ должно быть достаточно большим для ваших нужд.
- Как только вы «принимаете» сообщение из очереди, оно немедленно удаляется, поэтому в зависимости от вашего дизайна это может быть проблемой. будет иметь возможность для ваших потребителей "принять" сообщение, потерпеть неудачу и сделать так, чтобы сообщение не вернулось в очередь.
Сказав все это, MSMQ очень надежен и стабилен, если вы планируете реализацию и используете ее для обмена сообщениями часть вашего процесса, а не для хранения данных.
Наконец, в качестве альтернативы вашему текущему предложению (и вам есть с чем сравнивать) вы можете реализовать описанный сценарий непосредственно из БД. Как набросок салфетки:
- Процесс запускается в БД и заполняет таблицу «ожидающими» строками строк, присваивая каждому уникальный идентификатор (guid и т. Д.)
- Создайте SP, который возвращает "n" этих строк вызывающей стороне, и помечает те же строки как "ожидающие" в БД. Если строк нет, возвращается 0 или -1, или что-то еще
- Создание SP, который получает список идентификаторов строк и расположение (информацию о завершении) для задания и обновляет таблицу ожидания, либо помечая их как выполненные, либо удаляя их, и регистрируя данные о завершении
- Ваши клиенты звонят в первый SP и запрашивают набор строк для работы на
- Ваши потребители обрабатывают строки
- Ваши потребители звонят второму ИП, чтобы записать проделанную работу
Затем вы можете периодически запускать отчеты, чтобы увидеть, какая работа была выполнена и все еще ожидает, и, если необходимо, изменить строки с ожидающих на ожидание и т. Д. Это будет иметь примерно такое же масштабирование, как и у вашего другого решения, удалить слой косвенности (который может быть плохо, в зависимости от) и обеспечить немного более линейный процесс. По сути, этот процесс работает так, как работает Service Broker (конечно, очень перегнано).
Все зависит от того, как вам удобнее всего это реализовывать. Я сделал это обоими способами, и у обоих есть свои плюсы и минусы.