1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Bwar-Nebula

Клонировать/Скачать
configuration.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 22:21 646366b

Конфигурационный файл Nebula в формате JSON

Nebula использует конфигурационные файлы в формате JSON, которые отличаются хорошей читаемостью, расширяемостью и удобством обслуживания. Кроме того, они легко управляются через центр удалённого управления.

Выбор формата JSON для конфигурационных файлов также важен, потому что библиотека CJsonObject делает использование JSON таким же удобным, как использование собственных структур данных в C++.

Прежде чем обсуждать конфигурационный файл, необходимо определить несколько понятий:

  • распределённый сервисный кластер (distributed service cluster);
  • узел (node);
  • доступ (access).

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

Проект Nebula предоставляет шаблон для конфигурационного файла. Каждый проект, основанный на Nebula (например, NebulaBeacon, NebulaInterface и т. д.), имеет свой собственный конфигурационный файл. Конфигурационные файлы Nebula можно рассматривать как класс, а конфигурационные файлы конкретных проектов — как объекты этого класса. Если вы разрабатываете новый сервер на основе Nebula, вы можете создать собственный конфигурационный файл для этого сервера.

Пример конфигурационного файла:

{
    "//node_type": "Тип узла: ACCESS, LOGIC, PROXY, CENTER и т.д., определяется бизнес-уровнем",
    "node_type": "ACCESS",
    "//host": "IP-адрес для внутренней связи между серверами (Server to Server)",
    "host": "192.168.18.81",
    "//port": "Порт для внутренней связи между серверами",
    "port": 9987,
    "//access_host": "Внешний IP-адрес для предоставления услуг (Client to Server), не требуется, если услуги не предоставляются",
    "access_host": "192.168.18.81",
    "//access_port": "Порт для предоставления внешних услуг",
    "access_port": 9988,
    "//access_codec": "Кодек для доступа, в настоящее время поддерживает CODEC_PRIVATE(4),CODEC_HTTP(3),CODEC_PROTOBUF(2)",
    "access_codec": 4,
    "gateway": "113.102.157.188",
    "gateway_port": 9988,
    "//server_name": "Асинхронный событийно-управляемый сервер",
    "server_name": "AsyncServer",
    "//worker_num": "Количество процессов",
    "worker_num": 10,
    "//worker_capacity": "Максимальная рабочая нагрузка для дочерних процессов",
    "worker_capacity": 1000000,
    "//cpu_affinity":"Привязка процессора (привязка процессора)",
    "cpu_affinity":false,
    "//config_path": "Путь к файлу конфигурации (относительный путь)",
    "config_path": "conf/",
    "//log_path": "Путь к файлам журнала (относительный путь)",
    "log_path": "log/",
    "//max_log_file_num": "Максимальное количество файлов журнала для ротации",
    "max_log_file_num": 5,
    "//max_log_file_size": "Ограничение размера отдельного файла журнала",
    "max_log_file_size": 20480000,
    "always_flush_log":true,
    "log_levels": { "FATAL": 0, "CRITICAL": 1, "ERROR": 2, "NOTICE": 3, "WARNING": 4, "INFO": 5, "DEBUG": 6, "TRACE": 7 },
    "log_level": 7,
    "net_log_level": 6,
    "//permission": "Ограничения. addr_permit ограничивает количество подключений от одного IP за период времени; uin_permit ограничивает количество сообщений, отправляемых каждым пользователем за единицу времени.",
    "permission": {
        "addr_permit": { "stat_interval": 60.0, "permit_num": 1000000000 },
        "uin_permit": { "stat_interval": 60.0, "permit_num": 600000000 }
    },
    "//connection_protection": "Время защиты соединения (в секундах), устанавливается равным этому значению при создании нового соединения, изменяется на io_timeout после получения первого пакета данных",
    "connection_protection": 0.0,
    "//io_timeout": "Тайм-аут сетевого ввода-вывода (соединения) (в секундах) с точностью до одной цифры после десятичной точки",
    "io_timeout": 300.0,
    "//step_timeout": "Тайм-аут шага (в секундах) с точностью до одной цифры после десятичной точки",
    "step_timeout": 1.5,
    "boot_load": {
        "cmd": [
            "//step_timeout": "Тайм-аут шага (в секундах) с точностью до одной цифры после десятичной точки",
            "step_timeout": 1.5,
            "log_levels": { "FATAL": 0, "CRITICAL": 1, "ERROR": 2, "NOTICE": 3, "WARNING": 4, "INFO": 5, "DEBUG": 6, "TRACE": 7 },
            "log_level": 7,
            "net_log_level": 6,
            "//with_ssl": "Конфигурация SSL (может быть пустой), путь относительно ${WorkPath}, файлы открытого ключа и закрытого ключа в формате PEM",
            "with_ssl": {
                "config_path": "conf/ssl",
                "cert_file": "20180623143147.pem",
                "key_file": "20180623143147.key"
            },
            "//data_report": "Интервал времени для отправки данных, данные не отправляются, когда нет статистики",
            "data_report": 60,
            "//refresh_interval": "Интервал обновления конфигурации сервера, проверка и загрузка плагинов динамических библиотек (период времени зависит от загруженности сервера)",
            "refresh_interval": 60,
            "load_config":{
                "manager":{
                },
                "worker":{
                    "boot_load": {
                        "cmd": [
                            { "cmd": 1001, "class": "neb::CmdHello" },
                            { "cmd": 1003, "class": "neb::CmdDbAgent" }
                        ],
                        "module": [
                            { "path": "neb/switch", "class": "neb::ModuleSwitch" },
                            { "path": "neb/hello", "class": "neb::ModuleHello" }
                        ]
                    }
                }
            }
        }
    }
}

