Недавно я начал изучать нюансы масштабируемой и корпоративной компьютерной архитектуры, и одним из центральных компонентов является очередь сообщений. Чтобы извлечь максимальную пользу из любой парадигмы программирования, я пытаюсь реализовать собственную версию службы очереди сообщений.
До сих пор мой первоначальный проект выполнялся на многопоточном прослушивателе сокетов, но для предотвращения двойной загрузки одного и того же сообщения двумя отдельными узлами обработки регистр индекса очереди сообщений блокируется при инициации чтения и разблокируется после того, как регистр был обновлено. Таким образом, это устраняет необходимость его многопоточности и означает, что существует предел для размера масштабируемой системы, основанный на скорости обработки сервера, на котором работает служба очереди сообщений.
Чтобы обойти это, можно запустить службу очереди сообщений на нескольких серверах, но это повысит вероятность загрузки одного и того же сообщения дважды. Единственный способ предотвратить возникновение таких проблем состоит в том, чтобы включить обратный вызов отзыва, который (после того, как серверы или даже потоки на одном сервере синхронизировали свою информацию и обнаружил такую повторную выдачу) приказал бы узлу обработки остановить его текущее задание, и повторно запросите очередь сообщений для следующего сообщения, но, опять же, будет верхний предел, при котором большая часть отправляемого трафика будет синхронизироваться, а обратные вызовы аннулируются, вызывая узкое место и замедляя обработку информации, так что Многие узлы обработки будут выполнять нулевые операции и тратить время.
Последний способ обойти эту проблему - придать каждому серверу очереди сообщений (и каждому потоку на каждом сервере) конкретное смещение относительно того, где в очереди он ищет, но это может иметь проблемы, основанные на тип приложения, особенно если обработка должна быть выполнена в определенном порядке.
Итак, все это говорит о том, существуют ли какие-либо конструкции архитектуры очереди сообщений, которые могли бы показать мне, как существующие службы очереди сообщений уровня предприятия избегают этих проблем?