Створення GraphQL API для пошуку відео

Коли наша база даних відео розрослася до сотень тисяч записів, наше API стало вузьким місцем.

Для відображення одного екрана потрібно було п'ять різних REST-викликів, щоб показати трендові відео, деталі каналу, теги, кількість переглядів та рекомендації. Мобільні користувачі на повільному з'єднанні мали надсилати 30 запитів лише для завантаження однієї сторінки.

GraphQL вирішує цю проблему. Клієнт запитує саме те, що йому потрібно, одним запитом.

Я розробив робочий API для пошуку відео, використовуючи Strawberry та FastAPI. Ось як я це зробив.

Чому Strawberry?

Я протестував Graphene та Ariadne, але Strawberry переміг з таких причин:

• Підказки типів (type hints) є схемою. Ви пишете код на Python, а Strawberry будує типи GraphQL. Ручна синхронізація не потрібна. • Він є асинхронно-орієнтованим (async-native). Це дозволяє API обробляти багато запитів, не блокуючи цикл подій (event loop). • Інтеграція з FastAPI безшовна. Ендпоінт GraphQL розташований поруч із наявними REST-маршрутами. • Вбудований DataLoader. Цей інструмент вирішує проблему N+1 «з коробки».

Стек даних

Дані зберігаються в базі даних SQLite, якою керує PHP-сайт. Я використовую SQLite FTS5 для швидкого повнотекстового пошуку.

Python-сервіс читає цю базу даних як шар лише для читання. Це гарантує наявність єдиного джерела істини.

Щоб пошук був якісним, я поєдную показники релевантності FTS5 із сигналом популярності. Це запобігає ситуації, коли одне вірусне відео затьмарює всі інші результати пошуку.

Вирішення проблеми N+1

Поширеною пасткою в GraphQL є проблема N+1. Якщо ви отримуєте 20 відео, а потім отримуєте канал для кожного з них, наївне API виконає 21 запит до бази даних.

DataLoader вирішує це шляхом пакетної обробки (batching).