|
<< Показать Оглавление >> Подключение к Dictation Server |
![]()
|
Описание принципов работы с балансировщиком нагрузки
Серверная часть системы может состоять из нескольких серверов распознавания речи. В этом случае перед подключением к серверу распознавания запросите у балансировщика нагрузки рекомендуемый сервер.
Каждый сервер из числа тех, что входят в систему, периодически отправляет балансировщику нагрузки данные о себе и о нагрузке, которую создают подключённые к нему клиенты. Балансировщик ведёт учёт всех серверов и выявляет менее загруженный сервер для подключения в данный момент (см. рисунок).

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

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

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

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

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

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

Выход из строя балансировщика
2.При выходе из строя балансировщика и при перегрузке сервера запросами клиент будет пробовать подключиться к следующему известному ему серверу (см. рисунок).
Получение адреса Dictation Server от балансировщика
Обращения к балансировщику нагрузки должны быть выполнены посредством REST-запроса. В качестве хоста используется IP-адрес ресурса, на котором развёрнут балансировщик нагрузки. Значение порта — в соответствии с настройками балансировщика. По умолчанию используется порт 39255.
/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 через порты, настроенные администратором.
При работе с одним сервером ответ может содержать строку подключения вида "ConnectionString": "127.0.0.1;34000;39255". В таком случае в качестве адреса следует использовать тот же хост, на который был отправлен REST-запрос. |
По умолчанию у Dictation Server настроены следующие порты:
•для WebSocket (основное подключение): server_name:34000;
•для REST (для вспомогательных запросов): server_name:39255.
Обратите внимание, что администратор может изменить значения портов. |
В любом случае ИС должна обеспечить:
•захват звука
•передачу звука на сервер
•другие операции (например: работа с балансировщиком, логика обработки автозамен)
При подключении по 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 не задано |
|
Для упрощения разработки рекомендуем использовать альтернативный способ связи ИС и Voice2Med — подключение через клиентское приложение Voice2Med Client. |