мое приложение работает как промежуточное ПО, получая запросы от клиентов, затем преобразовывая его в определенной логике и отправляя преобразованные запросы другому поставщику услуг в виде обычных HTTP-запросов или мыльных запросов Webservice. Приложение было развернуто на двух серверах jboss (в кластере) за балансировщиком нагрузки.
скажем, мое приложение А, поставщик услуг S.
Теперь мне сообщили, что каждый год S будет снижаться несколько (3-5) раз. Каждый простой будет длиться около 4 часов. Я могу получить график о времени простоя.
Во время простоя A не должен больше преобразовывать и отправлять запрос S, а помещать полученные запросы в очередь. После возвращения S запросы в очереди должны быть обработаны.
Примечание:
Полученные запросы должны обрабатываться в точном порядке по мере их поступления. Один за другим. Обработка запроса означает отправку преобразованных запросов в S и получение ответа или успеха. обычно это не займет много времени.
На основании 1, когда A работает с запросами в очереди, новые входящие запросы должны ставиться в очередь, хотя S уже доступен. пока очередь не пуста, A может продолжить отправку запроса непосредственно в S.
Каждую минуту А получает 2-3 запроса.
Поскольку у нас есть два Jboss, я планировал поддерживать эту очередь в базе данных, потоки, работающие в очереди и управляющие состоянием простоя. Однако синхронизация между двумя jboss всегда вызывает у меня головную боль.
Вскоре проблемы, с которыми я столкнулся, были:
как установить флаг времени простоя, чтобы два jboss выполняли запрос вместо отправки. (Я думал, что перед обработкой каждого запроса база данных запрашивала этот флаг. Флаг был установлен потоком. Возможно, это худшее решение.)
после возвращения S, как спроектировать операцию Dequeue для двух jboss. (кажется, что в то же время всегда есть один jboss бездействует ...)
как сообщить двум jboss: «теперь очередь пуста, больше не ставьте в очередь».
Логика немного сложна. Надеюсь, я четко объяснил свою проблему ...
Ребята, у вас есть идеи по этому поводу?
Еще немного описания о ФИФО.
Если не было простоев, A может обрабатывать эти запросы от разных клиентов параллельно. Потому что этот «понравившийся транзакции» заказ обеспечивается клиентами. например.
client x :
-send http://..../createUser...
-received 'success' from A
-send http://../updateUser...
-received 'success' from A
если createUser () не удалось, updateUser не будет отправлен.
client y:
-send http://.. createCompany...
Учитывая, что другой клиент (y) отправлял запрос createCompany одновременно с x.createUser. эти два запроса могут обрабатываться A параллельно.
Однажды подумав о времени простоя и очереди:
-send http://..../createUser...
(downtime)
-received 'enqueue'
(S is back)
-send http://../updateUser...
теперь порядок "create-> update" должен обеспечивать A, а не клиенты.
Заранее спасибо!
Kent