Подключение к Dictation Server

<< Показать Оглавление >>

Прямое подключение к серверу      

Подключение к Dictation Server

Описание принципов работы с балансировщиком нагрузки

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

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

Balancer.GetServerData

Сбор балансировщиком данных о состоянии серверов системы

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

Balancer.ClientRequest

Запрос клиентом рекомендованного сервера для подключения

Клиент подключается к рекомендованному серверу (см. рисунок).

Balancer.Client2Server

Подключение клиента к рекомендованному серверу

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

Balancer.ClientDisconnect

Отключение клиента

В приложении Voice2Med Client реализуется следующая логика работы:

•При первом подключении к серверу приложение получает и сохраняет ответ балансировщика (см. рисунок).

•Если сервер разорвал соединение, а сохранённый ответ балансировщика не устарел (время жизни регулируется настройками, по умолчанию равно 10 минутам), то клиентское приложение пробует подключиться к следующему наименее загруженному серверу в порядке возрастания EstimatedLoadLevel (см. рисунок). Сервер может отвергать подключение клиента, если на момент подключения максимальное возможное количество подключенных клиентов перешло в режим распознавания из режима отключенного распознавания или если большое количество клиентов подключилось к серверу, используя сохранённые ответы балансировщика, полученные ранее.

Balancer.ClientReconnectOld

Подключение клиента к свободному серверу без получения рекомендованного сервера

•Если ответ от балансировщика устарел, то клиентское приложение снова запрашивает у балансировщика список серверов с рекомендованным, и подключается к нему (см. рисунок).

Balancer.ClientReconnectNew

Подключение клиента к свободному серверу после получения у балансировщика рекомендованного сервера

atten_red

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

info

Балансировщик не проксирует через себя никакой трафик.

После получения адреса рекомендованного сервера и списка серверов клиент работает с ними напрямую.

Такой подход позволяет исключить влияние надёжности балансировщика на систему:

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

BalancerKilled.Client2Server

Выход из строя балансировщика

2.При выходе из строя балансировщика и при перегрузке сервера запросами клиент будет пробовать подключиться к следующему известному ему серверу (см. рисунок).

Получение адреса Dictation Server от балансировщика

Обращения к балансировщику нагрузки должны быть выполнены посредством REST-запроса. В качестве хоста используется IP-адрес ресурса, на котором развёрнут балансировщик нагрузки. Значение порта — в соответствии с настройками балансировщика. По умолчанию используется порт 39255.

post

/api/servers

Назначение

Получение сведений о серверах, подключённых к балансировщику нагрузки, и их свойствах.

Параметры запроса

Параметр

Тип

Примечание

clientId

String

Идентификатор клиента, который соответствует DESKTOP_ID. Этот идентификатор генерируется клиентом один раз при первом запуске приложения, и должен быть уникален для каждого рабочего места.

Если параметр не передан, то ответ не содержит рекомендованный для подключения сервер (блок RecommendedServer), а содержит лишь полный список серверов (блок ServerList).

Пример:

http://<IP хоста с балансировщиком>:39255/api/servers

Поля ответа

Поле

Тип

Примечание

TimeStamp

DateTime

Текущее время на балансировщике нагрузки

RecommendedServer

ServerInfo

Рекомендуемый к использованию сервер

ServerList

Список ServerInfo

Список серверов, подключённых к балансировщику нагрузки

Класс ServerInfo имеет следующие поля:

Поле

Тип

Примечание

ServerId

String

Уникальный идентификатор сервера

ConnectionString

String

Строка для подключения к серверу формата <адрес сервера>;<WebSocket порт>;<Rest порт>

CanAcceptClient

Boolean

Может ли сервер принять ещё одного клиента

EstimatedLoadLevel

Decimal

Предполагаемая загруженность сервера с учётом клиентов, недавно запросивших список серверов

DeclaredLoadLevel

Decimal

Заявленная загруженность сервера активными клиентами

LastUpdateDate

DateTime

Время последнего обновления данных о сервере на балансировщике нагрузки

LoadPerClient

Decimal

Загруженность сервера одним клиентом

