SA и Сервис дизайн | Тимур Бобылев
Тимур Бобылев, Старший системный аналитик в Сбер · 06.01 · ред.
Высокая производительность и надёжные данные: почему gRPC и protovalidate — отличный дуэт Современные распределённые системы требуют не только быстрой передачи данных, но и строгой валидации, чтобы исключить ошибки уже на этапе сетевого взаимодействия. В этой статье разберём, как gRPC упрощает коммуникацию между микросервисами, а protovalidate помогает следить за корректностью данных. --- Что такое gRPC и зачем он нужен gRPC (Remote Procedure Call) — это протокол, позволяющий распределённым системам взаимодействовать по схеме «клиент вызывает методы на сервере так, словно это локальные функции». Он сочетает в себе: 1. HTTP/2. Использование двунаправленных (bidirectional) потоков и высокая производительность за счёт мультиплексирования. 2. Protocol Buffers (Protobuf). Компактная сериализация с жёсткой типизацией, что особенно ценно при масштабном обмене сообщениями. Контрактно-ориентированный подход 1. .proto-файлы Разработчик описывает сервисы и структуры данных в .proto. 2. Серверная реализация Сервер читает контракт и реализует методы, которые были объявлены. 3. Генерация кода Клиент пользуется тем же .proto для автогенерации stubs, позволяющих вызывать серверные методы почти так же, как локальные функции. Сравнение с REST REST/JSON: - Обычно работает поверх HTTP/1.1 или HTTP/2. - JSON удобен для чтения человеком, но «тяжеловесен» и не так строго типизирован. gRPC/Protobuf: - Использует HTTP/2 с двунаправленным стримингом. - Сообщения компактнее, сильная типизация упрощает отладку и снижает риск неконсистентных данных. Когда gRPC показывает свою силу Высоконагруженная микросервисная архитектура: особенно там, где ключевы показатели — пропускная способность и минимальные задержки. Онлайн-стриминг: двунаправленные каналы идеальны для обмена информацией в реальном времени (чаты, системы IoT). Кроссплатформенность: единый формат общения для серверов на разных языках и фреймворках. --- protovalidate: держим данные под контролем Чтобы быть уверенным, что отправляемые и получаемые данные соответствуют бизнес-логике, можно использовать protovalidate. Это набор библиотек, которые добавляют правила валидации прямо в .proto-файлы, а затем позволяют выполнять проверку на этапе выполнения (runtime). Главные возможности protovalidate 1. Ориентация на Protobuf Все правила указываются как расширения buf.validate.field или buf.validate.message — они описывают ограничения для полей, oneof-блоков или даже целых сообщений. 2. CEL (Common Expression Language) Google CEL даёт гибкий синтаксис для сложных правил. Например, можно проверить, что «дата доставки больше, чем дата покупки», или «строка начинается со знака валюты и её числовая часть > 0». 3. Без сгенерированного кода В отличие от некоторых других решений, protovalidate не требует дополнительного плагина для генерации; валидация работает напрямую с объектами Protobuf. 4. Широкая совместимость Поддерживает Go, C++, Java, Python и TypeScript (вскоре). Подходит для проектов с несколькими языками на бэкенде. Как это выглядит на практике Простой пример для поля email: syntax = "proto3"; import "buf/validate/validate.proto"; message User { // Имя должно содержать не меньше одного символа string name = 1 [(buf.validate.field).string.min_len = 1];_
// Проверка на валидный email string email = 2 [(buf.validate.field).string.email = true]; }
Если ваша архитектура сложнее, вы можете прописать CEL-выражения для сравнения сразу нескольких полей:
message Transaction { google.protobuf.Timestamp purchase_date = 1; google.protobuf.Timestamp delivery_date = 2;
option (buf.validate.message).cel = { _id: "transaction.delivery_date", message: "Delivery date must be after purchase date", expression: "this.delivery_date > this.purchase_date" }; }
еще контент автора
еще контент автора
SA и Сервис дизайн | Тимур Бобылев
Тимур Бобылев, Старший системный аналитик в Сбер · 06.01 · ред.
войдите, чтобы увидеть
и подписаться на интересных профи