Я могу придумать несколько возможных решений, в зависимости от вашего сценария.
Самое простое решение - не хранить вашу конфигурацию в памяти и в файлах вообще, просто сохраните конфигурацию непосредственно в хранилище consul kv. И я не говорю об одном ключе, который отображается на весь json (я предполагаю, что ваш json большой, иначе вы бы его не заархивировали), а о извлечении меньших наборов ключей / значений из json (таким образом вам не нужно будет вытаскивать все это каждый раз, когда вы делаете запрос консулу). Если вы получаете конфигурацию напрямую от consul, ваша согласованность гарантирует соответствие консистентности . Я предполагаю, что вы беспокоитесь о производительности, если потеряете конфигурацию в памяти, это то, что вам нужно измерить. Однако если вы можете смириться с потерей производительности, это избавит вас от многих проблем.
Если производительность здесь является проблемой, можно использовать fsconsul . При этом вы все равно извлечете свой json в несколько наборов ключей / значений в consul, а затем fsconsul сопоставит это с файлами для ваших приложений.
Если это не указано в таблице, тогда вопрос в том, как вы готовы мириться с множеством несоответствий. Если вы можете выдержать несколько секунд несоответствий, лучше всего поставить TTL (время жизни) в конфигурацию в памяти. У вас по-прежнему будут часы на consul, но вы объедините их с удалением кеша в памяти каждые несколько секунд в качестве запасного варианта на случай, если часы по какой-то причине выйдут из строя (или остановятся). Это должно дать вам в худшем случае несколько несоответствий (в зависимости от значения, которое вы установили для своего TTL), но в обычном случае (я думаю) должно быть быстро.
Если это неприемлемо (загрузка zip-архива выполняется много времени, может быть?), вы можете go по указанному вами маршруту. Чтобы обновить значение атомарно, вы можете использовать их операцию cas (check-and-set) . Вы получите сообщение об ошибке, если обновление произошло в период между отправкой запроса и попыткой его применения консулом. Затем вам нужно вытащить список машин, снова применить ваши изменения и повторить попытку (пока не получится).
Я не понимаю, зачем вам нужны 2 каталога, но, возможно, я неправильно понимаю вопрос: Когда ваше приложение запускается, прежде чем делать что-либо еще, вы проверяете, есть ли новая конфигурация, и если она есть, вы загружаете ее и загружаете в память. Так что у вас не должно быть «конфигурации по умолчанию», если вы хотите быть последовательными. После того, как вы загрузили конфигурацию при запуске, все готово. Когда ваши часы сигнализируют об изменении ключа, вы можете загрузить конфигурацию, чтобы напрямую заменить старую конфигурацию. Предполагается, что вы запускаете код, запускаемый часами, в одном потоке, поэтому вы не собираетесь загружать файл несколько раз параллельно. Если загрузка не удалась, вы не собираетесь загружать поврежденный файл в свою память. И если у вас произошел сбой во время загрузки, вы загрузите снова при запуске, так что все будет в порядке.