@WhiteNinja

Как реализовать сервис обработки очереди на C# + EF 6?

Доброго времени суток!

Технологии:
ASP.NET MVC 5, Entity Framework 6, SQL Server 2008/MySQL

Задача:
Есть web-приложение (ASP.NET MVC), в котором пользователь загружает файлы (upload) с определенной структурой (один файл за раз). В файлах содержится много данных (средне-структурированных). После загрузки файла, необходимо с помощью определенных бизнес-правил "раскидать" все данные из загружаемого файла в примерно 15 таблиц.

Идея:
Так, как отработка бизнес-правил и "раскидывание" данных из одного файла может занять достаточно много времени, было решено организовать некую очередь "на распаковку" (реализовав очередь с помощью таблицы QueueTable описанной ниже), а саму очередь обрабатывать уже отдельным сервисом (либо windows service, либо простое console application) на сервере.

Получается после upload'a от ASP.NET MVC данные о файле сохраняются в таблицу примерно такого вида со статусом InProgress(1):

CREATE TABLE QueueTable
(
	Id int,
	FilePath varchar(255),
	StatusId int
);


StatusId принимает значения InProgress(1), Errors(2), Success(3).

Соответственно консольное приложение должно вытаскивать из этой очереди все строки со статусом InProgress(1), отрабатывать все бизнес-правила и "раскидывать" данные по всем необходимым таблицам и в случае если все прошло успешно менять статус в очереди на Success(3) или если вылетел Exception, то менять статус на Errors(2).

Вопросы:

1. Удачно ли выбран подход к решению задачи, или есть более оптимальное решение по "сложной" обработке файлов?

2. Хотелось бы также распараллелить работу по обработке очереди. Подскажите, пожалуйста, пример того, как мог бы выглядеть такой сервис(console application), чтобы понять в какую сторону смотреть? Также хотелось бы в этом распараллеленном сервисе при работе с БД использовать Entity framework, если это будет возможно.

Заранее благодарю за любую помощь!
  • Вопрос задан
  • 496 просмотров
Решения вопроса 1
Neuroware
@Neuroware
Программист в свободное от работы время
есть приложение с примерно такой же архитектурой, только сам "файл" в моем случае кладу туда же в базу, чтобы сервис не зависел от какой бы то ни было папки. Вопросов по надежности и скорострельности нет совсем, все работает очень шустро. Параллельную обработку сделал следующим путем:
  • В таблицу добавил еще одно поле "№обработчика"
  • Приложение обработчик создает N отдельных потоков, каждый изначально имеет определенный ID
  • Поток делает Update первой записи из таблицы, у которой "№обработчика" is null
  • Делает селект в базу выбирая записи у которых № обработчика тот же что и ID потока
  • Обрабатывает их и обновляет статус.


Таким образом получается, что потоки "отбирают" себе по задаче, обрабатывают ее и обновляют статус и так по кругу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы