YET ANOTHER DEVELOPER 🇺🇦

Як відмова від JSON прискорила API у 5 разів

Один з ендпоінтів, що завантажував історію транзакцій (15 000+ записів), працював дуже повільно – 847 мс. Оптимізація бази даних та індексація майже не допомогли, оскільки запит до БД займав лише 94 мс.

Проблема

Профайлінг показав, що 722 мс йшло на серіалізацію даних у JSON та передачу мережею. JSON перетворює все на текст, що робить корисне навантаження (payload) величезним і повільним для парсингу.

Рішення

Автор замінив JSON на MessagePack. Це бінарний формат серіалізації: такі ж структури даних, як у JSON, але у бінарному вигляді (компактніші та швидші).

Результати (для 15 000 записів):

  • Час відповіді: 847 мс – 159 мс (прискорення у 5.3x)
  • Розмір даних: 4.2 MB – 1.1 MB (зменшення на 74%)
  • Клієнтський парсинг: 194 мс – 41 мс

Ціна питання:

Всього ~47 рядків коду (зміни на бекенді Python та фронтенді JS).

Мінуси та висновки:

  • MessagePack робить відповіді нечитабельними для людини (бінарний код у браузері замість тексту)
  • Не має сенсу для маленьких відповідей

Не менш цікавішими були коментарі. Автор пише, що вони не використовували пагінацію – продакт заборонив. На що в коментарях зазначили, що JSON – де-факто є стандартом для API і проблема була не в JSON, а в неправильному використанні API-підходу для задачі, яка фактично є bulk-експортом даних. Зменшення payload-у просто приховало архітектурну проблему.

Коментатор наголошує: система могла залишитись на JSON, якщо б дизайн був правильним:

  • пагінація
  • стрімінг (chunked responses)

🌏 Оригінал: medium.com