Синхронизация (часов) между двумя удаленными компьютерами

import org.hidetake.gradle.swagger.generator.GenerateSwaggerCode

// plugins, repositories are same, but note import above ^^^

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation ("io.swagger:swagger-annotations:1.5.21")
    "swaggerCodegen"("io.swagger:swagger-codegen-cli:2.3.1") // 1

    // Use JUnit test framework
    testImplementation ("junit:junit:4.12")
}

swaggerSources {
    create("petstore").apply { // 2
        setInputFile(file("petstore.yaml")) // 3
        code(closureOf<GenerateSwaggerCode> { // 4
            language = "spring"
        })
    }
}

1 - динамически разрешенная конфигурация в Kotlin выглядит следующим образом (динамически из Groovy, поэтому использовать ее во время компиляции проблематично, оператор вызова расширения для String - наш спаситель);

2 - swaggerSources возвращает вас NamedDomainObjectContainer<SwaggerSource>, поэтому для добавления нового контейнера мы вызываем create с его именем в качестве параметра;

3 - Kotlin не так гибок, как Groovy, поэтому вызывает setter вместо поля установки; [ 117]

4 - Закрытие Groovy далеко от функционального интерфейса, поэтому мы указываем универсальный тип, так как в источниках плагина Closure нет параметризации.

15
задан devios1 23 December 2008 в 17:07
поделиться

7 ответов

При доверии NTP для приложения, поскольку другие рекомендовали, легкая выдумка. Корректный подход должен использовать распределенный алгоритм тактовой синхронизации Lamport. Это объяснено в его классическое бумажное Время 1978 года, часы и упорядочивание событий в распределенной системе.

18
ответ дан 1 December 2019 в 00:50
поделиться

Взгляд на "Протокол сетевого времени" (NTP) спецификация.

8
ответ дан 1 December 2019 в 00:50
поделиться

Вместо написания кода для синхронизации часов разве не было бы возможно просто выполнить клиента NTP на обеих машинах?

С другой стороны, если бы вышеупомянутое не возможно, и Ваше приложение работает с необходимыми полномочиями для установки времени, я испытал бы желание реализовать минимального клиента NTP прямо в приложении и попытке синхронизировать его против общедоступного сервера. Просто не делайте hardcode чей-то частный сервер в...

3
ответ дан 1 December 2019 в 00:50
поделиться

Синхронизируйте их с Протоколом сетевого времени NTP.

На какой платформе Вы?

С NTP можно синхронизировать время компьютеров с атомными часами и использовать официальное время мира.

3
ответ дан 1 December 2019 в 00:50
поделиться

Одна вещь, которую мы делаем, по существу разгружают все операции синхронизации к машине 'хоста'. Например, если у Вас есть 20 серверов, что вся доля DB, используйте время DB. Если у Вас есть центральный сервер и миллион клиентских машин, то клиентские машины не должны быть ответственны за синхронизацию ничего; сделайте всю свою серверную сторону синхронизации. В действительно 'распределенной' среде, как сеть P2P или что-то, используют машину, которая наиболее непосредственно 'владеет' рассматриваемым ресурсом (фактический ПК файл, который Вы хотите записать) к syncronize/control доступу к файлу.

2
ответ дан 1 December 2019 в 00:50
поделиться

любая сетевая машина должна использовать NTP. все современные системы включают простой способ установить это. единственная проблема должна выбирать определенный сервер при необходимости в небольшой дополнительной точности; но это уже находится в диапазоне миллисекунды, таким образом, я не забочусь и обычно просто указываю на pool.ntp.org

0
ответ дан 1 December 2019 в 00:50
поделиться

Это проблема, которую мне сейчас нужно решить в отношении неискушенных конечных пользователей, которые могут многое сделать, чтобы опровергнуть разумные предложения, сделанные предыдущими участниками. Неискушенный конечный пользователь может сделать, по крайней мере, эти вещи и многое другое:

1) Недостаточно компьютерных знаний, чтобы иметь возможность настроить синхронизацию времени ntp

2) Установить часы своего компьютера на домашние часы или мобильные часы телефона некорректны

3) В Windows XP случайно отключили синхронизацию времени ntp и не знали, как ее снова включить, или дата на компьютере установлена ​​неправильно, в этом случае NTP в Windows не работает

4) аккумулятор компьютера bios разряжен, поэтому компьютер всегда запускается в 1970 году!

5) Пользователь берет свой ноутбук за границу и временно устанавливает часы ноутбука на местное время, но не меняет часовой пояс, Итак, теперь компьютер будет возвращать неверное время utc !!!

Таким образом, ваша программа сама должна будет управлять временем, и, конечно же, вы хотите делать это с минимальными накладными расходами.

Предположим, два конечных пользователя запускают ваш программам нужны программы, чтобы делать что-то в одно и то же время в будущем.

Я предлагаю эту схему, которая берет некоторые идеи из того, как работают задания cron, я был бы рад, если бы кто-нибудь мог предложить улучшения этой идеи.

1) Когда ваше приложение запускается, оно синхронизирует свое внутреннее время utc с ntp через мыльный вызов стороннего сервера или вашего собственного сервера времени (который вы сами можете вовремя использовать с помощью ntp).

2) После этого он добавляет истекшее время по системным часам для поддержания времени. Если требования жесткие, вам может потребоваться повторять синхронизацию ntp через определенные промежутки времени.

3) Затем приложение просматривает список будущих работ, которые ему необходимо выполнить вовремя. Ему необходимо знать самое раннее задание.

4) Затем он создает поток, который переводит в спящий режим на время до самого раннего задания, за вычетом запаса прочности, который в зависимости от ваших требований может составлять 10 минут вперед. , за час или два вперед и т. д.

5) Когда поток просыпается, он повторно проверяет абсолютное время с помощью следующего вызова мыла, а затем полагается на часы системного времени для добавления прошедшего времени, пока не достигнет времени, когда первое задание должно быть выполнено.

6) Как только задание запускается (запускается в другом потоке), поток мониторинга времени вычисляет время следующего задания и снова переводит себя в спящий режим на это время.

Усовершенствования идеи:

1) Пользователь может закрыть ваше приложение до выполнения задания, поэтому вам может потребоваться фоновый процесс или служба, использующая ту же схему синхронизации, указанную выше, для независимого мониторинга списков заданий, хранящихся в базе данных или файле, и своевременного запуска приложения. (В Windows запускайте процесс приложения)

2) Ваше приложение может добавлять новые, более ранние задания на лету или удалять задания, поэтому ваш спящий поток, вероятно, должен быть активен для пересчета для нового более раннего задания, или для работы, следующей за удаленной работой. В Win32 вы бы сделали это, ожидая своего потока с тайм-аутом для события, которое вы установили, чтобы заставить его пересчитать время сна. В Linux, несомненно, есть аналогичный механизм.

3) Для вызова Soap, чтобы узнать время, запишите, когда Soap отправлено и когда получен ответ. Если время выполнения заказа слишком велико, вы не можете полагаться на время и, возможно, вам придется повторить звонок, или вы можете пойти на компромисс. Например, если Soap сообщает, что часы компьютера отстают на 5 минут, но ответ на вызов Soap занял минуту, то вы можете с уверенностью сказать, что часы компьютера отстают как минимум на 4 минуты.

3
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: