Ну, суть очередей в том, чтобы держать вещи довольно изолированными.
Если вы не застряли в какой-либо конкретной технологии, вы можете использовать базу данных для своих очередей.
Но сначала простой механизм, обеспечивающий координацию двух процессов, - это использование сокета.Если это целесообразно, просто сделайте так, чтобы процесс B создал прослушиватель с открытым сокетом на каком-то хорошо известном порту, и процесс A подключится к этому сокету и будет следить за ним.Если процесс B когда-либо уходит, процесс A может сказать, потому что его сокет отключается, и он может использовать это как предупреждение о проблемах с процессом B.
Для проблемы B -> C, иметь таблицу db:
create table queue (
id integer,
payload varchar(100), // or whatever you can use to indicate a payload
status varchar(1),
updated timestamp
)
Затем Процесс A помещает свою запись в очередь с текущим временем и состоянием «B».B прослушивает очередь:
select * from queue where status = 'B' order by updated
Когда B завершается, он обновляет очередь, чтобы установить состояние на "C".
Между тем, "C" опрашивает DB с:
select * from queue where status = 'C'
or (status = 'B' and updated < (now - threshold) order by updated
(с таким пороговым значением, как долго вы хотите, чтобы вещи гнили в очереди).
Наконец, C обновляет строку очереди до 'D' для выполненного или удаляет егоили что угодно.
Темная сторона в том, что здесь есть некоторое состояние гонки, когда C может попытаться захватить вход, пока B только запускается.Вы можете, вероятно, пройти через это со строгим уровнем изоляции и некоторой блокировкой.Что-то простое:
select * from queue where status = 'C'
or (status = 'B' and updated < (now - threshold) order by updated
FOR UPDATE
Также используйте FOR UPDATE для выбора B.Таким образом, тот, кто победит в выбранной гонке, получит эксклюзивную блокировку на ряду.
Это продвинет вас довольно далеко в плане реальной функциональности.