Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Izhevsk PHP Meetup #3. Protocol Buffers или не JSON'ом единым

Izhevsk PHP Meetup #3. Protocol Buffers или не JSON'ом единым

Антон Жвакин, C++ разработчик, Galament Software
Расскажу о том, что это такое и зачем вам это нужно. Особенности 2-й и 3-й версии. Сравнение с некоторыми аналогами. Доклад ориентирован на широкую аудиторию и призван расширить взгляды разработчиков на задачу сериализации структурированных данных.

Izhevsk PHP Meetup

September 28, 2017
Tweet

More Decks by Izhevsk PHP Meetup

Other Decks in Technology

Transcript

  1. Protocol Buffers
    или не JSON’ом единым
    Антон Жвакин
    Galament Software

    View Slide

  2. О чем речь?
    2

    View Slide

  3. О чем речь?
    ● Имеем структурированные данные
    3

    View Slide

  4. О чем речь?
    ● Имеем структурированные данные
    ● Хотим осуществить их ввод/вывод
    (например, через файловую систему или по
    сети)
    4

    View Slide

  5. Варианты решения
    5
    ● Придумать свой формат

    View Slide

  6. Варианты решения
    6
    ● Придумать свой формат
    ● Использовать сериализацию языка(C#,
    Java)

    View Slide

  7. Варианты решения
    7
    ● Придумать свой формат
    ● Использовать сериализацию языка(C#,
    Java)
    ● XML
    ● JSON
    ● Protocol Buffers
    ● ...

    View Slide

  8. Что такое Protocol Buffers?
    8

    View Slide

  9. Что такое Protocol Buffers?
    ● Язык описания структур данных
    9

    View Slide

  10. Что такое Protocol Buffers?
    ● Язык описания структур данных
    ● Протокол сериализации
    10

    View Slide

  11. Что такое Protocol Buffers?
    ● Язык описания структур данных
    ● Протокол сериализации
    ● Генератор кода
    11

    View Slide

  12. Пример
    message User {
    string name = 1;
    uint32 age = 2;
    repeated string account = 3;
    }
    12

    View Slide

  13. Пример
    message User {
    string name = 1;
    uint32 age = 2;
    repeated string account = 3;
    }
    >protoc.exe user.proto --php_out=.
    13

    View Slide

  14. Пример
    include 'User.php’;
    14

    View Slide

  15. Пример
    include 'User.php’;
    $user = new User();
    $user->setName('Anton');
    15

    View Slide

  16. Пример
    include 'User.php’;
    $user = new User();
    $user->setName('Anton');
    $data = $user->serializeToString();
    $user2->mergeFromString($data);
    16

    View Slide

  17. Чем это лучше JSON?
    17

    View Slide

  18. Это удобно
    18

    View Slide

  19. Это самодокументируемо
    19

    View Slide

  20. Это компактно
    20

    View Slide

  21. Это компактно
    21
    ● Бинарное представление

    View Slide

  22. Это компактно
    22
    ● Бинарное представление
    ● Номер поля вместо его имени

    View Slide

  23. Это компактно
    23
    ● Бинарное представление
    ● Номер поля вместо его имени
    ● Незаполненные поля не представлены

    View Slide

  24. Это компактно
    24
    ● Бинарное представление
    ● Номер поля вместо его имени
    ● Незаполненные поля не представлены
    ● Особое представление целых чисел

    View Slide

  25. Это компактно
    25
    ● Бинарное представление
    ● Номер поля вместо его имени
    ● Незаполненные поля не представлены
    ● Особое представление целых чисел
    ○ int64
    ○ sint64
    ○ uint64
    ○ fixed64
    ○ sfixed64

    View Slide

  26. Плавающий размер представления
    ● 7 бит полезной нагрузки
    ● 1 бит признак наличия еще байта
    127 - 1 байт 01111111
    128 - 2 байта 10000000 00000001
    26

    View Slide

  27. Представление отрицательных чисел
    27
    Исходное число Представление
    0 0
    -1 1
    1 2
    -2 3

    View Slide

  28. Советы по использованию
    28

    View Slide

  29. Осознанный выбор типов данных
    29
    Знаковый Беззнаковый
    Небольшие sint64/32 uint64/32
    Большие sfixed64/32 fixed64/32

    View Slide

  30. Часто используемые поля
    Ключ поля - целое число(его номер + тип)
    [0][1111][111]
    ● Поля с 1 по 15 занимают 1 байт
    ● С 16 по 2047 - 2 байта
    30

    View Slide

  31. Диспетчеризация сообщений
    message AddUser {
    ...
    }
    message DeleteUser {
    ...
    }
    31

    View Slide

  32. Диспетчеризация сообщений
    message Request {
    enum Type {
    ADD_USER = 1;
    DELETE_USER = 2;
    }
    Type type = 1;
    AddUser add_user = 2;
    DeleteUser delete_user = 3;
    }
    32

    View Slide

  33. Диспетчеризация сообщений
    message Request {
    oneof {
    AddUser add_user = 1;
    DeleteUser delete_user = 2;
    }
    }
    33

    View Slide

  34. Используйте Protobuf 3
    ● Больше ЯП
    34

    View Slide

  35. Используйте Protobuf 3
    ● Больше ЯП
    ● Все поля необязательные
    35

    View Slide

  36. Используйте Protobuf 3
    ● Больше ЯП
    ● Все поля необязательные
    ● Упаковка repeated полей
    36

    View Slide

  37. Используйте Protobuf 3
    ● Больше ЯП
    ● Все поля необязательные
    ● Упаковка repeated полей
    ● Конвертация из/в JSON
    37

    View Slide

  38. Выводы
    38

    View Slide

  39. Спасибо!
    Антон Жвакин
    Galament Software
    39

    View Slide