'quota' capability для WebSocket API

Обзор

Предоставляет интерфейс для доступа по квотам. Не требует настройки (указания в списке capabilities запроса 'setup').

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

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

В любой момент подключение может отказаться от квоты - от ожидания, или от использования после выделения.

Подключение может запросить несколько различных квот с разными ключами, и только одну квоту по конкретному ключу единовременно.

Запрос квоты

Пример запроса квоты:
[
  "quota_request",
  {
    "qid":"16066361-dfc0-49f6-b734-9b3dda09db22",
    "key": "abc",
    "timeout": 30,
    "expires": 10
  }
]

Обязательные поля запроса:

  • key - код существующей группы доступа по квотам.

Специфические поля запроса:

  • timeout - время ожидания квоты в секундах. Если не указано, то используется время из настройки группы, или, если там тоже нет, то значение по умолчанию - 60 секунд.

  • expires - время предоставления квоты, после истечения которого, квота будет предоставлена другим запрашивающим её подключениям.

Варианты ответов

Ответ о неудаче бывает в одном из следующих случаев:

  • Сервис недоступен.

  • Ключ не найден в настройках мастер-домена.

  • Операция выделения указанной квоты уже активна для подключения.

Пример неудачного ответа
[
  "quota_request_result",
  {
    "qid":"16066361-dfc0-49f6-b734-9b3dda09db22",
    "success":false,
    "result":"error",
    "errormsg":"Quota group not found",
    "error_code":1501,
    "error_message":"Quota group not found"
  }
]

В случае успешного размещения в очереди ожидания возвращается удачный ответ

Пример удачного ответа:
[
  "quota_request_result",
  {
    "qid":"16066361-dfc0-49f6-b734-9b3dda09db22",
    "result":"ok"
  }
]

События от сервера

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

  • quota_passed - квота выдана.

  • quota_timeout - за установленное время квота не выдана. Запрос прерывается. При необходимости подключение может либо приступить к выполнению работы по квоте, либо разместить повторный запрос.

  • quota_error - произошел сбой в работе микросервисов. Запрос прерывается. При необходимости подключение может либо приступить к выполнению работы по квоте, либо разместить повторный запрос.

Пример удачного события:
[
  "quota_passed",
  {
    "key":"abc"
  }
]
Пример неудачного события:
[
  "quota_timeout",
  {
    "key":"abc"
  }
]

После удачной выдачи квоты ожидается, что подключение после выполнения работы по квоте закроет ее, отправив запрос 'quota_release'. При этом если этого не произойдет за установленный параметром 'expires' интервал времени, то в подключение сервер отправит событие 'quota_expired', и закроет ее автоматически, предоставив ее другому подключению из очереди.

Пример события об автоматическом закрытии квоты:
[
  "quota_expired",
  {
    "key":"abc"
  }
]

Отказ от квоты или ожидания

Отказ от квоты следует направлять после завершения выполнения работы по квоте. Запрос также может направляться и на этапе ожидания выделения квоты, тогда ожидание прекращается, запрос к сервису прерывается.

Закрытие подключения эквивалентно запросу 'quota_release'.

Пример отказа от квоты:
[
  "quota_release",
  {
    "qid":"16066361-dfc0-49f6-b734-9b3dda09db22",
    "key": "abc"
  }
]

Обязательные поля запроса:

  • key - код существующей группы доступа по квотам.