27 февраля 2019

PHP-митап: обсуждаем Protocol Buffers

Очередной митап собрал вместе комады PHP-разработчиков из офисов в Санкт-Петербурге и Новосибирске. Темой нового обсуждения стала предложенная компанией Google библиотека для передачи структурированных данных — Protocol Buffers (protobuf). Этот подход активно используется в одном из проектов Noveo, но, как оказалось, многие слушатели почерпнули для себя что-то новое.

Noveo meet-up protobuf

Очень краткий экскурс в предмет вопроса — как передавать данные и обзор альтернативных решений — ввёл участников в курс дела, чтобы все были «on the same page». Глубоко закапываться в этот вопрос не стоит, ведь вариантов масса — на любой вкус и уровень сложности. Но даже поверхностное знакомство с конкурентами всегда будет преимуществом и поможет сориентироваться среди обилия готовых решений и предложить клиенту оптимальный вариант.

В тройке лидеров для сравнения с Protocol Buffers был упомянут, например, Apache Thrift — продукт, разработанный и используемый, не много не мало, внутри Facebook. Его однозначно стоит принять во внимание: он так же, как и protobuf, позволяет не только описать параметры сообщений запросов/ответов, но и спроектировать API, кроссплатформенное API. Не сдаёт позиций и Message Pack: по их собственному заверению, они «как JSON, но быстрее и легче», и это  действительно так. Если вы привыкли к JSON, но считаете ненужным оверхед от таких «монстров», как Thrift и Protbuf, то MessagePack может быть именно тем, что вам нужно. Ну и, конечно, не стоит забывать про возможности самого PHP, который уже сам по себе отлично подходит для обмена данными, так как json_encode/json_decode ещё никто не отменял.

Далее последовало более подробное знакомство непосредственно с виновником митапа — библиотекой Protocol Buffers. Был затронут вопрос синтаксиса. Пусть он и не очень сложный, но требуется время, чтобы привыкнуть к новым ключевым словам. К тому же в настоящий момент существует две активные версии данной библиотеки, поэтому важно было сделать акцент на их различиях и на том, какие возможности предоставляет новая, третья, версия Protocol Buffers. На самом деле их всего три. Во-первых, если нужно использовать protobuf третий версии, то в начале файла с описанием сервису нужно добавить syntax = "proto3", потому что по умолчанию используется вторая версия. Второй важный момент — разработчики Protobuf решили, что валидация не имеет никакого отношения к обмену данными, и поэтому убрали ключевые слова optional и required, которые требовались в proto2. Теперь сам клиент должен валидировать запросы и ответы, проверяя их на предмет того, что все требуемые поля заполнены. Но самым главным отличием является то, что в новой верcии protobuf можно (и нужно, ведь он для этого и придуман) описать не только формат сообщений, но и используемые методы. Таким образом, сразу описывается вся структура приложения, которую и будут использовать клиенты.

Noveo meet-up protobuf

Некоторым проще воспринимать новую информацию через примеры. Особенно когда речь идёт о новом синтаксисе. Именно поэтому подача информации была изрядно сдобрена пусть и несколько оторванными от реального кода, но действительно работающими примерами. Так, создание сообщения выглядит очень просто: $message = new MessageRequest(); или можно сразу в конструкторе передать массив данных, и созданный объект будет содержать все нужные значения. А потом можно поменять какое-то одно конкретное поле — $message->setFieldName(true); но свой настоящий потенциал protobuf раскрывает, когда дело доходит до сериализации данных. Будучи протоколом для передачи бинарных данных, он позволяет сэкономить до 60% трафика. Так, JSON-строка длиной 64 символа сжимается до 17.

В названии встречи не без причины было упомянуто о том, как соединить Protocol Buffers и Symfony. В заключение был показан реально работающий пример приложения, использующий практически всё, что было описано в презентации, но пропущенное через фильтры реальности фреймворка Symfony. А именно — как создать сервис, как прокинуть запрос из контроллера в сервис, как обработать его и вернуть ответ. И главное — как из полученного ответа получить валидный JSON, который для передачи клиенту.

Без лишней скромности можно с уверенностью заявить, что Protocol Buffers 3 является практически идеальным решением для разработки средних и больших приложений. Эта библиотека позволяет «из коробки» получить мощный инструмент для проектирования приложения и описания механизмов взаимодействия клиента и сервера. Удобный и хорошо читаемый синтаксис прото-файлов прост и понятен, а нативный компилятор позволяет сгенерировать готовые файлы для большинства языков — PHP, JS, TypeScript, Go и многие другие. Всё это и немного магии Symfony — слушатель запросов для преобразования их в protobuf-request и обработчик результатов работы контроллеров для получения protobuf-response — позволяет создать действительно простое, масштабируемое приложение с бизнес-логикой, не зависящей от фреймворка.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте в нашем блоге

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: