Архитектура RabbitMQ для заданий с возвратом результатов

Я пытаюсь создать систему, в которой люди могут отправлять файлы на подпись. Каждое представление может иметь несколько файлов, и результаты будут отправлены обратно пользователю, если после того, как весь файл в каждом представлении будет готов.

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

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

Моя текущая настройка заключается в том, что у меня есть очередь отправки, и несколько потребителей очереди отправки будут получать сообщения из нее один за другим, разбивать отправку на отдельные файлы и отправлять их в очередь файлов. И 6 ящиков для подписи будут 6 потребителями очереди файлов. У меня возникают проблемы с записью результатов обратно потребителю отправки, который отслеживает, все ли файлы готовы для этой отправки, и я не могу контролировать максимальное количество полей для подписи, используемых для каждого задания.

Я просмотрел настройку RPC для rabbitmq, которая позволяет записывать результаты обратно. Проблема в том, что вызов rpc блокируется для каждого файла, и я хочу, чтобы несколько файлов для одной и той же отправки могли подписываться параллельно. Поэтому мне нужны некоторые предложения по архитектуре rabbitmq и потоку сообщений для этого типа сценария.


person Shengcong Wang    schedule 09.02.2016    source источник


Ответы (1)


1) Предполагая, что вы знаете количество файлов, назначьте каждой отправке идентификатор задания.

2) Работа может состоять из нескольких задач.

3) Рассчитать приоритет, который наивно может быть обратным номеру документов. Таким образом, документ с большим количеством документов по умолчанию имеет более низкий приоритет. Ваше приложение должно иметь навороты для настройки приоритета на тот случай, если более крупная работа должна быть обработана с высоким приоритетом.

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

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

person JVXR    schedule 09.02.2016