Рубрики
Без рубрики

Давайте узнаем о буферах протокола

Этот пост – зеркало поста, которое я написал в моем собственном блоге. Давайте узнаем о протокольных буферах … Теги с узлом, Python, учебником, WebDev.

Этот пост – зеркало поста, которое я написал на Мой собственный блог Отказ

Протокол буферы или “Протовуфы” Термин часто брошен в комнаты крупных технологий при проектировании Прикладные системы Отказ Прикладные системы могут содержать сотни тысяч машин, которые все общаются друг с другом. В этой шкале многие компании пытаются оптимизировать любые возможные буферы протокола – это инструмент, который вы можете использовать для отправки данных между вашими приложениями на высоких скоростях.

В этой статье я буду пролить свет на буферы протокола и показывать вам, как его использовать!

Протовуфы часто соединяются с GRPCS ( вызовы удаленной процедуры ), которые являются темой самой своей. Я постараюсь покрыть его через несколько недель.

Гист

Протобуфс – это Язык определения интерфейса и Протокол связи Используется для создания приложений и транспортных данных между ними. Протобуфс выполняет это, обеспечивая общую структуру данных в разделах кода, где данные будут переданы между приложениями. Эти структуры данных определены в .Proto файлы. Инструмент командной линии, Проток , использует те .Proto Файлы для генерации файлов классов, которые используются для записи приложений.

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

Протобуфс можно сравнить с JSON, две различия:

  1. Вам нужно предварительно определить, как выглядит ваша структура в .Proto файлы
  2. Данные, хранящиеся в ProtoBuf, изменяются вспомогательным функциям, предоставляемым автоматически сгенерированными классами из тех .Proto файлы

В любое время вы передаете JSON между двумя серверами; Вы можете заменить это с помощью двоичного протобуфа. Отправка данных с помощью двоичных файлов Protobuf может предлагать улучшения производительности в более быстрой срок загрузки от 4 до 78% в зависимости от ситуации (я обсуждаю больше в компромисс и выгоду).

В моей голове при разработке с ProTobufs есть два процесса: процесс разработки и процесс реализации. Процесс разработки касается создания и управления протобуфнами. Процесс реализации – это использование классов Protobuf для создания наших приложений/серверов/услуг.

Давайте посмотрим на эти процессы на примере. Допустим, мы разрабатываем приложение, которое возвращает нам список клиентов нашей компании.

Наш процесс разработки выглядит следующим образом:

  1. Разработчик пишет некоторые структуры данных под названием Клиентлист и Клиент В оформлении CustomeryList.Proto файл Инструмент командной строки, который поставляется с библиотекой Protobuf, называется
  2. Проток читает .Proto Файлы и генерирует классы в программировании Langauge выбора разработчика. Разработчик совершает
  3. .Proto и сгенерированный код в их кодовую базу Если какие-либо изменения необходимы для этой Datastructure, мы начинаем снова на шаге.

Сгенерированный код в нашем случае – это классы Клиентлист и Клиент Отказ Теперь мы можем использовать эти классы для создания приложения.

Когда придет время отправлять данные между двумя системами, мы можем вызвать функцию помощника, которая прикреплена к этим классам, чтобы преобразовать данные нашего класса в строку. Призывным вызовом REST/GRPC/ETC передает эти данные на другой сервис. Наш слушатель на нашем другом сервисе может затем использовать те же классы для десериализации строки обратно в читаемые данные на языке.

Реализация протобуфс

Давайте построим систему, которая транспортирует список клиентов с нашего сервера приложений Python на веб-сервере Node.js и показывает нам этот список на таблице.

Это приложение немного сложно, поэтому я предоставил ссылку GitHub ниже, чтобы вы следили с:

4Shub/Protobufs-пример

Структура файла нашего приложения должна выглядеть следующую:

// @language-override:Our folder
application_root
|_src
   |_ generated
   |_ protos

Сначала давайте построим CustomeryList.Proto в SRC/Protos :

// @language-override:proto3
syntax = "proto3";

message Customer {
  required string name = 1;
  required int32 id = 2;
  required string email = 3; 
  required bool isNewCustomer = 4;
}

message CustomerList {
  repeated Customer customer = 1;
}

Выше я создал нашу структуру данных после Proto3 Язык Отказ

Тогда нам нужно выполнить следующую команду в нашем корне приложения:

// @language-override:Terminal
protoc --python_out=src/generated --js_out=import_style=commonjs,binary:src/generated src/protos/customerlist.proto -I src/protos

