Ищу паттерн
От: DuШes  
Дата: 18.10.06 06:36
Оценка:
Привет...ищу информацию по следующей задачке, над которой ломаю голову:
есть очередь задач (формируется на основе соотвествующей таблицы в db), какой-то/какие-то компоненты могут писать в очередь,
другие компоненты читают и запускают (причем задачи должны запускаться асинхронно), должне быть некий механиз оповещения, что положена в очередь такая то задача, а также такая то обработана — кто должен отвечать за нотификацию события пока не понятно, врроде бы можно такую функцию возложить и на саму очередь (enqueue, dequeue), но в тоже время за сам факт обработки задачи отвечает соотвествующий компонент, вытащивший задачу на обработку...

Синхронизации между потоками записи и чтения в очередь вроде пока не трубуется

Вот как технически правильно задизайнить систему пока не решил, рассматриваю пока паттерн Producer/Consumer..., есть у кого примеры желательно с кодом?
Re: Ищу паттерн
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 18.10.06 07:38
Оценка:
Не совсем понятно, что мешает сделать для каждого потока-обработчика свою очередь сообщений. Тогда за нотификацию (через эвенты) отвечает поток, который поместил сообщение в очередь. Соответственно, нужна будет синхронизация на запись сообщения в очередь и на удаление/извлечение/чтение сообщения из очереди. Поток-обработчик, получив уведомление от потока, записавшего сообщение, "просыпается", извлекает сообщения из очереди, обрабатывает и вновь "засыпает".

Если не хотите посылать сообщения разным потокам, можете сделать еще один поток-диспетчер. Все сообщения сначала посылаются диспетчеру, а тот по известным только ему правилам диспетчеризует сообщения другим потокам.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: Ищу паттерн
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 18.10.06 08:18
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Привет...ищу информацию по следующей задачке, над которой ломаю голову:

DШ>есть очередь задач (формируется на основе соотвествующей таблицы в db), какой-то/какие-то компоненты могут писать в очередь,
DШ>другие компоненты читают и запускают (причем задачи должны запускаться асинхронно), должне быть некий механиз оповещения, что положена в очередь такая то задача, а также такая то обработана — кто должен отвечать за нотификацию события пока не понятно, врроде бы можно такую функцию возложить и на саму очередь (enqueue, dequeue), но в тоже время за сам факт обработки задачи отвечает соотвествующий компонент, вытащивший задачу на обработку...

Первое что пришло в голову:
Я бы добавил ввел синтетичекую сущность "Событие в очереди" которая содержит
в себе ссылку на событие и атриубут "Статус" принимающий следующие значения :
"В ожиданни обработки", "Обрабатывается".

Осн. сценарри:

Добавление события в очередь:
создается обьект типа "Событие в очереди" со статусом "В ожиданни обработки",
очередь рассылает соотв. сообщения.

Компонент берет событие из очереди для обработки:
статус соотв. обьекта "Событие в очереди"
переходт в "Обрабатывается", очередь рассылает сообщение "Началась обработка события".


Компонент завершает обработку события:
компонент посылает очереди уведомление о завершении обработки, очередь удаляет соот.
обьект "Событие в очереди", рассылает сообщение "Закончилась обработка события".
Re: Ищу паттерн
От: pt4h Беларусь http://dzmitryhuba.blogspot.com/
Дата: 18.10.06 08:42
Оценка: 4 (1)
Здравствуйте, DuШes, Вы писали:

DШ>Привет...ищу информацию по следующей задачке, над которой ломаю голову:

DШ>есть очередь задач (формируется на основе соотвествующей таблицы в db), какой-то/какие-то компоненты могут писать в очередь,
DШ>другие компоненты читают и запускают (причем задачи должны запускаться асинхронно), должне быть некий механиз оповещения, что положена в очередь такая то задача, а также такая то обработана — кто должен отвечать за нотификацию события пока не понятно, врроде бы можно такую функцию возложить и на саму очередь (enqueue, dequeue), но в тоже время за сам факт обработки задачи отвечает соотвествующий компонент, вытащивший задачу на обработку...

DШ>Синхронизации между потоками записи и чтения в очередь вроде пока не трубуется


DШ>Вот как технически правильно задизайнить систему пока не решил, рассматриваю пока паттерн Producer/Consumer..., есть у кого примеры желательно с кодом?


Producer/Consumer + Data Polling мне кажется Вам подойдет.

More iterator fun with the producer/consumer pattern пример реализации Producer/Consumer.

В Вашем случае Вы запускаете N потоков, которые находятся в режиме ожидания. При появлении новой задачи в очереди (пока что мы говорим про очередь в памяти, а не в базе), очередной поток просыпается и начинает обрабатывать эту задачу. То есть, нотификация осуществляется самим механизмом очереди. Теперь надо как-то получить задачи. Вы можете запустить отдельный поток, который будет с определенным интервалом стучаться в базу (Data Polling) и забирать свеживе задачи. Полученные задачи будут отправляться в очередь. В худшем случае вы получите простой в размере интервала опроса базы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Ищу паттерн
От: DuШes  
Дата: 18.10.06 09:17
Оценка: 2 (1)
[....]
P>Producer/Consumer + Data Polling мне кажется Вам подойдет.

P>More iterator fun with the producer/consumer pattern пример реализации Producer/Consumer.


интересная статья...но лично мне больше понравилась статья Joseph Albahari
http://www.albahari.com/threading/part4.html в разделе касающейся реализации producer|consumer

P>В Вашем случае Вы запускаете N потоков, которые находятся в режиме ожидания. При появлении новой задачи в очереди (пока что мы говорим про очередь в памяти, а не в базе), очередной поток просыпается и начинает обрабатывать эту задачу. То есть, нотификация осуществляется самим механизмом очереди. Теперь надо как-то получить задачи. Вы можете запустить отдельный поток, который будет с определенным интервалом стучаться в базу (Data Polling) и забирать свеживе задачи. Полученные задачи будут отправляться в очередь. В худшем случае вы получите простой в размере интервала опроса базы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.