Мне поручено оптимизировать производительность процедуры линейной обработки данных. Вот обзор того, что уже на месте:
Данные поступают через порты UDP, у нас есть несколько прослушивателей, прослушивающих разные порты и записывающих необработанные данные в базу данных SQL Server (давайте назовем таблицу RawData). Затем у нас есть несколько экземпляров однопоточного линейного приложения, получающего необработанные данные из таблицы RawData и обрабатывающего отдельные данные. Что означает обработка, так это то, что необработанные данные сравниваются с ранее полученными данными для данного объекта, выполняются вычисления для вычисления количества различных показаний, затем для каждой отдельной строки данных вызываются несколько веб-сервисов и, наконец, для каждого из данных добавляется новая запись. строка в таблице ProcessedData. Также соответствующая запись сущности обновляется в другой таблице.
То, как я вижу проблему, может быть разбито на более мелкие части, и я мог бы использовать шаблон Производитель / Потребитель для обработки данных:
Один поток производителя заполняет общую (блокирующую) очередь, несколько потребителей извлекают строки данных из очереди и выполняют их параллельную обработку. После того как потребители завершают работу, они помещают обработанные данные в другую общую очередь, к которой затем будет обращаться еще один потребительский поток (одиночный), который будет выполнять SqlBulkCopy для вставки новых записей. Вдоль процесса будет другая общая очередь, в которой будет храниться информация об объектах для обновлений, и еще один потребитель будет собирать обновленную информацию об объектах и выполнять обновления.
Вопрос в том, что, хотя это кажется прямым, мне кажется, что это громоздкий подход. Я чувствую, что есть лучший способ сделать то, что я ищу. Любые предложения по реализации вышеупомянутой модели «производитель / потребитель»? Или я должен искать другой шаблон дизайна для моей проблемы?
Заранее спасибо