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

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

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

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

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


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


Ответы (1)


Мне интересно, может ли вас здесь вдохновить шаблон скольжения маршрута, т.е. отправлять исходные сообщения 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