В этом примере конфигурационного файла представлены различные параметры, такие как тип узла, IP-адреса, порты, настройки безопасности и другие параметры конфигурации. Worker процессы, каждый узел состоит из одного Manager процесса и нескольких Worker процессов. Обычно, если на машине развёрнут только один сервис Nebula и он используется в основном для этого сервиса, то для более эффективного использования ресурсов машины worker_num настраивают равным количеству ядер процессора.

  • with_loader: запускать ли процесс Loader. Процесс Loader используется для локального хранения данных, большинство приложений с интенсивным использованием ввода-вывода не используют его, поэтому по умолчанию он не запускается.
  • worker_capacity: ёмкость процесса, используется для защиты от перегрузки. Нагрузка на процесс = количество каналов * коэффициент + количество шагов * коэффициент. Эта формула расчёта будет корректироваться в соответствии с потребностями и целесообразностью. Когда нагрузка на процесс достигает предела ёмкости, новые подключения будут отклонены.
  • cpu_affinity: привязка к процессору, если установлено значение true, процессы Worker равномерно привязываются к ядрам процессора. По умолчанию — false, без привязки.
  • config_path: путь к файлу конфигурации, относительно пути NEBULA_HOME.
  • log_path: путь к файлам журнала, относительно пути NEBULA_HOME.
  • max_log_file_num: максимальное количество файлов журнала, используется для ротации журналов, файлы журналов сверх этого количества будут удалены напрямую.
  • max_log_file_size: ограничение размера отдельного файла журнала, используется для ротации журнала, создания нового файла журнала при превышении ограничения.
  • always_flush_log: всегда ли обновлять журнал до диска.
  • log_levels: уровни журнала, используются только для справки при настройке log_level и net_log_level.
  • log_level: уровень локального файла журнала. Уровень отладки фреймворка использует LOG4_TRACE (большой объём журнала, не рекомендуется включать уровень журнала TRACE при развёртывании в производственной среде), рекомендуется использовать уровень DEBUG для отладки бизнеса.
  • net_log_level: сетевой уровень журнала, который отслеживается службой LOGTRACE.
  • permission: ограничение частоты соединений или отправки сообщений. addr_permit — ограничение на количество подключений каждого IP-адреса в течение статистического времени, подключения сверх permit_num будут отклонены напрямую; uin_permit — ограничение количества сообщений, отправляемых каждым пользователем в течение единицы статистического времени, сообщения сверх permit_num будут отброшены напрямую. Пересчитывается после достижения интервала статистики.
  • connection_protection: время защиты соединения (единица измерения: секунды), когда значение > 0, новое соединение устанавливается на это время, после получения первого пакета данных оно устанавливается как io_timeout.
  • io_timeout: тайм-аут сетевого ввода-вывода (соединения) (единица измерения: секунды) с точностью до одной цифры после десятичной точки, используется для проверки действительности соединения. Если данные были отправлены или получены до достижения тайм-аута, отсчёт начинается заново с момента последнего получения или отправки данных; если тайм-аут достигнут, но данные не были отправлены или получены, есть три варианта обработки: (1) необходимо выполнить проверку сердцебиения на прикладном уровне, автоматически отправить пакет сердцебиения, получить ответный пакет, сохранить соединение и пересчитать тайм-аут; (2) необходимо выполнить проверку сердцебиения на прикладном уровне, автоматически отправить пакет сердцебиения, не получить ответного пакета, немедленно разорвать соединение, освободить ресурсы, выделенные соединением; (3) проверка сердцебиения на прикладном уровне не требуется, немедленно разорвать соединение, освободить ресурсы, выделенные соединением.
  • step_timeout: время ожидания шага (единица измерения: секунды) с точностью до одной цифры после десятичной точки, используемое для ожидания ответа по умолчанию после отправки запроса. В коде можно установить время ожидания для каждого отправленного запроса, обычно это последний параметр класса Step, если этот параметр имеет значение по умолчанию, то step_timeout в файле конфигурации будет использоваться в качестве времени ожидания ответа после отправки запроса классом Step.
  • with_ssl: требуется ли SSL-шифрование для внешних подключений к сервису, если да, то настройте путь и имя файла конфигурации ssl.
  • data_report: интервал времени между отчётами о статистике, без статистики данные не отправляются.
  • refresh_interval: обновить конфигурацию сервера, проверить, загрузить конфигурацию или загрузить и выгрузить плагин динамической библиотеки, интервал времени цикла.
  • load_config: загрузка функционального модуля. Функциональные модули включают процессы Manager, Worker и Loader, которые загружаются в соответствующие типы процессов.
  • boot_load: точка входа в обработку модуля загрузки службы. Nebula framework компилируется в динамическую библиотеку libnebula.so, сервер на основе Nebula framework должен написать основную функцию и скомпилировать её в исполняемый файл, например NebulaBeacon, а также некоторые модули, которые не требуют динамической загрузки, будут скомпилированы и связаны с этим исполняемым файлом, эти модули являются неизвестными для Nebula framework (libnebula.so существует до любого сервера исполняемых файлов), boot_load — это точка входа для загрузки этих модулей. Описание конфигурации динамической загрузки в boot_load см. ниже. Пользовательская конфигурация — это конфигурация, которая требуется бизнес-уровню. Обычно она определяется независимо и хранится в файле конфигурации в папке conf.

