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

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

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

  4. О чем речь? • Имеем структурированные данные • Хотим осуществить

    их ввод/вывод (например, через файловую систему или по сети) 4
  5. Варианты решения 5 • Придумать свой формат

  6. Варианты решения 6 • Придумать свой формат • Использовать сериализацию

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

    языка(C#, Java) • XML • JSON • Protocol Buffers • ...
  8. Что такое Protocol Buffers? 8

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

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

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

    Протокол сериализации • Генератор кода 11
  12. Пример message User { string name = 1; uint32 age

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

    = 2; repeated string account = 3; } >protoc.exe user.proto --php_out=. 13
  14. Пример include 'User.php’; 14

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

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

    $user->serializeToString(); $user2->mergeFromString($data); 16
  17. Чем это лучше JSON? 17

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

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

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

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

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

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

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

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

    его имени • Незаполненные поля не представлены • Особое представление целых чисел ◦ int64 ◦ sint64 ◦ uint64 ◦ fixed64 ◦ sfixed64
  26. Плавающий размер представления • 7 бит полезной нагрузки • 1

    бит признак наличия еще байта 127 - 1 байт 01111111 128 - 2 байта 10000000 00000001 26
  27. Представление отрицательных чисел 27 Исходное число Представление 0 0 -1

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

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

    Большие sfixed64/32 fixed64/32
  30. Часто используемые поля Ключ поля - целое число(его номер +

    тип) [0][1111][111] • Поля с 1 по 15 занимают 1 байт • С 16 по 2047 - 2 байта 30
  31. Диспетчеризация сообщений message AddUser { ... } message DeleteUser {

    ... } 31
  32. Диспетчеризация сообщений message Request { enum Type { ADD_USER =

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

    1; DeleteUser delete_user = 2; } } 33
  34. Используйте Protobuf 3 • Больше ЯП 34

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

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

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

    • Упаковка repeated полей • Конвертация из/в JSON 37
  38. Выводы 38

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