Зависимость работы в RabbitMQ

Я пытаюсь выяснить, как лучше всего настроить следующий сценарий:

  1. Несколько заданий типа A добавляются в очередь
  2. После завершения всех заданий типа A потребуется задание типа B или C (по одному на задание типа A).
  3. Когда все задания типов A, B и C будут завершены, потребуется последнее задание типа D.

Таким образом, в основном у нас есть некоторые зависимости от заданий в очереди, так что мы не хотим запускать задания, которые требуют завершения других заданий. Есть ли руководство по настройке такой системы? Должны ли задания типа A добавлять задания типа B или C после завершения их работы? Должны ли все рабочие места быть добавлены заранее и каким-то образом сказать рабочим не тянуть их, пока они не будут готовы?

Есть плюсы и минусы обоих подходов, если мне нужно вручную управлять этой зависимостью, но мне любопытно, есть ли другой шаблон, который я мог бы использовать вместо этого, который мог бы выполнить то же самое, но более простым способом.


person methodin    schedule 07.02.2012    source источник


Ответы (1)


arrow_upward
5
arrow_downward

Мне интересно, может ли вас здесь вдохновить шаблон скольжения маршрута, т.е. отправлять исходные сообщения A «слип», который определяет, какими должны быть следующие сообщения (B, C) (какие правила применять, чтобы выяснить это во время выполнения).

Я бы также добавил в квитанцию ​​уникальный идентификатор корреляции и размер корреляционной группы (в данном случае: общее количество сообщений A).

Для окончательного задания D я бы попросил шаги процесса B/C отправить сообщение запроса «D-ready». Когда все сообщения D-ready будут собраны (на основе идентификатора корреляции/размера группы), я запускаю последнее задание D.

person David Dossot    schedule 07.02.2012
comment
Как бы вы порекомендовали отслеживать что-то подобное, если предположить, что размер работы A будет примерно 3000 (таким образом, 3000 B и C) и только один D? Стандартный стол? - person methodin; 08.02.2012
comment
Для глобальной статистики вы можете использовать разные очереди для каждого типа сообщений и использовать статистику очереди. Но знание состояния каждого задания, вероятно, потребует внешнего хранилища данных. - person David Dossot; 08.02.2012