В данном случае под пользовательской конфигурацией понимается не конфигурация, определённая независимо для бизнес-целей, а конфигурация, встроенная в файл конфигурации фреймворка Nebula в виде JSON с ключом «custom».

Преимущество такой конфигурации заключается в том, что все классы бизнес-кода являются производными от класса Actor. Если пользовательская конфигурация встроена в файл конфигурации фреймворка, то для получения содержимого конфигурации достаточно вызвать метод GetCustomConf(). Этот метод является методом класса Actor и позволяет считывать конфигурацию так же легко, как обращаться к членам класса.

Хотя встраивание пользовательской конфигурации в файл конфигурации Nebula очень удобно, этим не следует злоупотреблять. Помещение всей конфигурации в этот файл может привести к его значительному увеличению, что ухудшит читаемость и удобство сопровождения.

Рекомендуется помещать в файл конфигурации только те настройки, которые используются многими бизнес-функциями или применяются очень часто. Остальные настройки, используемые лишь несколькими модулями или применяемые редко, либо имеющие большой объём, следует вынести в отдельные файлы пользовательских настроек. Конфигурацию в формате, отличном от JSON, также следует выносить в отдельный файл.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Bwar-Nebula.git
git@api.gitlife.ru:oschina-mirror/Bwar-Nebula.git
oschina-mirror
Bwar-Nebula
Bwar-Nebula
master