Я пишу сервис, который (помимо прочего) должен отслеживать доступность ряда узлов. Чтобы проверить, является ли узел живым или нет, я отправляю пакет PING на узел каждые T
секунд, и если узел не отвечает PONG в течение этого интервала времени T
, узел помечается как отключенный .
Итак, я пришел к этому простому l oop (некоторые детали опущены для краткости):
def start(disconnect_cb):
while True:
nodes = list(tracked_nodes_dict)
for node in nodes:
if node in received_pong:
send_ping(node)
else:
disconnect_cb(node)
delay = T / len(nodes)
time.sleep(delay)
Проблема : число узлов может значительно изменяться на каждой итерации l oop, потенциально оно может измениться с 1 узла на более 5000 или упасть другим способом. Хотя мой подход гарантирует, что каждый узел обрабатывается в T
, время между эхо-запросами для определенного узла не будет постоянным. Например, легко показать, что в случае, когда число узлов быстро увеличивается, это время может увеличиться до 2T
.
Теперь я нахожу это совершенно нормально, что время между пингами не является постоянным, но все же я хочу иметь некоторый контроль над пределами его изменения. Я хотел бы иметь алгоритм, который позволял бы удерживать такие колебания в пределах заранее определенных границ.
Основываясь на том факте, что описанный подход очень прост и интуитивно понятен, я предполагаю, что проблема хорошо известна. До сих пор я не могу найти никаких ссылок об этом в Интернете. В случае, если я ошибаюсь, и это вообще не жизнеспособное решение, я хотел бы узнать о лучших практиках.
Спасибо!