Руководство разработчика
Настоящее Руководство предназначено для разработчиков приложений, инженеров и других специалистов, взаимодействующих с TQE(MQ) для получения, обработки и отправки сообщений.
В Руководстве описаны функции API TQE(MQ).
В разделе описана спецификация API на основе протокола gRPC.
При включенной аутентификации каждый вызов требует действительных учетных данных (базовая аутентификация по TLS). При
их отсутствии возвращается ошибка Unauthenticated, при отсутствии привилегии на метод или очередь — PermissionDenied,
при отсутствии связи с хранилищем авторизационных данных Unavailable. Подробнее см. раздел
Аутентификация и авторизация.
Примеры создания gRPC-клиента и выполнения запросов к очереди приведены в документах:
Сервер публикации сообщений брокера очередей.
Method Name | Request Type | Response Type | Description |
|---|---|---|---|
Produce | Публикация группы сообщений в очередь |
Запрос на публикацию группы сообщений в очередь.
Field | Type | Label | Description |
|---|---|---|---|
queue | string | Название очереди, в которую необходимо опубликовать сообщения | |
sharding_key | string | optional | Ключ шардирования. Используется для распределения данных в системе. При включенном режиме статического шардирования должен находиться в диапазоне идентификаторов бакетов карты распределения. |
messages | repeated | Набор сообщений | |
metadata | repeated | Произвольные данные в формате списка из пар ключ-значение |
Группа сообщений.
Field | Type | Label | Description |
|---|---|---|---|
routing_key | string | optional | Ключ маршрутизации сообщения (тип сообщения). Используется для фильтрации сообщений из очереди на потребителях |
deduplication_key | string | optional | Ключ дедупликации. Используется для проверки повторных сообщений. Если не указан, проверка не выполняется. |
payload | bytes | Произвольные данные в бинарном формате (тело сообщения) | |
metadata | repeated | Произвольные данные в формате списка из пар ключ-значение |
Ответ на публикацию группы сообщений.
Field | Type | Label | Description |
|---|---|---|---|
ids | uint64 | repeated | Идентификаторы сообщений |
is_duplicates | boolean | repeated | Флаги наличия дубликатов |
Запрос на рассылку сообщения на указанные шарды.
Field | Type | Label | Description |
|---|---|---|---|
queue | string | Название очереди, в которую необходимо опубликовать сообщение | |
routing_key | string | optional | Ключ маршрутизации сообщения (тип сообщения). Используется для фильтрации сообщений из очереди на потребителях. |
deduplication_key | string | optional | Ключ дедупликации. Используется для проверки повторных сообщений. Если не указан, проверка не выполняется. |
payload | bytes | Произвольные данные в бинарном формате (тело сообщения) | |
metadata | repeated | Произвольные данные в формате списка пар ключ-значение. | |
replicasets | string | repeated | Список названий наборов реплик, на которые нужно опубликовать сообщение. По умолчанию рассылка происходит на все шарды. |
timeout | uint64 | optional | Максимальное время рассылки сообщения |
Ответ на рассылку сообщения.
Field | Type | Label | Description |
|---|---|---|---|
code | uint32 | Код завершения рассылки: 0 - Успешная публикация 1 - Ошибка на роутере 2 - Ошибка на наборе реплик | |
error | string | optional | Сообщение об ошибке |
replicasets | repeated | Набор ответов с шардов | |
cursor | string | optional | Курсор подписки, собранный из оффсетов успешно опубликованных сообщений по шардам. Передается напрямую в поле cursor запроса SubscribeRequest для подписки начиная с позиции сразу после broadcast-сообщения. Отсутствует, если ни один шард не обработан успешно. Формат курсора определяется параметром cursor_serializer (по умолчанию base64). |
Field | Type | Label | Description |
|---|---|---|---|
key | string | ||
value |
Ответ набора реплик на публикацию сообщения.
Field | Type | Label | Description |
|---|---|---|---|
success | Сообщение об успешной публикации | ||
error | Сообщение об ошибке публикации |
Сообщение об успешной публикации.
Field | Type | Label | Description |
|---|---|---|---|
id | uint64 | Идентификатор сообщения, добавленного в очередь |
Сообщение об ошибке публикации.
Field | Type | Label | Description |
|---|---|---|---|
code | uint32 | Код ошибки | |
message | string | Сообщение об ошибке |
Сервер подписок на сообщения брокера очередей.
Method Name | Request Type | Response Type | Description |
|---|---|---|---|
Subscribe | Subscription Notifications stream | Подписка на сообщения с фильтрацией |
Поток запросов на подписку.
Field | Type | Label | Description |
|---|---|---|---|
subscribe_request | Запрос на подписку | ||
commit_request | Запрос на обновление курсора персистентной подписки |
Запрос на подписку.
Field | Type | Label | Description |
|---|---|---|---|
queue | string | Название очереди | |
routing_key | string | optional | Ключ маршрутизации сообщения (тип сообщения). Используется для фильтрации сообщений из очереди. Если не указан, подписка происходит на все типы сообщений в очереди. |
cursor | string | optional | Курсор - указатель на последнее полученное сообщение. Используется для получения истории сообщений или восстановления работы потребителя после сбоя, а также при истечении времени, указанного в ttl при наличии персистентной подписки. Если значение не указано, подписка возобновляется с текущего момента. Пустая строка - подписка с начала очереди. Непустое значение - подписка с указанного сообщения в очереди. |
sharding_key | string | optional | Ключ шардирования. Используется для распределения данных в системе. Если не указан, подписка происходит на все типы сообщений в очереди. При включенном режиме статического шардирования должен находиться в диапазоне идентификаторов бакетов карты распределения. |
sharding_keys | string | repeated | Ключи шардирования позволяют фильтровать по нескольким ключам шардирования в пределах одной подписки. При включенном режиме статического шардирования должны находиться в диапазоне идентификаторов бакетов карты распределения. |
consume_id | string | optional | Уникальный идентификатор подписки. По значению этого параметра система может создать персистентную подписку и восстановить её сохраненное состояние, чтобы возобновить передачу сообщений с последней сохраненной позиции. |
ttl | float | Время жизни состояния подписки. Параметр используется совместно с параметром consume_id для управления временем жизни подписки. Подписка очищается вместе со всем состоянием по прошествии времени, указанного в ttl, при отключении от подписки. При повторном подключении запросом SubscriptionRequest после истечения ttl клиенту с тем же значением consume_id необходимо учитывать значение параметра cursor. | |
restore | boolean | optional | Позволяет игнорировать курсор при восстановлении подписки. Если указано значение false (используется по умолчанию) система требует точного совпадения переданного в запросе курсора с сохраненным значением, и при несовпадении операция завершается ошибкой. При значении true система начинает или возобновляет подписку с позиции курсора в хранилище, игнорируя значение cursor в запросе. |
Запрос на обновление курсора персистентной подписки.
Field | Type | Label | Description |
|---|---|---|---|
cursor | string | Указатель на последнее обработанное сообщение в очереди. При подписке необходимо выполнять обновление курсора как минимум для последнего сообщения из каждого пакета сообщений. При этом можно обновлять курсор и для отдельных сообщений, соблюдая это правило. |
Поток ответов подписки.
Field | Type | Label | Description |
|---|---|---|---|
notifications | Сообщения в стриме подписки | ||
commit_response | Ответ на обновление состояния подписки |
Сообщение в стриме подписки.
Field | Type | Label | Description |
|---|---|---|---|
notifications | repeated | Новые сообщения в очереди с курсорами |
Уведомление клиента о новых сообщениях в очереди.
Field | Type | Label | Description |
|---|---|---|---|
cursor | string | Строка-указатель сообщения | |
message | Сообщение |
Сообщение в очереди.
Field | Type | Label | Description |
|---|---|---|---|
id | uint64 | Идентификатор сообщения. Заполняется автоматически при записи сообщения в очередь. | |
queue | string | Название очереди, в которую необходимо опубликовать сообщение | |
routing_key | string | optional | Ключ маршрутизации сообщения (тип сообщения). Используется для фильтрации сообщений из очереди на потребителях. |
sharding_key | string | optional | Ключ шардирования. Используется для распределения данных в системе. При включенном режиме статического шардирования должен находиться в диапазоне идентификаторов бакетов карты распределения. |
deduplication_key | string | optional | Ключ дедупликации. Используется для проверки повторных сообщений. Если не указан, проверка не выполняется. |
payload | bytes | Произвольные данные в бинарном формате (тело сообщения) | |
metadata | repeated | Произвольные данные в формате списка пар ключ-значение | |
timestamp | int64 | Время вставки сообщения в очередь в наносекундах |
Пара ключ-значение.
Field | Type | Label | Description |
|---|---|---|---|
key | string | Ключ пары | |
value | string | Значение пары |
Ответ на обновление состояния подписки.
Field | Type | Label | Description |
|---|---|---|---|
cursor | string | Обновленная строка-указатель сообщения |
Поток запросов к группе потребителей.
Field | Type | Label | Description |
|---|---|---|---|
consume_request | Запрос к группе потребителей | ||
commit_request | Запрос на подтверждение обработки сообщения |
Поток ответов к группе потребителей.
Field | Type | Label | Description |
|---|---|---|---|
consume_response | Сообщение в стриме подписки | ||
commit_response | Ответ на подтверждение обработки сообщения |
Запрос в группу потребителей.
Field | Type | Label | Description |
|---|---|---|---|
group_id | string | Идентификатор группы потребителей. Если группы с указанным идентификатором не существует, Оркестратор создает новую группу. | |
queue | string | Название очереди | |
routing_key | string | optional | Ключ фильтрации |
ttl | float | optional | Время жизни состояния подписки |
Ответ с потребленными сообщениями группы.
Field | Type | Label | Description |
|---|---|---|---|
notifications | repeated | Список потребленных сообщений |
Запрос на подтверждение обработки сообщения группы потребителей.
Field | Type | Label | Description |
|---|---|---|---|
cursor | string | Строка-указатель на сообщение |
Ответ на подтверждение обработки сообщения группы потребителей.
Field | Type | Label | Description |
|---|---|---|---|
cursor | string | Обновленная строка-указатель сообщения | |
status | CommitStatus | Результат подтверждения обработки сообщения: COMMIT_STATUS_OK (успех) или COMMIT_STATUS_ABORTED (отклонено) | |
error_message | string | optional | Описание ошибки подтверждения. Отсутствует при успешном коммите. |
Уведомление о сообщении в группу потребителей.
Field | Type | Label | Description |
|---|---|---|---|
cursor | string | Строка-указатель на текущее сообщение | |
message | Сообщение |
Сервис управления пользователями, ролями и секретами gRPC API. Полное имя метода — /tarantool.queue_ee.Iam/<Method>.
Для вызова любого метода нужно право tqe.admin, тип аутентификации — базовая. Пользователи, роли и секреты
хранятся в конфиг-хранилище кластера (TCS или etcd).
Права, встроенные роли и шаблоны очередей описаны в разделе Уровень gRPC (базовая аутентификация + RBAC).
Method Name | Request Type | Response Type | Description |
|---|---|---|---|
ListUsers | Получить список всех пользователей | ||
GetUser | Получить пользователя по имени | ||
CreateUser | Создать пользователя | ||
UpdateUser | Обновить пользователя (описание) | ||
DeleteUser | Удалить пользователя по имени | ||
GrantRole | Назначить пользователю роль на шаблоны очередей | ||
RevokeRole | Снять или сузить роль у пользователя | ||
SetPassword | Создать или сменить пароль пользователя | ||
ListRoles | Получить список всех ролей | ||
GetRole | Получить роль по имени | ||
CreateRole | Создать роль | ||
UpdateRole | Обновить роль (описание и/или список прав) | ||
DeleteRole | Удалить роль по имени |
Параметры запросов проверяются. При нарушении метод возвращает ошибку InvalidArgument, при попытке изменить или
удалить встроенную роль — FailedPrecondition (builtin role is immutable).
- Имя пользователя и роли не может быть пустым;
- Имена
Admin,ProducerиConsumerзарезервированы за встроенными ролями — создать роль с таким именем нельзя; permissionsне может быть пустым; допускаются толькоtqe.admin,tqe.produceиtqe.consume;queue_patternsв GrantRole не может быть пустым; пустая строка — ошибка;- Пароль короче
password_policy.min_length—InvalidArgument; - Повторное использование пароля из истории —
InvalidArgument(password: already used).
Пользователь.
Field | Type | Label | Description |
|---|---|---|---|
id | string | Идентификатор пользователя | |
name | string | Уникальное имя пользователя (логин) | |
description | string | Описание пользователя | |
role_grants | repeated | Назначения ролей пользователю | |
create_time | Timestamp | Время создания пользователя | |
update_time | Timestamp | Время последнего обновления пользователя |
Назначение роли пользователю на набор шаблонов очередей.
Field | Type | Label | Description |
|---|---|---|---|
role | string | Имя роли | |
queue_patterns | string | repeated | Шаблоны очередей, на которые распространяется роль |
Роль.
Field | Type | Label | Description |
|---|---|---|---|
id | string | Идентификатор роли | |
name | string | Уникальное имя роли | |
description | string | Описание роли | |
permissions | string | repeated | Список прав |
Метаданные секрета.
Field | Type | Label | Description |
|---|---|---|---|
user_id | string | Идентификатор владельца секрета | |
type | string | Тип секрета (всегда password) | |
public_key | string | Публичная часть секрета (логин) | |
state | string | Состояние секрета ( active, locked, expired) | |
create_time | Timestamp | Время создания секрета | |
update_time | Timestamp | Время последнего обновления секрета |
Состояния locked (после lockout_threshold неудачных попыток) и expired снимаются вызовом
SetPassword.
Запрос списка пользователей. Пустой запрос (не содержит полей).
Ответ со списком пользователей.
Field | Type | Label | Description |
|---|---|---|---|
users | repeated | Список пользователей |
Запрос пользователя по имени.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя |
Запрос на создание пользователя.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя | |
description | string | Описание пользователя |
Созданный пользователь не имеет пароля и не может аутентифицироваться, пока не вызван SetPassword.
Запрос на обновление пользователя.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя | |
description | string | Описание пользователя |
Метод переписывает только описание. Переименовать пользователя нельзя.
Запрос на удаление пользователя.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя |
Ответное сообщение DeleteUserResponse приходит пустым (не содержит полей).
Запрос на назначение роли пользователю.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя | |
role | string | Имя роли | |
queue_patterns | string | repeated | Шаблоны очередей, на которые распространяется назначаемая роль. Может быть точным именем очереди или обратной маской; пустой шаблон — ошибка. |
Только расширяет привилегии, добавляя шаблоны из запроса к уже выданным.
Запрос на снятие/сужение роли у пользователя.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя | |
role | string | Имя роли | |
queue_patterns | string | repeated | Список шаблонов очередей, для которых отзывается роль. Пустой список — роль отзывается со всех очередей. |
Шаблон в запросе сравнивается с текущими шаблонами без раскрытия маски. Если пользователю выдан orders.*,
отзыв orders.new ничего не изменит, потому что именно такого шаблона в гранте нет. Чтобы оставить доступ только к одной
очереди, снимите orders.* и выдайте роль на нужные очереди заново.
Запрос на установку/смену пароля пользователя.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя пользователя | |
password | string | Пароль |
Логин, под которым предъявляется пароль (имя пользователя). Ответ Secret не содержит ни пароль, ни его хэш. Пароль
не может быть длиннее 72 байт.
Запрос списка ролей. Пустой запрос (не содержит полей).
Ответ со списком ролей.
Field | Type | Label | Description |
|---|---|---|---|
roles | repeated | Список ролей |
Запрос роли по имени.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя роли |
Запрос на создание роли.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя роли | |
description | string | Описание роли | |
permissions | string | repeated | Список прав роли |
Запрос на обновление роли.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя роли | |
description | string | Описание роли | |
permissions | string | repeated | Список прав роли |
Запрос на удаление роли.
Field | Type | Label | Description |
|---|---|---|---|
name | string | Имя роли |
Роль удаляется, только если она не выдана ни одному пользователю. Сначала снимите её с держателей вызовом RevokeRole.
Ответное сообщение DeleteRoleResponse приходит пустым (не содержит полей).
Код | Когда | Пример |
|---|---|---|
InvalidArgument | запрос не проходит проверку параметров | name: must not be empty, permissions: must not be empty, password: already used |
NotFound | названной сущности нет | auth store: entity not found: user "nobody" |
AlreadyExists | имя занято | auth store: entity name already taken: name "orders-svc" … |
FailedPrecondition | операция невозможна в текущем состоянии | builtin role is immutable, auth store: role is granted to users: … |
Aborted | конкурентные записи не разошлись | auth store: collection updated concurrently: … |
Unauthenticated | учетные данные не сошлись | authentication failed |
PermissionDenied | нет права tqe.admin | permission denied |
Unavailable | сбой хранилища | iam: … |