2015-08-23 2 views
0

В моем последнем проекте я использую MassTransit (2.10.1) с RabbitMQ. В некоторых сценариях производителю разрешено отправлять основную массу сообщений в очередь.Как обращаться с одним издателем, забивающим мою очередь RabbitMQ

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

Я рассматривал разделение очередей для регулярных операций массового обслуживания VS, но это все еще не решает проблему для небольших объёмов (пользователь с десятками контактов, ожидающих пользователей со сто тысяч) и вызывает дополнительное обслуживание.

Идеальное решение для меня - я думаю, будет включать в себя манипулирование маршрутизацией таким образом, чтобы потребитель обрабатывал x сообщений от одного и того же пользователя, перемещал X-сообщения от следующего пользователя, чем снова, а затем перемещался назад к началу очереди, пока все сообщения не будут обработаны.

Возможно ли это? Есть ли лучшее решение?

Заранее спасибо.

ответ

1

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

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

+0

Спасибо. имеет ли смысл создавать очередь для каждого пользователя в этом сценарии? – motime

+0

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

0

Просто мое мнение, видя, как нет встроенного в мои знания ... Рассматривали ли вы использование любого хранилища, которое вы используете для хранения уведомлений, а затем просто публикуете одно сообщение со списком уведомлений, сохраняете это в вашем БД, а затем получить уведомления о получении для пользователя пользователя. ответ будет одним сообщением, он может иметь массивную полезную нагрузку, но даже если это увязнет, ​​добавьте пропуст и возьмите свойство в сообщение и заставьте его быть между 0 и 50 (или что-то еще). В каком сценарии вы хотите показать пользователю 100 000 уведомлений сразу?

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^