Skip to content
This repository has been archived by the owner on Apr 13, 2021. It is now read-only.

eskarimov/highloadcup

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

highloadcup

Python solutions for Mail.ru contest HighLoadCup https://github.com/sat2707/hlcupdocs
Решил описать свой опыт:
Цели выиграть не было, ибо питон, но хотелось посмотреть разные сочетания, набраться опыта, как новичку. Перепробовал всякое – из фреймворков в таком порядке Japronto, Sanic, Falcon, Tornado. В качестве БД перебрал SQLite, MongoDB, потом откопал RethinkDB. Для эшелонированной обороны от обстрелов танка в качестве первого эшелона поставил Memcached. База для запросов с джойнами. Что вышло(всё имхо):

  1. Japronto – сыро, автор сам говорит, что это для ранних последователей. При большом количестве запросов валился с ошибкой excessive_data.
  2. Sanic – uvloop, Flask-like фреймворк, документация гораздо богаче. Пробовал в комбинации с MondoDB. На тестовом обстреле всё отлично, на боевом полный провал (тесты были до апгрейда)
  3. Falcon – тут уже хотел понять, что валит приложение – база или фрейворк. Переписал на Falcon c MongoDB. То же самое. И ошибка была в том, что мультипоточность при загрузке базы я не использовал, ну, что поделать, мало опыта пока.
  4. Откопал RethinkDB – очень крутая документация, всё разжёвано, писать код одно удовольствие. Имеет драйвер к Tornado, умеющий возвращать Future. Слепил такой вот велосипед – Tornado (вкорячил uvloop) + MemCached для быстрого ответа на GET {entity}/{id}, базу для подстраховки от ненайденных сущностей и join’ов. Тут уже проапгрейдили обстрел, можно локально запускать танк, дело пошло веселее. Решение интересное, на тестовом неплохо, но в итоге не успел на полтора часа, забыл вставить обработку исключения, в итоге решение валится на третьем этапе ничего не возвращая, печаль. Зато, теперь торнадо не пугает так сильно, и открыл интересную БД. Если кто заинтересуется – небольшой хинт, команды exists нету - для проверки записи на существование в БД, лучше использовать get_all(id, index=”index_name” ).limit(1).count(), чем get(id).

Releases

No releases published

Packages

No packages published