Skip to content
This repository has been archived by the owner on Aug 25, 2021. It is now read-only.

Dynamic control API exposed via gRPC #32

Closed
evdokimovs opened this issue Jul 3, 2019 · 0 comments · Fixed by #33
Closed

Dynamic control API exposed via gRPC #32

evdokimovs opened this issue Jul 3, 2019 · 0 comments · Fixed by #33
Assignees
Labels
feature New feature or request k::api Related to API (application interface)
Milestone

Comments

@evdokimovs
Copy link
Contributor

evdokimovs commented Jul 3, 2019

Part of 0.2.0 Roadmap (#27)

Background

У medea предусмотренно динамическое Control API. На данный момент есть имплементация только статичекого Control API.

Problem to solve

Требуется разработать gRPC интерфейс для динамического обновления Control API спеки. На данном этапе нужно реализовать методы Create, Delete, Get. Метод Apply не является частью этой issue и будет реализован позже.

Possible solution

Выбор крейта для реализации gRPC сервера

На данный момент существует только два относительно популярных и живых крейта для реализации gRPC. Это grpc и grpcio, поэтому выбор можно ограничить ими двумя.

grpc

Плюсы:

  1. полностью написан на Расте
  2. не требует внешних зависимостей

Минусы:

  1. довольно скудная документация
  2. проблемы с производительностью

grpcio

Плюсы:

  1. достаточно полная документация
  2. хорошая производительность
  3. обертка над официальной библиотекой gRPC следовательно есть надежда на бОльшую проработанность

Минусы:

  1. это обертка над библиотекой написанной на C++, и там возможны segfault'ы и прочие радости C/C++
  2. есть внешние зависимости в виде go (в случае если мы используем secure feature)

Тут все довольно неоднозначно, но все же grpcio выглядит более симпатично из-за лучшей документации и производительности. Но вообще крейт можно будет, скорее всего, в любой момент сменить без сильной боли, поскольку для десериализации обоими крейтами используется rust-protobuf, а взаимодействие с самим сервером выглядит достаточно тривиально. Также в процессе реализации при надобности можно будет использовать абстракции в виде trait'ов, чтобы легко переехать на другой крейт в случае необходимости.

Интеграция с уже существующей реализацией Control API

Для начала требуется сделать абстракции над источником данных. На данный момент в статическом Control API используются структуры десериализуемые с помощью serde в случае с gRPC десериализация с помощью них не возможна, поэтому принято решение сделать trait'ы для всех необходимых на данный момент элементов, написать реализацию для уже существующих serde DTO и для gRPC DTO. Тут уже всплывает проблема, которая заключается в том, что DTO для grpcio генерируются автоматически и не очень хотелось бы дописывать что-то в автоматически сгенерированные файлы. Как вариант, конечно, не использовать build.rs, а генерировать DTO'шки с помощью protoc, но проблему пересборки protobuf спек с последующей перезаписью это не решает.
UPD: Все же было выбрано решение с реализацией TryFrom для уже существующих элементов Control API, так как это позоволяет удобно прокидывать и обрабатывать ошибки в спеках.

Абстракции над элементами Control API

Это устаревший блок, поскольку была выбрана реализация с помощью TryFrom.
Room:

trait RoomSpec {
    fn members(&self) -> HashMap<MemberId, Box<dyn MemberSpec>>;

    fn id(&self) -> RoomId;
}

Member:

trait MemberSpec {
    fn webrtc_play_endpoints(&self) -> HashMap<WebRtcPlayId, Box<dyn WebRtcPlayEndpoint>>;

    fn webrtc_publish_endpoints(&self) -> HashMap<WebRtcPublishId, Box<dyn WebRtcPublishEndpoint>>;

    fn credentials(&self) -> String;

    fn id(&self) -> MemberId;

    fn get_webrtc_play_by_id(&self, id: WebRtcPlayId) -> Option<Box<dyn WebRtcPlayEndpoint>>;

    fn get_webrtc_publish_by_id(&self, id: WebRtcPublishId) -> Option<Box<dyn WebRtcPublishEndpoint>>;
}

WebRtcPlayEndpoint:

trait WebRtcPlayEndpoint {
    fn src(&self) -> SrcUri;
}

WebRtcPublishEndpoint:

trait WebRtcPublishEndpoint {
    fn p2p(&self) -> P2pMode;
}
@evdokimovs evdokimovs added feature New feature or request k::api Related to API (application interface) labels Jul 3, 2019
@evdokimovs evdokimovs added this to the 0.2.0 milestone Jul 3, 2019
@evdokimovs evdokimovs self-assigned this Jul 3, 2019
@alexlapa alexlapa mentioned this issue Jul 4, 2019
15 tasks
evdokimovs added a commit that referenced this issue Oct 11, 2019
- create 'medea-control-api-proto' crate with protobuf spec and gRPC implementation
- add 'cargo.gen' Makefile command for rebuilding protobuf specs
evdokimovs added a commit that referenced this issue Oct 25, 2019
- integrate gRPC Control API server
- imp 'Create', 'Delete', 'Get' methods of Control API
- add temporary client for manual tests of gRPC Control API
- create E2E tests for gRPC Control API
- add '[server.control.grpc]' section to configure Control API gRPC server
- rename '[server]' section of Client API HTTP server as '[server.client.http]'
- add 'server.client.http.public_url' option to configure public URL of Client API HTTP server

Additionally:
- expose configuration changes in 'medea-demo' Helm chart values and bump up its version to 0.2.0
- use tinyurl.com instead of tiny.cc in docs
- fix missing CMake installation in Dockerfile
- describe explicit env var names in configuration file
- provide global AppContext
- add module path and file line number to logs
- refactor types and attributes usage in 'conf' module and split tests by submodules
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
feature New feature or request k::api Related to API (application interface)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant