yurybyyanov (e-legion) @ codecamp2011

33
GOOZY В поисках идеальной архитектуры 2011, e-Legion ltd. Goozyware inc. Юрий Буянов @digal

Upload: codecamp

Post on 06-Dec-2014

468 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: YuryByyanov (e-legion) @ CodeCamp2011

GOOZYВ поисках идеальной архитектуры

2011, e-Legion ltd.Goozyware inc.

Юрий Буянов@digal

Page 2: YuryByyanov (e-legion) @ CodeCamp2011

•Пара слов о проекте

•Первая версия и первые проблемы

•Новые требования и новая архитектура

•В самом низу

•Приключения с хостингом

•Синяки и шишки

•Looking Forward

Page 3: YuryByyanov (e-legion) @ CodeCamp2011
Page 4: YuryByyanov (e-legion) @ CodeCamp2011

СПЕЦИФИКА

• Социальность: пользователь хочет быть постоянно в курсе

• 2 req/min от каждого пользователя (даже когда он ничего не делает).

• Вездесущность: работает на всех сайтах

• Запрос при открытии каждой страницы.

Page 5: YuryByyanov (e-legion) @ CodeCamp2011

V.1

Django

Memcached

Portal Users Client Users

MySQL

Page 6: YuryByyanov (e-legion) @ CodeCamp2011

ПЕРВАЯ НАГРУЗКА

Page 7: YuryByyanov (e-legion) @ CodeCamp2011

ПЕРВАЯ НАГРУЗКА

Page 8: YuryByyanov (e-legion) @ CodeCamp2011

ПЕРВАЯ НАГРУЗКА

Page 9: YuryByyanov (e-legion) @ CodeCamp2011

ПОДРОБНЕЕ О НАГРУЗКЕ

Django

Memcached

Portal Users Client Users

MySQL

Page 10: YuryByyanov (e-legion) @ CodeCamp2011

ПОДРОБНЕЕ О НАГРУЗКЕ

Django

Memcached

Portal Users Client Users

MySQL

Page 11: YuryByyanov (e-legion) @ CodeCamp2011

LOAD TEST

• Пропускная способность: 50 TPS

•Отклик: 2500 ms

Page 12: YuryByyanov (e-legion) @ CodeCamp2011

НЕМНОГО ЧИСЕЛ

• 11 000 пользователей

• 1000 онлайн (в пике)

• 2 сервера

• 500 мб данных

Page 13: YuryByyanov (e-legion) @ CodeCamp2011

НЕМНОГО ЧИСЕЛ

• 11 000 пользователей

• 1000 онлайн (в пике)

• 2 сервера

• 500 мб данных

• 11 000 пользователей

• 23 000 стикеров

• 30 000 комментариев

• 2 200 000 таймлайн-записей

Page 14: YuryByyanov (e-legion) @ CodeCamp2011

НОВЫЕ ТРЕБОВАНИЯ

1 000 000

Page 15: YuryByyanov (e-legion) @ CodeCamp2011

НОВЫЕ ТРЕБОВАНИЯ

•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов

Page 16: YuryByyanov (e-legion) @ CodeCamp2011

НОВЫЕ ТРЕБОВАНИЯ

•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов НЕ ОК !

Page 17: YuryByyanov (e-legion) @ CodeCamp2011

V.2

Django

Portal Users Client Users

Storage

API Server

Page 18: YuryByyanov (e-legion) @ CodeCamp2011

V.2

Django

Portal Users Client Users

Storage

Scala + Lift

Page 19: YuryByyanov (e-legion) @ CodeCamp2011

SCALA

• Работает на JVM

• Полностью совместима с Java

• Статическая типизация

• Лаконичность и выразительность

•ООП + ФП

Page 20: YuryByyanov (e-legion) @ CodeCamp2011

V.2

Django

Portal Users Client Users

MongoDB

Scala + Lift

Page 21: YuryByyanov (e-legion) @ CodeCamp2011

MONGODB

•Document - Oriented

• Вторичные индексы

• Язык запросов

• Атомарные апдейты

• Скорость

• Автошардинг и репликация

> db.users.findOne( { "phones.mob" : "+792194234"})

{ "_id" : ObjectId("4d94d822596f0e3f4d4a51bc"), "name" : "Vasya", "age" : 22, "phones" : { "mob" : "+792194234", "home" : "+812342341" }, "roles" : [ "admin", "staff" ]}

Page 22: YuryByyanov (e-legion) @ CodeCamp2011

РЕЗУЛЬТАТЫ

0

125

250

375

500

Old Old tuned New

450

10050

TPS

Page 23: YuryByyanov (e-legion) @ CodeCamp2011

ТЕСТЫ И CIprintln("Trying to create group with slug $slug")reqBody = [name: “Test Group”, slug: “test”, ... ]

builder.request(POST, JSON) { requestContentType = URLENC uri.path = "internal/groups/create.json" body = reqBody

response.success = { resp, json -> println(json.toString()) assertEquals(201, resp.status) assert json.name == reqBody.name assert json.description == reqBody.description assert json.slug == reqBody.slug.toLowerCase() assert json.creatorId == reqBody.creatorId assert json.counters.members == 1 assert json.counters.notes == 0 }

response.failure = { resp, json -> println(resp.statusLine) println(json.toString()) fail("Request for creating group $slug failed.") }}

Page 24: YuryByyanov (e-legion) @ CodeCamp2011

ТЕСТЫ И CI

• Scala (main + unit) : 10 500

• Groovy (functional): 5 500

• Прогон при каждом Push

• Тестирование интеграции с поиском, Twitter, S3, etc.

Page 25: YuryByyanov (e-legion) @ CodeCamp2011

РАЗНОЕ

• Полнотекстовый поиск: ElasticSearch

• Сборка: Gradle

• VCS: Git

• CI: Jenkins (ex-Hudson)

Page 26: YuryByyanov (e-legion) @ CodeCamp2011

ХОСТИНГ

•Май 2009 - OVH (Франция)

• Декабрь 2010 - Exchange Guru (NY)

• Апрель 2011 - Amazon EC2

Page 27: YuryByyanov (e-legion) @ CodeCamp2011

US-EAST-1B VPC

API API Portal

DB1 DB2 DB3

Memcached Stats & MuninElasticSearch

HAProxy HAProxy

Page 28: YuryByyanov (e-legion) @ CodeCamp2011

21 АПРЕЛЯ 2011

Page 29: YuryByyanov (e-legion) @ CodeCamp2011

US-EAST-1B

API

DB Master

...

HAProxy

... ...

Portal

US-EAST-1B

API

DB Replica 1

...

HAProxy

... ...

Portal

US-EAST-2B

DB Replica 2

Page 30: YuryByyanov (e-legion) @ CodeCamp2011

•Сервера и реплики в нескольких зонах

•Бэкап-реплика в другом регионе

•Автоматическое управление конфигурацией для быстрого развёртывания (Opscode Chef)

•Полное устранение SPOF (Memcached)

•Мониторинг и алерты

Page 31: YuryByyanov (e-legion) @ CodeCamp2011

СИНЯКИ И ШИШКИ

• Bleeding edge не такой уж bleeding

• Scala: разработчиков мало, но они в тельняшках

• Gradle + Scalac - время сборки

•MongoDB - просто RTFM

• EC2 - непостоянные IP-адреса

Page 32: YuryByyanov (e-legion) @ CodeCamp2011

LOOKING FORWARD

• Уход от tomcat и сервлетов

• Автоматизация нагрузочного тестирования

• Comet / Websockets

• Push для мобильных

• Автоматическое управление конфигурацией и развёртыванием