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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  38. Выводы
    38

    View full-size slide

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

    View full-size slide