Рассмотрим несколько экземпляров веб-сервера, работающих параллельно. Каждый сервер содержит ссылку на один общий "Хранитель состояния", роль которого поддерживает последние запросы N
со всех серверов.
Например (N=3
):
Server a: "Request id = ABCD" Status keeper=["ABCD"]
Server b: "Request id = XYZZ" Status keeper=["ABCD", "XYZZ"]
Server c: "Request id = 1234" Status keeper=["ABCD", "XYZZ", "1234"]
Server b: "Request id = FOO" Status keeper=["XYZZ", "1234", "FOO"]
Server a: "Request id = BAR" Status keeper=["1234", "FOO", "BAR"]
В любой момент времени из приложения мониторинга может вызываться "Хранитель состояния", который читает эти последние N
запросы для отчета SLA.
Какой лучший способ реализовать этот сценарий производителя-потребителя в Java, придавая веб-серверам более высокий приоритет, чем отчет SLA?
CircularFifoBuffer кажется подходящей структурой данных для хранения запросов, но я не уверен, какой оптимальный способ реализовать эффективные concurrency.