Когда начинает трещать по швам Django ORM? Александр Миленко, июнь 2013, Мск

advertisement
Когда начинает трещать по швам
Django ORM?
Александр Миленко, июнь 2013, Мск
e-mail: alvein.flea@gmail.com
skype: alexander.milenko
СРАЗУ!
ideя! – что за диковинка из глубинки?
ideя! – что за диковинка из глубинки?
ideя! – что за диковинка из глубинки?
•
•
•
•
•
5 интернет-магазинов в 4 областях
120 000 просмотров в будни, около 400 000 под НГ ежедневно
1 сервер для клиентов (i7-3930K x 12, 64GB DD3)
1 системный сервер (i7-2600 x 8, 32GB DDR3)
Анализ 90+ поставщиков и конкурентов (более 1кк
номенклатуры) на совпадения, цены и др. радости. (менее 2
часов на всех)
• Актуальность учета остатков по 40 складам с отставанием в 15
минут от 1С
• Определение даты доставки с точностью до 10 минут
ideя! – что за диковинка из глубинки?
• 160 скриптов взаимодействия
• Обновление данных номенклатур по всем сайтам (140к позиций)
менее чем за 80 секунд
• Построенный рабочий процесс: от работы контент-менеджеров
(в том числе с подсчетом ЗП) до работы всех сопутствующих
структур: call-центр, закуп, логистика, служба качества и т.д.
• Порядка 50 различных отчетов и собственные анализы
поведений покупателей.
Выучить к школе:
http://bit.ly/109nXYX
3 года ошибок и побед.
1 класс. Оптимизация логики
• Первая рекламная акция – с 300 посетителей в день до 4000. Мы
открываемся через раз!
• Фильтр в фильтре
• Много лишнего в запросе
http://pastebin.com/bfyH6MZm
3 года ошибок и побед.
1 класс. Оптимизация логики. Правим
• Предварительная подготовка данных
• .values() и .values_list() наши друзья
• Выкидываем лишнее из запроса
http://pastebin.com/bfyH6MZm
3 года ошибок и побед.
1 класс. Оптимизация логики. Итог
Параметр
Было
Стало
Товаров
1000 штук
1000 штук
Запросов
2002 штук
4 штуки
9991 мс
393 мс
Время исполнения
Мы начали открываться каждый раз, но все равно медленно
3 года ошибок и побед.
2 класс. Шаблоны – тихая лошадка
•
•
•
•
Бестолковая магия – котел бежит за вами, но каши не варит.
Красиво? – Да
Функционально – не всегда
Мы ускоряемся
http://pastebin.com/7ghQWmTv
3 года ошибок и побед.
3 класс. Кэширование
• Кэшировать все – зло!
3 года ошибок и побед.
3 класс. Кэширование
• Кэшировать все - зло!
• Не кэшировать – зло!
3 года ошибок и побед.
3 класс. Кэширование
• Кэшировать все - зло!
• Не кэшировать – зло!
• Кэшировать часть – зло!
3 года ошибок и побед.
3 класс. Кэширование
•
•
•
•
Кэшировать все - зло!
Не кэшировать – зло!
Кэшировать часть – зло!
Что делать??
3 года ошибок и побед.
3 класс. Кэширование
•
•
•
•
•
Кэшировать все - зло!
Не кэшировать – зло!
Кэшировать часть – зло!
Что делать??
Кэшировать!
3 года ошибок и побед.
3 класс. Кэширование
• Время кеширования – всегда меньше часа и всегда под
контролем
• Актуальные данные – не кешируем, а выносим
• Инструменты для сброса всего кеша или его части
• Выбор формата данных в кеше
• Больше фрагментации – больше актуальности
• Гибридные ключи – вай-вай красота
http://pastebin.com/tGuWhWuy
3 года ошибок и побед.
3 класс 2 четверть. Вынос данных
• Много баз не бывает = MongoDB, Redis, Memcached
• Фильтры на сайте – платим производительностью за гибкость
• Включаем пыхтелку, начинаем подготавливать больше данных и
переносить из MySQL в MongoDB
• Надежность != скорость MongoDB
3 года ошибок и побед.
3 класс. Итоги
Мы взлетели
3 года ошибок и побед.
4 класс.
Мы тормозим
3 года ошибок и побед.
4 класс. Грязные трюки
• session.engine – rails
• nginx backend node – more than 1 (URL, Server, Bot-s)
• later – the best of the best of the best (c)
3 года ошибок и побед.
4 класс. Грязные трюки
•
•
•
•
session.engine – rails
nginx backend node – more than 1 (URL, Server, Bot-s)
later – the best of the best of the best (c)
Мы опять взлетели :)
3 года ошибок и побед.
5 класс. Берем лопату
• Хватит мяться – в области больше одного города. Нам нужна
доставка, наценка, СЕО и блекджек…
• Исходные данные vs. Правила исходных данных
• Идем на жертву производительности и…
3 года ошибок и побед.
5 класс. Берем лопату
• Хватит мяться – в области больше одного города. Нам нужна
доставка, наценка, СЕО и блекджек…
• Исходные данные vs. Правила исходных данных
• Идем на жертву производительности и… выигрываем!
3 года ошибок и побед.
6 класс. Анализируй это
• Чудеса .values()
• DB vs. Python-lines
• Celery + CSV = счастье логистам
3 года ошибок и побед.
7 класс. Сравнение 1кк строк с 1кк строк
•
•
•
•
10 поставщиков – неделя одного сравнения.
20 поставщиков – что-то линейка товаров уже обновилась..
21 поставщик – терпенье и труд – все перетрут
22 поставщика - понеслась:
3 года ошибок и побед.
7 класс. Сравнение 1кк строк с 1кк строк
•
•
•
•
10 поставщиков – неделя одного сравнения.
20 поставщиков – что-то линейка товаров уже обновилась..
21 поставщик – терпенье и труд – все перетрут
22 поставщика - понеслась:
–
–
–
Подготовка данных – 15 минут
Поиск и сравнение – 30 минут (Левенштейн за бортом)
Привет конкурентам – вы под колпаком!
• ИТОГ: 91 поставщик, 25 минут подготовка, 2 часа сравнения
3 года ошибок и побед.
8 класс. .select_related() и .prefetch_related()
•
•
•
•
Зло
Забыть
Переписать
…
3 года ошибок и побед.
8 класс. .select_related() и .prefetch_related()
•
•
•
•
•
Зло
Забыть
Переписать
…
Модели с большим количеством полей – основная проблема
данной магии
http://pastebin.com/prxnrdRR
3 года ошибок и побед.
9 класс. из 1С и в 1С – идеальный рецепт
•
•
•
•
•
Избыточность
Подготовка данных
Анализ
Транзакция
Скорость, защита от потерь данных, возможность отката при
отказе
http://pastebin.com/G0TEdA3R
3 года ошибок и побед.
10 класс. Ужасный порог в 1,5 секунды
• Откуда дровишки?
• Нужна ли жертва для поднятия производительности?
• Цена поднятия производительности до 0,03 секунд на страницу
на 3х летнем проекте
3 года ошибок и побед.
11 класс. Выпускной
• Раз в неделю – ловим ботов
3 года ошибок и побед.
11 класс. Выпускной
• Раз в неделю – ловим ботов
• Именных ботов – кормим дезинформацией
3 года ошибок и побед.
11 класс. Выпускной
• Раз в неделю – ловим ботов
• Именных ботов – кормим дезинформацией
• Радуемся стабильным продажам 
Высшая школа
Если это не правда – то уж очень хорошо придумано…
(с) итальянская поговорка
Спасибо!
Александр Миленко
alvein.flea@gmail.com
skype: alexander.milenko
+7 919 408 0178
Download