У меня есть механизм производителя-потребителя, Я вынужден хранить произведенные товары в базе данных, это требование. Также у меня есть несколько производителей и несколько потребителей, производителей и потоков потребителей, которые будут обращаться к записям в нескольких таблицах базы данных; Столбец ProcessID будет определять, какой поток к какой записи обращается.
Потоки будут работать через службу Windows.
ProcessID создается по трем причинам.
1- Если поток завершился некорректно, будет использоваться идентификатор процесса, чтобы избежать повторного запуска обработки.
2- Потоки синхронизируются с помощью блокировки базы данных, и, надеюсь, у меня будут только блокировки строк, и, вероятно, у меня будет несколько заблокированных потоков на короткое время, потому что каждый поток будет обращаться к нескольким записям, отмеченным ProcessID.
3- Я хотел отслеживать, какой поток и в какое время что делал, потому что я регистрирую ошибки в базе данных. Обратите внимание, что потребители будут отправлять элементы в веб-службу.
Если бы я использовал массив In-Memory в качестве очереди, я сомневаюсь, что это повысит производительность, у него есть следующие недостатки: -
Когда потребитель извлекает элемент из очереди, ему все равно придется обновить свою запись в базе данных с помощью идентификатора процесса.
Производитель вставит элемент в базу данных и получит его идентификатор с помощью параметра Output stp, затем он поместит элемент в очередь с его идентификатором, избегая его повторного чтения из базы данных, это единственное преимущество очереди в памяти, избегая перечитать элемент из базы данных. Обратите внимание, что после того, как запись вставлена в БД, ничего не будет обновлять ее, кроме потребителя.
Другая проблема заключается в том, что я предполагаю, что оператор может прекратить потребление определенного элемента, удалив его из базы данных. Если я использую в очереди памяти, я потеряю это будущее.
Класс Queue должен будет заблокировать частный объект, методы очереди доступа должны быть синхронизированы. Я чувствую, что дублирую вероятность того, что поток будет голоден. и я чувствую, что дублирую время, в течение которого поток будет заблокирован в ожидании.
Два вопроса
1- Мне что-то не хватает в этом дизайне? Как вы думаете, это сработает?
2- Не использовать ли очередь в памяти?