У меня есть эта проблема, когда система содержит узлы (службы Windows), которые отправляют сообщения для обработки, и другие, которые извлекают сообщения и обрабатывают их.
Это было разработано таким образом, что push-узлы балансируют нагрузку между очередями, поддерживая циклический список очередей и чередующиеся очереди после каждой отправки. Поэтому сообщение 1 будет отправлено в очередь 1, сообщение 2 - в очередь 2 и т. Д. До сих пор эта часть работала отлично.
На уровне извлечения сообщений мы разработали его так, чтобы сообщения извлекались аналогичным образом - сначала из очереди 1, затем из очереди 2 и т. Д. Теоретически, каждый узел извлечения находится на отдельной машине и на практике пока Он прослушивал только одну очередь. Но недавно появившееся требование заставило нас создать в сети машину, которая прослушивает более одной очереди: один узел, который обычно очень занят и заполнен миллионами сообщений, а другой, как правило, содержит всего несколько сообщений.
Проблема, с которой мы сталкиваемся, заключается в том, что способ, которым мы изначально проектировали узлы извлечения, переходит из очереди в очередь, пока не будет найдено сообщение. Если время ожидания истекло (скажем, через секунду), оно переходит к следующей очереди.
Это больше не работает, потому что Q1 (заполненный миллионами сообщений) будет задерживаться примерно на секунду для каждого сообщения, так как после каждого извлечения из Q1 мы будем запрашивать сообщение у Q2 (и если оно не будет содержать, мы будем ждать секунду ).
Итак, это выглядит так:
Q1 содержит 10 сообщений, а Q2 не содержит
- Узел Pull запрашивает сообщение от Q1
- Q1 немедленно возвращает сообщение
- Узел Pull запрашивает сообщение от Q1
- ------------ Ожидание секунды ------------- (Q2 пусто и время ожидания запроса)
- Узел Pull запрашивает сообщение от Q1
- Q1 немедленно возвращает сообщение
- Узел Pull запрашивает сообщение от Q1
- ------------ Ожидание секунды ------------- (Q2 пуст и время запроса истекло)
и т.д.
Так что это явно неправильно.
Я думаю, я ищу лучшее архитектурное решение здесь. Обработка сообщений не обязательно должна осуществляться в режиме реального времени, насколько это возможно, но должна быть надежной, и ни одно сообщение не должно быть потеряно!
Мне бы хотелось услышать ваше мнение по этой проблеме.
Спасибо заранее
Яннис