Компактные метаданные видео с помощью Protobuf

Наш воркер загрузки (ingest worker) каждые два часа собирает тысячи трендовых видео. Мы отправляем эти данные в три сервиса: сервис ранжирования, сервис прогрева кэша (cache warmer) и задачу аналитики.

Долгое время для передачи этих данных мы использовали JSON. Все работало, пока не начались проблемы.

Одна запись о видео в формате JSON занимала 2,4 КБ. Передача 40 000 записей в три разных сервиса означала передачу 280 МБ избыточного текста каждые два часа. Это расходовало пропускную способность и замедляло наши PHP-воркеры.

Мы перешли на Protocol Buffers (Protobuf). Вот почему мы это сделали и как это изменило нашу систему.

Три основные проблемы JSON:

Как Protobuf решил эти проблемы:

Protobuf использует номера полей вместо имен. В качестве единого источника истины используется .proto файл. Этот файл генерирует код для PHP, Python и Go. Если вы измените схему, код не скомпилируется. Это превращает ошибки времени выполнения (runtime) в ошибки компиляции.

Результаты:

Мы замеряли эти изменения в течение одной недели:

Когда использовать Protobuf:

Не используйте его для всего подряд. Если ваши полезные нагрузки малы или вам нужно, чтобы их было легко читать человеку, придерживайтесь JSON. Используйте Protobuf для высоконагруженного внутреннего трафика, где важнее всего скорость и строгие контракты.

Наши публичные API по-прежнему используют JSON. Наши внутренние сервисы используют Protobuf.

Источник: https://dev.to/ahmet_gedik778845/compact-video-metadata-serialization-with-protobuf-across-php-services-19lk