Пример:

{
    "Data": {
        "Authority": null,
        "TimeStamp": "2023-01-17T09:26:06.0673989Z",
        "RecommendedServer": {
            "ServerId": "9fb6fd20-8343-4f20-a2cc-e50ae167444d",
            "ConnectionString": "dsrv-314;34000;39255",
            "CanAcceptClient": true,
            "EstimatedLoadLevel": 0.0,
            "DeclaredLoadLevel": 0.0,
            "LastUpdateDate": "2023-01-17T09:25:13.5108681Z",
            "LoadPerClient": 0.125
        },
        "ServerList": [
            {
                "ServerId": "9fb6fd20-8343-4f20-a2cc-e50ae167444d",
                "ConnectionString": "dsrv-314;34000;39255",
                "CanAcceptClient": true,
                "EstimatedLoadLevel": 0.0,
                "DeclaredLoadLevel": 0.0,
                "LastUpdateDate": "2023-01-17T09:25:13.5108681Z",
                "LoadPerClient": 0.125
            },
            {
                "ServerId": "5af5b482-87fa-4ea4-acaf-330c2b2fd144",
                "ConnectionString": "dsrv-333;34000;39255",
                "CanAcceptClient": true,
                "EstimatedLoadLevel": 0.1,
                "DeclaredLoadLevel": 0.0,
                "LastUpdateDate": "2023-01-17T09:26:00.0494181Z",
                "LoadPerClient": 0.1
            }
        ]
    },
    "Error": null
}

Подключение к Dictation Server

Подключение внешней ИС должно производиться к Dictation Server, рекомендованный балансировщиком нагрузки с параметрами, содержащимися в поле ConnectionString. При односерверной схеме работы балансировщик нагрузки может не использоваться; тогда подключение должно производиться напрямую к Dictation Server через порты, настроенные администратором.

info

При работе с одним сервером ответ может содержать строку подключения вида "ConnectionString": "127.0.0.1;34000;39255". В таком случае в качестве адреса следует использовать тот же хост, на который был отправлен REST-запрос.

По умолчанию у Dictation Server настроены следующие порты:

•для WebSocket (основное подключение): server_name:34000;

•для REST (для вспомогательных запросов): server_name:39255.

atten_red

Обратите внимание, что администратор может изменить значения портов.

В любом случае ИС должна обеспечить:

•захват звука

•передачу звука на сервер

•другие операции (например: работа с балансировщиком, логика обработки автозамен)

При подключении по WebSocket необходимо в Cookies или в параметрах запроса (например, ws://dictation-server-1:34000?DESKTOP_ID=e64b131a-4bd2-4bcb-835a-e1408d32fbe3&CLIENT_APP_NAME=Многопользовательская информационная система MUSSY&MIS_TYPE=MUSSY&MIS_ID=MUSSY-1&MIS_VERSION=1.0&MIS_USER=Ivanov&…) передавать данные об ИС (см. таблицу ниже). Из них обязательным является только DESKTOP_ID, остальные настраиваются в зависимости от того, какие данные требуется регистрировать в статистике. Если параметр не указан, вместо него передается пустая строка.

Ключ

Название параметра в cookies

Значение

Пример

ClientId

DESKTOP_ID

Обязательный параметр. Идентификатор клиентского приложения.

7c412cd9-3cc2-4662-bd6e-447a9b55edab

AppName

CLIENT_APP_NAME

Имя клиентского приложения

Voice2Med Client (Windows)

Os

ENVIRONMENT

Версия операционной системы

Windows 10 (Win32), Linux (Linux x86_64)

HostName

HOSTNAME

Имя устройства с клиентом

 

Account

ACCOUNT

Название учетной записи в ОС

 

AccountUserName

USER_NAME

ФИО пользователя учетной записи в ОС

 

UserId

MIS_USER

Идентификатор учетной записи пользователя МИС. Дублирует значение ClientId, если UserId не задано

 

atten_yell

Для упрощения разработки рекомендуем использовать альтернативный способ связи ИС и Voice2Med — подключение через клиентское приложение Voice2Med Client.