Upload
e-legion
View
1.152
Download
2
Embed Size (px)
DESCRIPTION
Юрий БуяновCode Camp 2011
Citation preview
GOOZYВ поисках идеальной архитектуры
2011, e-Legion ltd.Goozyware inc.
Юрий Буянов@digal
•Пара слов о проекте
•Первая версия и первые проблемы
•Новые требования и новая архитектура
•В самом низу
•Приключения с хостингом
•Синяки и шишки
•Looking Forward
СПЕЦИФИКА
• Социальность: пользователь хочет быть постоянно в курсе
• 2 req/min от каждого пользователя (даже когда он ничего не делает).
• Вездесущность: работает на всех сайтах
• Запрос при открытии каждой страницы.
V.1
Django
Memcached
Portal Users Client Users
MySQL
ПЕРВАЯ НАГРУЗКА
ПЕРВАЯ НАГРУЗКА
ПЕРВАЯ НАГРУЗКА
ПОДРОБНЕЕ О НАГРУЗКЕ
Django
Memcached
Portal Users Client Users
MySQL
ПОДРОБНЕЕ О НАГРУЗКЕ
Django
Memcached
Portal Users Client Users
MySQL
LOAD TEST
• Пропускная способность: 50 TPS
•Отклик: 2500 ms
НЕМНОГО ЧИСЕЛ
• 11 000 пользователей
• 1000 онлайн (в пике)
• 2 сервера
• 500 мб данных
НЕМНОГО ЧИСЕЛ
• 11 000 пользователей
• 1000 онлайн (в пике)
• 2 сервера
• 500 мб данных
• 11 000 пользователей
• 23 000 стикеров
• 30 000 комментариев
• 2 200 000 таймлайн-записей
НОВЫЕ ТРЕБОВАНИЯ
1 000 000
НОВЫЕ ТРЕБОВАНИЯ
•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов
НОВЫЕ ТРЕБОВАНИЯ
•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов НЕ ОК !
V.2
Django
Portal Users Client Users
Storage
API Server
V.2
Django
Portal Users Client Users
Storage
Scala + Lift
SCALA
• Работает на JVM
• Полностью совместима с Java
• Статическая типизация
• Лаконичность и выразительность
•ООП + ФП
V.2
Django
Portal Users Client Users
MongoDB
Scala + Lift
MONGODB
•Document - Oriented
• Вторичные индексы
• Язык запросов
• Атомарные апдейты
• Скорость
• Автошардинг и репликация
> db.users.findOne( { "phones.mob" : "+792194234"})
{ "_id" : ObjectId("4d94d822596f0e3f4d4a51bc"), "name" : "Vasya", "age" : 22, "phones" : { "mob" : "+792194234", "home" : "+812342341" }, "roles" : [ "admin", "staff" ]}
РЕЗУЛЬТАТЫ
0
125
250
375
500
Old Old tuned New
450
10050
TPS
ТЕСТЫ И 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.") }}
ТЕСТЫ И CI
• Scala (main + unit) : 10 500
• Groovy (functional): 5 500
• Прогон при каждом Push
• Тестирование интеграции с поиском, Twitter, S3, etc.
РАЗНОЕ
• Полнотекстовый поиск: ElasticSearch
• Сборка: Gradle
• VCS: Git
• CI: Jenkins (ex-Hudson)
ХОСТИНГ
•Май 2009 - OVH (Франция)
• Декабрь 2010 - Exchange Guru (NY)
• Апрель 2011 - Amazon EC2
US-EAST-1B VPC
API API Portal
DB1 DB2 DB3
Memcached Stats & MuninElasticSearch
HAProxy HAProxy
21 АПРЕЛЯ 2011
US-EAST-1B
API
DB Master
...
HAProxy
... ...
Portal
US-EAST-1B
API
DB Replica 1
...
HAProxy
... ...
Portal
US-EAST-2B
DB Replica 2
•Сервера и реплики в нескольких зонах
•Бэкап-реплика в другом регионе
•Автоматическое управление конфигурацией для быстрого развёртывания (Opscode Chef)
•Полное устранение SPOF (Memcached)
•Мониторинг и алерты
СИНЯКИ И ШИШКИ
• Bleeding edge не такой уж bleeding
• Scala: разработчиков мало, но они в тельняшках
• Gradle + Scalac - время сборки
•MongoDB - просто RTFM
• EC2 - непостоянные IP-адреса
LOOKING FORWARD
• Уход от tomcat и сервлетов
• Автоматизация нагрузочного тестирования
• Comet / Websockets
• Push для мобильных
• Автоматическое управление конфигурацией и развёртыванием