31
Как modnaKasta трансформировалась Александр Соловьëв, CTO modnaKasta

Александр Соловьев "Как modnaKasta трансформировалась"

  • Upload
    fwdays

  • View
    967

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Александр Соловьев "Как modnaKasta трансформировалась"

Как modnaKastaтрансформироваласьАлександр Соловьëв, CTO modnaKasta

Page 2: Александр Соловьев "Как modnaKasta трансформировалась"

750 RPS3-6k пользователей на сайте днëм одновременно(по версии GA)120 Gb размер базы~80-100k строк Python'а

2 / 30

Page 3: Александр Соловьев "Как modnaKasta трансформировалась"

Много ли это?Достаточно, чтоб умирать от

нагрузки

3 / 30

Page 4: Александр Соловьев "Как modnaKasta трансформировалась"

Как оно было

4 / 30

Page 5: Александр Соловьев "Как modnaKasta трансформировалась"

Метадатапары

5 / 30

Page 6: Александр Соловьев "Как modnaKasta трансформировалась"

И в них у нас хранится...=# SELECT k.key, k.id, COUNT(p.id)-# FROM product_metadatapair p-# JOIN product_metadatakey k ON p.key_id = k.id-# GROUP BY k.key, k.id-# ORDER BY COUNT(p.id); key | id | count----------+----+---------- Объем | 18 | 26 | 3 | 27 Описание | 17 | 176 Номер | 2 | 443 Pазмер | 1 | 3112 Размер | 16 | 15212192(6 rows)

6 / 30

Page 7: Александр Соловьев "Как modnaKasta трансформировалась"

И наличие...

7 / 30

Page 8: Александр Соловьев "Как modnaKasta трансформировалась"

И корзина!

8 / 30

Page 9: Александр Соловьев "Как modnaKasta трансформировалась"

Problems?22 запроса на 1 размер

9 / 30

Page 10: Александр Соловьев "Как modnaKasta трансформировалась"

Problems?22 запроса на 1 размер

110 запросов на 5 размеров

10 / 30

Page 11: Александр Соловьев "Как modnaKasta трансформировалась"

Problems?22 запроса на 1 размер

110 запросов на 5 размеров

Это исправили кешированием

11 / 30

Page 12: Александр Соловьев "Как modnaKasta трансформировалась"

Problems?22 запроса на 1 размер

110 запросов на 5 размеров

Это исправили кешированием

Которое завязано на корзину, поэтомукешируется для каждого юзера отдельно

12 / 30

Page 13: Александр Соловьев "Как modnaKasta трансформировалась"

А как должно быть?

13 / 30

Page 14: Александр Соловьев "Как modnaKasta трансформировалась"

А еще заказыЗаказ создавался на входе в корзинуPayment'ы создавались при выборе, но никогда неудалялись

Пустых неоформленных заказов в базе миллионыКорзина не синглтон, найти текущую - проблема

14 / 30

Page 15: Александр Соловьев "Как modnaKasta трансформировалась"

Восстановление пароля!commit f2c3eaa1e0747075c005d74094a5391b51498cf6Author: v.ishchenko <[email protected]>Date: Thu Feb 5 17:56:09 2015 +0200

Fix password reset send letter

diff --git a/user/urls.py b/urls.py@@ -166 +166 @@

- url(r'^reset/(?P<confirm>[A-Za-z0-9\-]+)/$',+ url(r'^reset/(?P<confirm>[^/]+)/$',

15 / 30

Page 16: Александр Соловьев "Как modnaKasta трансформировалась"

И остальноеМиграций нетРазмерные сетки картинкамиБаннерная система на KyotoDB/Lua/Python/JSПочтовая очередь на KyotoDB на каждом сервереотдельно

16 / 30

Page 17: Александр Соловьев "Как modnaKasta трансформировалась"

При чëм здесь фронтэнд

17 / 30

Page 18: Александр Соловьев "Как modnaKasta трансформировалась"

При чëм здесь фронтэнд

Чëрнаяпятница

18 / 30

Page 19: Александр Соловьев "Как modnaKasta трансформировалась"

Теперь

19 / 30

Page 20: Александр Соловьев "Как modnaKasta трансформировалась"

Что там у насReactClojureScriptDatascriptJavelin

20 / 30

Page 21: Александр Соловьев "Как modnaKasta трансформировалась"

ReactНу какие собственноальтернативы?

21 / 30

Page 22: Александр Соловьев "Как modnaKasta трансформировалась"

ClojureScriptworth repeatingЛисп

Персистентные структуры данныхФункциональное программированиеКомпилируется в JSМинифицируется в advanced режиме ClosureCompiler

22 / 30

Page 23: Александр Соловьев "Как modnaKasta трансформировалась"

Архитектура

23 / 30

Page 24: Александр Соловьев "Как modnaKasta трансформировалась"

Персистентная база данных в памятиЯзык запросов DatalogФормат хранения: триплетыСсылки, джойны, агрегации

24 / 30

Page 25: Александр Соловьев "Как modnaKasta трансформировалась"

Получить из базы баннеры(d/q db

'[:in $ ?contains-now? :find ?e :where [?e :banner/id] [?e :starts-at ?start] [?e :finishes-at ?finish] [(?contains-now? ?start ?finish)]]

(fn [start finish] (time/within? start finish (time/now))))

25 / 30

Page 26: Александр Соловьев "Как modnaKasta трансформировалась"

Пример компонента

Компонент Аргумент - , рисует баннера для этого местаРеагирует на ячейку Рисует список баннеров

(rum/defc Banners < rum/reactive [id] (let [all-banners (rum/react BANNERS) banners (get all-banners id)] [:div {:class "banners"} (for [banner banners] [:img {:src banner :data-banner-id id}])]))

Bannersid

BANNERS

26 / 30

Page 27: Александр Соловьев "Как modnaKasta трансформировалась"

Серверный рендеринг

- функция, котораяотрисовывает реакт-приложение в строкуПолученные для рендеринга данные отдаются наклиент

(defn handler [req res] (.writeHead res 200 {"Content-Type" "text/html"}) (main/render-to-string (.-url req) (fn [initial content] (.end res (render-template initial content)))))

(def app (.createServer http handler))(.listen app 6000 "0.0.0.0")

render-to-string

27 / 30

Page 28: Александр Соловьев "Как modnaKasta трансформировалась"

Весь рендеринг

возвращаетколичество запросов "в процессе"

(defn render-to-string [url callback] (router/set-route url)

(let [comp (router/Root data/db)] ;; Отрендерить 1 раз, чтоб запустить AJAX-запросы (js/React.renderToString comp)

;; Ждëм завершения запросов (add-watch xhr/current-queries ::render (fn [_ _ _ value] (when (zero? (get-xhr-request-count)) (callback db (js/React.renderToString comp)))))))

get-xhr-request-count

28 / 30

Page 29: Александр Соловьев "Как modnaKasta трансформировалась"

И что, удобно?React же :-)Live reload без потери состоянияLive reload есть и на сервереСтруктурное редактирование это счастье (paredit)Количество кода меньше, чем на JSШаринг кода между сервером и клиентом !Tooling вокруг очень крутой

29 / 30

Page 30: Александр Соловьев "Как modnaKasta трансформировалась"

(map answer(some good? questions))

30 / 30

Page 31: Александр Соловьев "Как modnaKasta трансформировалась"