Вебсокеты
Описание
В приложение добавлены механизмы нотификации об изменениях через websocket.
WS-сервер работает в режиме read-only, т.е. только для получения нотификаций, изменение состояния через websocket невозможно.
Подключение:
URL для соединения:
ws://<controller_ip>/ws/?token=<jwt token>
Пример URL для соединения:
ws://<controller_ip>/ws/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJlbWFpbCI6ImFkbWluQGxvY2FsaG9zdCIsInVzZXJuYW1lIjoiYWRtaW4iLCJleHAiOjE1MTY3MDM3OTl9.daJM1j3bmV6fZ7plq_jYGayIsy9KyZo3gM7pcYteNuw
Возможные ошибки подключения: "jwt token must be send as query param" - проверьте, что передан jwt токен и формат URL правильный.
Структура
Типы сообщений сервера: От ws-сервера может быть получено два типа сообщений: data и control. Сообщения имеют разную структуру.
Структура control сообщения:
{
"resource": "/domains/", // ресурс, к которому имеет отношение это сообщение
"close": false, // если close true, то соединение, через которое получено такое сообщение не может быть больше использовано клиентом, сервер закрывает соединение.
"error": false, // является ли сообщение ошибкой
"msg_type": "control", // тип сообщения, может быть data или control
"msg": "add" // текст сообщения
}
Структура data сообщения:
{
"resource": "/domains/", // ресурс к которому имеет отношение это сообщение
"event": "UPDATED", // тип изменения ресурса, может быть CREATED, UPDATED, DELETED
"msg_type": "data", // тип сообщения, может быть data или control
"id": "252abe60-d266-4d3c-9f00-4d6d1e14b77f", // id ресурса, например задачи или домена
"object": { ... } // сериализованный ресурс, набор полей соответствует GET запросу на данный тип ресурса, сообщения с типом "event": "DELETED" всегда содержат {} в поле object
}
Управление подпиской
После открытия соединения с ws-сервером, клиент не будет получать никакой информации. Сначала необходимо оформить подписки. Перечень подписок можно изменять на протяжении всего времени жизни ws-соединения. Существует два вида подписок: list и entity. Подписка list позволяет подписаться на получения изменения всех сущностей определенного типа, подписка типа entity позволяет получать обновления статуса конкретной сущности.
Добавить list подписку:
add /domains/
Ответ:
{
"resource": "/domains/",
"close": false,
"error": false,
"msg_type": "control",
"msg": "add"
}
list нотификация:
{
"resource": "/domains/",
"event": "UPDATED",
"msg_type": "data",
"id": "252abe60-d266-4d3c-9f00-4d6d1e14b77f",
"object": { ... }
}
Добавить entity подписку:
add /domains/252abe60-d266-4d3c-9f00-4d6d1e14b77f/
Ответ:
{
"resource": "/domains/252abe60-d266-4d3c-9f00-4d6d1e14b77f/",
"close": false,
"error": false,
"msg_type": "control",
"msg": "add"
}
entity нотификация:
{
"resource": "/domains/252abe60-d266-4d3c-9f00-4d6d1e14b77f/",
"event": "UPDATED",
"msg_type": "data",
"id": "252abe60-d266-4d3c-9f00-4d6d1e14b77f",
"object": { ... }
}
Типы подписок
Подписки на list и entity абсолютно независимы. В рамках одного соединения может быть оформлена подписка на /domains/ и /domains/252abe60-d266-4d3c-9f00-4d6d1e14b77f/, тогда при изменении состояния домена с id 252abe60-d266-4d3c-9f00-4d6d1e14b77f будет получена как list, так и entity нотификация.
Удаление подписки
Удалить list подписку:
delete /domains/
Ответ:
{
"resource": "/domains/",
"close": false,
"error": false,
"msg_type": "control",
"msg": "delete"
}
Удалить entity подписку:
delete /domains/252abe60-d266-4d3c-9f00-4d6d1e14b77f/
Ответ:
{
"resource": "/domains/252abe60-d266-4d3c-9f00-4d6d1e14b77f/",
"close": false,
"error": false,
"msg_type": "control",
"msg": "delete"
}
Ошибки
Ошибка подписки 1:
{
"resource": "add foo/bar",
"close": false,
"error": true,
"msg_type": "control",
"msg": "bad request format"
}
Ошибка подписки 2:
{
"resource": "/domains/",
"close": false,
"error": true,
"msg_type": "control",
"msg": "bad permissions"
}
Ошибки токена: Любая ошибка валидации токена приведет к закрытию ws-соединения со стороны сервера.
{
"resource": "",
"close": true, // любая ошибка токена приведет к закрытию соединения сервером
"error": true,
"msg_type": "control",
"msg": "token error: Error decoding signature." // или другое сообщение в формате token error: ...
}
Ограничения
На текущий момент в сервисе явно заданы следующие ограничения:
MAX_CONNECTIONS_PER_USER = 50 - максимальное число ws-соединений под учетной записью одного пользователя.
MAX_ID_SUBSCRIPTION_COUNT = 500 - максимальное число entity подписок на одно соединение.
Проверка статуса сервера через ws-соединение
- Клинт отправляет текстовое сообщение "ping". Если сервер и сеть работают в штатном режиме, то клиент получит ответ "pong".
- Сервер сам отправляет сообщение с периодом в 90с подключенным клиентам. Данный тип проверки связи по-умолчанию выключен. Настройка WEBSOCKETS_HEARTBIT. Пример сообщения:
{
"resource": "",
"close": false,
"error": false,
"msg_type": "ping",
"msg": "ping"
}