У меня есть некоторые процессы Java (программы Socket), работающие на разных серверах, некоторые в одной сети, а некоторые в разных сетях. Вместе эти процессы поддерживают глобальный счетчик. Клиент может подключиться к любому из этих процессов и выдать команду на increase
, decrease
или get
значение счетчика. В конечном итоге глобальный счетчик должен быть согласованным (может произойти раздел сети, и мы сможем восстановиться после него).
Решение, о котором я думал до сих пор, заключается в подсчете приращений и уменьшений на каждом узле для всех узлов. Когда на узле выдается команда увеличения, он увеличивает свою собственную локальную копию своих счетчиков приращений, а затем широковещательно передает свои счетчики приращения и уменьшения. Узлы, которые получают эту широковещательную рассылку, берут максимальное количество полученных счетчиков и свою локальную копию счетчиков отправителя и сохраняют результат как последний счетчик. Когда команда get
выдается на любом узле, она дает разницу сумм всех приращений и уменьшений. Я предполагаю, что это позаботится о случаях, когда широковещательные передачи принимаются не по порядку и других ненадежных случаях. Я не хочу использовать какой-либо слой сохранения.
Есть ли лучший способ реализовать это? Какой протокол я должен использовать для трансляции счетчиков? Будут ли работать сплетни на UDP? Любые библиотеки Java, которые могут помочь?