У нас есть две части архитектуры. По сути они образуют производителя и потребителя. Piece 1 (p1) публикует сообщения на Piece 2 (p2), которые обрабатывают сообщение, этот процесс включает отправку сообщения на удаленный узел, который должен вызывать сообщение после его обработки, этот процесс может занять несколько секунд в лучшем случае.сообщения шаблоны очередей
p2 имеет конечную длину в своей очереди, и элементы не удаляются до тех пор, пока они не получат сигнал от удаленного узла. Из-за этого p2 может вернуть ответ QUEUE_FULL на p1. Когда p1 получает этот ответ, он сохраняет очередь, всякий раз, когда создается новое сообщение, он добавляет его в конец этой очереди, а затем циклически переходит в очередь, отправляя сообщения на p2, пока он снова не получит QUEUE_FULL. Проблема здесь в том, что после того, как очередь p2 пуста/имеет место, она не может уведомить p1 для получения сообщений.
Для каждого экземпляра производителя в p2 существует соответствующий производитель в p1, это важно, когда речь идет о потенциальных решениях ниже.
Одним из решений может быть изменение p2, чтобы уведомить p1, когда в его очереди есть место, однако для этого решения требуется достаточное количество сетевых издержек (http), поскольку в любое время возможно много тысяч очередей p2 необходимо уведомить своих соответствующих производителей p1.
Другим решением может быть то, что p1 можно изменить, чтобы продолжить отправку сообщения на p2. Проблема в том, что у производителя в p1 должен быть поток, который спит x, прежде чем пытаться отправить следующее сообщение, ясно, что может быть один синглтон, который обрабатывает этот механизм сна/повтора, но логика здесь, поскольку производители и потребители увеличиваются до многие тысячи, становится довольно сложным;
- синхронизация на добавление, удаление, производители
- чтение очереди, делая следующий раз прочитать
- соображения для герметичного зацикливания при низком производителе счета
- соображения долго ждать, когда высокий производителя граф
- .. .. и т. д.
Я близок к предложению уровня MQ, где p1 публикует и читает p2. Однако это вводит новую проблему, когда p2 не может уведомить p1, когда удаленный узел уходит, однако это может быть обработано http-обратным вызовом от p2 до p1 - уровень накладных расходов здесь приемлем, поскольку вероятность того, что удаленный узел будет удален низкий.
Я пропустил шаблон дизайна, который бы устранил необходимость в MQ (еще одна услуга, о которой нужно беспокоиться, монитор и т. Д.)? Мысли очень ценились.
Некоторые другие детали: экземпляр производителя
- каждый p1 является запрос областью действия по большей части
- каждый p2 потребитель выделенному выполняющегося потока
Привет, Зак, я согласен с вами в принципе. Добавление MQ очень хорошо на многих уровнях. Моя основная забота о добавлении другой услуги в первую очередь связана с процессами, в которых я работаю, поэтому я хотел, чтобы я рассмотрел все другие варианты, прежде чем приступать к этому. – Mike
Полностью понять, что в этом положении! Удачи! –