Эта команда будет генерировать наши классы в файлах с именем customerlist_pb.py и CustomerList_PB.JS. в папке под названием сгенерировано Отказ

Теперь давайте построим наш Python Server

# @language-override:Python + Flask
import flask
from generated import customerlist_pb2

app = flask.Flask(__name__)

# creating our "database"
customer1 = customerlist_pb2.Customer(name='Shubham', id=0, email='shub@shub.club')
customer2 = customerlist_pb2.Customer(name='Rui', id=1, email='rui@too.com', isNewCustomer=True)

customer_list = customerlist_pb2.CustomerList()
customer_list.customer.append(customer1)
customer_list.customer.append(customer2)


@app.route('/customer-list')
def get_customer_list():
    # `SerializeToString` is a helper function that serializes customer_list to a binary format
    return customer_list.SerializeToString()

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=3001)

В вышеупомянутом коде я создал экземпляр класса Клиентлист и заполнить его некоторыми с помощью данных клиента. Затем я преобразую эти данные в протобуф двоичный и пропустите его любому, кто просит /Список клиентов Отказ

Наш сервер узла будет действовать как наш приемный сервер, он пройдет страницу HTML, которая будет содержать кнопку, которая запрашивает нам список клиентов, хранящихся на сервере Python. Сервер Node.js сделает запрос от имени клиента, чтобы получить эти данные.

// @language-override:Node.js + Express
const path = require('path');
const axios = require('axios');
const express = require('express');
const app = express();
const port = 3000;

const { CustomerList } = require('./generated/customerlist_pb');
const PYTHON_SERVER_URL = 'http://localhost:3001';

app.get('/customers', async (req, res) => {
    try {
        const binaryData = await axios.get(`${PYTHON_SERVER_URL}/customer-list`);

        // convert string to base64 to be read by `deserializeBinary`
        const base64data = Buffer.from(binaryData.data).toString('base64')

        const customerList = CustomerList.deserializeBinary(base64data)

        // convert to json
        res.send(customerList.toObject());
    } catch (e) {
        console.log(e)
        res.send(404);
    }
});

app.get('/', (req, res) => res.sendFile(path.join(__dirname, './index.html')));

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))

Мы видим Клиентлист Функция помощника десериализоватьбировать Преобразование нашей двоичной строки в рабочее Клиентлист класс объекта. Мы используем Тообъектировать Для преобразования наших классов данных в JSON. Мы наконец пройдем JSON клиенту.

Компромиссы и выгоды

Не все, что вы создаете, требует Protobufs!

Иногда легче и эффективнее не иметь дело с сложными методами после отправки данных. В исследовании AUTH0 [0], где они сравнивали двоичные характеристики JSON VS Protobuf, Protobufs значительно улучшил скорость передачи данных с Java Server до связи Java Server (78% сокращение времени загрузки), в то время как Java Server к клиентской связи имел только 4% Снижение времени загрузки.

AUTH0 также сделал второй тест с Java-сервера к клиенту в «несжатой» среде. Время скачивания было улучшено на 21%. Используя эту информацию, если ваша цель – просто повысить производительность, гораздо лучше просто сжать данные JSON и забыть реализовать протобуф.

Внешние оптимизации, Protobufs обеспечивает способ документирования и обеспечения применения структуры данных. Это супер полезно при сохранении данных, согласующихся на нескольких языках программирования и нескольких команд.

Что означают для вас компромисс и преимущества, разработчик? Это означает, что иногда инструмент, который вы можете использовать в одной части вашей прикладной системы, может быть не полезен в другом месте. Или это может означать, что, возможно, дополнительное время разработки для обеспечения принудительного обеспечения Protobufs на всей вашей заявке стоит. В конце концов, это зависит от вас в качестве разработчика, чтобы увидеть, является ли решение жизнеспособным для вашего продукта или использования.

Заключение

Строительство экосистемы приложения может быть непростой, но с протобуфнами в вашем инструменте вы можете оптимизировать свои сетевые мощности до полного потенциала. Ком-компании, как Square, Google и Netflix, используют его каждый день в своих системах. Может быть, вы можете построить что-то круто с ним тоже. Как всегда, дайте мне знать, что вы построили с Protobufs.

[0] https://auth0.com/blog/beating-json-performance-with-protobuf/

Оригинал: “https://dev.to/4shub/let-s-learn-about-protocol-buffers-17g0”