Описание архитектуры сервера 'vega_mt_server' (C) 2017 Вега-Абсолют ------------------------------------------------------------------------------- Сервер предназначен для обеспечения канала связи между устройствами, работающими по протоколу VEGA-MT (он же VEGA-TECH, он же VEGA) и различными программами, желающими взаимодействовать с этими устройствами (конфигуратор, программа для закачки файлов на устройства и т.п.). Всё взаимодействие сервера с внешними компьютерами происходит исключительно через соединения TCP/IP (поверх которых работает протокол VEGA-MT). Сервер не поддерживает интерфейс через базу данных (и вообще, никак не сохраняет своё состояние при перезапуске), нет у него и веб-интерфейса. Сервер никак не авторизует клиентов - в связи с особенностями протокола, клиенты сами договариваются между собой об авторизации - в обязанности сервера входит только пропустить информацию туда и обратно. Сервер представляет собой программу под Linux. Существует возможность скомпилировать сервер для запуска под Windows (с использованием Cygwin), но наивысшая производительность обеспечивается только при запуске под Linux. Сервер написан на C++. При разработке сервера использовались библиотеки libevent и boost. Сервер рассчитан на обслуживание большого количества клиентов. Обслуживание клиентов происходит в нескольких нитях. Количество нитей настраивается в файле конфигурации. В каждой нити обслуживается много клиентов (поступающие запросы на установление соединения равномерно распределяются между существующими нитями). Применяются и другие приёмы повышения производительности сервера: минимизация количества системных вызовов, минимизация количества операций выделения/освобождения памяти, исключение перемещения с места на место больших объёмов данных и т.п. Производительность сервера неизвестна, поскольку до сих пор не проводился эксперимент по его пиковой нагрузке, но предполагается, что это десятки тысяч соединений одновременно. Сервер может запускаться как консольная программа или в режиме демона (в зависимости от того, указана ли в его командной строке опция --daemon). При запуске сервер читает свои параметры из файла конфигурации, представляющего собой текстовый файл в кодировке UTF-8. В файле конфигурации указывается большое количество параметров, включая как важные (номер порта сервера), так и второстепенные (величины тайм-аутов и т.п.). Большинство параметров имеют значения по умолчанию (т.е., их можно не указывать если они вам не интересны). В файле конфигурации могут быть комментарии. Вместо документации на формат файла конфигурации с сервером поставляется образцовый файл конфигурации, в котором упомянуты и подробно прокомментированы все известные серверу параметры. Сервер имеет небольшое количество опций командной строки, с помощью которых можно изменить имя файла конфигурации, файла журнала (см. ниже), а также посмотреть справку по опциям командной строки (опция --help, -h, /? и т.п.). Если при работе сервера происходит ошибка, сервер записывает сообщение об ошибке в файл журнала (текстовый файл в формате UTF-8). Запись в файл - трудоёмкая операция и может существенно повлиять на производительность сервера при больших нагрузках. Поэтому, в файле конфигурации можно указать, насколько подробную информацию системный администратор хочет видеть. Существует 4 режима: а) не записывать ничего, что может быть вызвано неполадками у клиента (или злой волей разработчика клиента) б) записывать только сообщения об ошибках в) записывать сообщения об ошибках, к которым, по возможности, прикреплять фрагменты данных, в которых обнаружена ошибка (это значение по умолчанию) г) записывать весь трафик, проходящий через соединения (а также сообщения об ошибках) Поскольку при больших нагрузках выдача подробной информации в файл журнала должна быть отключена, а информацию об ошибках (и вообще, о состоянии программы) надо, тем не менее, как-то получать, сервер подсчитывает количество различных событий и выдаёт накопленную информацию по запросу пользователя. Всего подсчитывается больше сотни разных типов событий. В качестве запроса пользователя выступает команда "stt", набранная в консоли, если сервер работает в консольном режиме или сигнал SIGUSR1 если сервер работает в режиме демона. Сервер работает достаточно стабильно (за всё время работы ни одного зависания).