Еще Одно Решение Highloadcup На Go

Думаю, многие пользователи Хабра уже знают, что на прошлой неделе завершился HighLoadCup от Mail.ru (из-за обилия статей участников).

Я также хотел бы поделиться своим решением с сообществом.



Описание задачи

Существует три типа сущностей: Пользователь, Местоположение, Посещение.

Для доступа к ним необходимо написать REST-API, т.е.

получается, что нужно обработать 6 запросов.

  • {GET, POST} /user/:id — получение или смена пользователя
  • {GET, POST} /location/:id — получение или изменение местоположения
  • {GET, POST} /visit/:id — получение или изменение посещения пользователем локации
  • POST /user/new — добавление нового пользователя
  • POST /location/new — добавление нового местоположения
  • POST /visit/new — добавление нового посещения локации пользователем
Как и у любого сервиса, запросы могут быть невалидными и это тоже нужно обрабатывать, но задача упрощается тем, что в целом HTTP-пакет всегда действителен.



Начинать

Изначально я начал писать на C++, но так и не успел его выпустить.

Увидев в топе большое количество решений на Go, я решил тоже попробовать.

Мне этот язык показался гораздо более подходящим для разработки серверных приложений; он имеет весь необходимый функционал «из коробки» и очень качественный.

Однако после первых тестов стало ясно, что ни net/http, ниcoding/json не подходят для этого конкурса из-за большого количества мусора, который генерируется внутри них.



Первый раунд

Изначально данные составляли всего 200 МБ в распакованном виде, поэтому я подумал, что, возможно, можно даже хранить готовые строки JSON для каждой сущности.

В качестве http-сервера по совету конкурсных гошников (спасибо им большое за помощь на старте знакомства с языком) я выбрал быстрыйhttp , для анализа JSON бугер/jsonparser (позволяет парсить без аллокаций и работать только с необходимой информацией, игнорируя остальную), а генерация производилась вручную, так как не требовалась обработка русскоязычных строк.

   

type User struct {

Теги: #Go #highloadcup #Высокая производительность #Go
Вместе с данным постом часто просматривают: