Skip to content

nikita-uvarov/highloadcup-travels-solution

Repository files navigation

Олимпиадный код как он есть, отстойный и беспощадный.

Что это?

Это решение для конкурса Highloadcup (https://highloadcup.ru/, https://github.com/sat2707/hlcupdocs), представляющее собой сервер, реализующий REST API для набора из трёх сущностей (entity, user, location). Список методов API (полное описание - по ссылке):

  1. GET /entity/id
  2. GET /users/id/visits
  3. GET /locations/id/avg
  4. POST /entity/id
  5. POST /entity/new

Цель конкурса - в весьма специфичных условиях максимизировать RPS (requests per second) сервера при ответе на запросы.

Данное решение заняло 1 место на конкурсе.

И что под капотом?

  • Ручная реализация асинхронного сервера на основе epoll API
  • Busy polling (epoll_wait(0))
  • Многопоточная обработка запросов (2 потока отвечают за accept, ещё 2 - за собственно обработку запросов)
  • Ручной парсинг узкого подмножества http (впрочем, некоторая обработка ошибок присутствует, как того требовал конкурс)
  • Ручная in-memory база данных, оптимизированная под запросы GET
  • Минимум аллокаций, собственный аллокатор