В расписании (на основе бизнес-правил) нам нужно где угодно между 10 000-200 000 строк из базы данных, которая будет обрабатываться с помощью продолжительной операции. Каждая строка должна обрабатываться индивидуально (они не зависят друг от друга), и это нормально, чтобы это происходило асинхронно. Успешное завершение операции должно быть документировано (возможно, в базе данных).Массовые строки базы данных для очереди сообщений для долговременной работы
Я предполагаю, что лучший способ сделать это - использовать очередь сообщений, чтобы она была долговечной и могла легко масштабироваться. Во-первых, это лучшее решение? Если да, то каков наиболее эффективный способ поместить все строки из базы данных в очередь, гарантируя, что все строки попали в очередь?
Примечание. Мы являемся командой .Net, использующей C# 3.5, WCF, MSMQ и SQL 2005. Я исследовал NServiceBus и был бы готов использовать это, если это рекомендовано.
Я беспокоюсь о том, что база данных является узким местом (обновление каждой строки для маркировки как обработано). Я также не знаю, как «транслировать» сообщение.
- Как я могу «отправить транзакцию»? Я имею в виду: загрузить строку из db, отправить сообщение, обновить строку в db. Если обновление не удается, я не хочу, чтобы сообщение отправлялось.
- Это распространенный сценарий, или я должен делать это по-другому?
- Мое беспокойство заключается в том, что обновление отдельных строк в db вызовет узкое место. Могу ли я «транзактивно отправить» пакет сообщений, а затем пакетное обновление db?
Зачем вообще закрывать потребителей? Процесс, как представляется, является периодическим, позволяет потребителям бездействовать и ждать большего количества данных в очереди. Если вы используете тайм-аут в RecieveMessage, вы можете периодически выходить из заблокированного состояния и проверять, получили ли они управляющее сообщение для выключения. – GrayWizardx
@GrayWizardx: Хорошая точка. Мы Linux, и закрытие источника во главе конвейера распространяет простой EOF на потребителей, и все это прекрасно закрывается. Я проецировал эту операцию закрытия. Если это не нужно, сохраните сложность. –
Спасибо, это тоже отличная информация.Если бы кто-то из вас мог помочь с моими дальнейшими моментами, это было бы здорово. Меня беспокоит узкое место в db и как отправлять транзакции по транзакциям. – JontyMC