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-й версии. Сравнение с некоторыми аналогами. Доклад ориентирован на широкую аудиторию и призван расширить взгляды разработчиков на задачу сериализации структурированных данных.

647751c8d1bc50ecbee13176bdb1b829?s=128

Izhevsk PHP Meetup

September 28, 2017
Tweet

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