Пакетная обработка данных в режиме реального времени - PullRequest
0 голосов
/ 11 апреля 2011

Мне поручено оптимизировать производительность процедуры линейной обработки данных. Вот обзор того, что уже на месте:

Данные поступают через порты UDP, у нас есть несколько прослушивателей, прослушивающих разные порты и записывающих необработанные данные в базу данных SQL Server (давайте назовем таблицу RawData). Затем у нас есть несколько экземпляров однопоточного линейного приложения, получающего необработанные данные из таблицы RawData и обрабатывающего отдельные данные. Что означает обработка, так это то, что необработанные данные сравниваются с ранее полученными данными для данного объекта, выполняются вычисления для вычисления количества различных показаний, затем для каждой отдельной строки данных вызываются несколько веб-сервисов и, наконец, для каждого из данных добавляется новая запись. строка в таблице ProcessedData. Также соответствующая запись сущности обновляется в другой таблице.

То, как я вижу проблему, может быть разбито на более мелкие части, и я мог бы использовать шаблон Производитель / Потребитель для обработки данных: Один поток производителя заполняет общую (блокирующую) очередь, несколько потребителей извлекают строки данных из очереди и выполняют их параллельную обработку. После того как потребители завершают работу, они помещают обработанные данные в другую общую очередь, к которой затем будет обращаться еще один потребительский поток (одиночный), который будет выполнять SqlBulkCopy для вставки новых записей. Вдоль процесса будет другая общая очередь, в которой будет храниться информация об объектах для обновлений, и еще один потребитель будет собирать обновленную информацию об объектах и ​​выполнять обновления.

Вопрос в том, что, хотя это кажется прямым, мне кажется, что это громоздкий подход. Я чувствую, что есть лучший способ сделать то, что я ищу. Любые предложения по реализации вышеупомянутой модели «производитель / потребитель»? Или я должен искать другой шаблон дизайна для моей проблемы?

Заранее спасибо

1 Ответ

2 голосов
/ 12 апреля 2011

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

Итак, у вас есть несколько потоков (производителей), считывающих данные из UDP и сохраняющих эти элементы в общей очереди. Назовите это RawData очередь. Несколько потребителей читают из этой очереди, обрабатывают элементы и помещают результаты в другую общую очередь. Назовите это ProcessedData очередь. Наконец, у вас есть один поток, который читает очередь ProcessedData и сохраняет элементы в базе данных.

.NET BlockingCollection идеально подходит для этого.

Это может быть полезно: Вопрос о потоке C # с RFID

...