                 Описание архитектуры сервера '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 если сервер работает в режиме демона. 

Сервер работает достаточно стабильно (за всё время работы ни одного зависания).
