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

Юрий Буянов «Архитектура Goozy»

Embed Size (px)

DESCRIPTION

Юрий БуяновCode Camp 2011

Citation preview

Page 1: Юрий Буянов «Архитектура Goozy»

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

2011, e-Legion ltd.Goozyware inc.

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

Page 2: Юрий Буянов «Архитектура Goozy»

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

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

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

•В самом низу

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

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

•Looking Forward

Page 3: Юрий Буянов «Архитектура Goozy»
Page 4: Юрий Буянов «Архитектура Goozy»

СПЕЦИФИКА

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

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

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

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

Page 5: Юрий Буянов «Архитектура Goozy»

V.1

Django

Memcached

Portal Users Client Users

MySQL

Page 6: Юрий Буянов «Архитектура Goozy»

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

Page 7: Юрий Буянов «Архитектура Goozy»

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

Page 8: Юрий Буянов «Архитектура Goozy»

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

Page 9: Юрий Буянов «Архитектура Goozy»

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

Django

Memcached

Portal Users Client Users

MySQL

Page 10: Юрий Буянов «Архитектура Goozy»

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

Django

Memcached

Portal Users Client Users

MySQL

Page 11: Юрий Буянов «Архитектура Goozy»

LOAD TEST

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

•Отклик: 2500 ms

Page 12: Юрий Буянов «Архитектура Goozy»

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

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

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

• 2 сервера

• 500 мб данных

Page 13: Юрий Буянов «Архитектура Goozy»

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

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

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

• 2 сервера

• 500 мб данных

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

• 23 000 стикеров

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

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

Page 14: Юрий Буянов «Архитектура Goozy»

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

1 000 000

Page 15: Юрий Буянов «Архитектура Goozy»

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

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

Page 16: Юрий Буянов «Архитектура Goozy»

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

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

Page 17: Юрий Буянов «Архитектура Goozy»

V.2

Django

Portal Users Client Users

Storage

API Server

Page 18: Юрий Буянов «Архитектура Goozy»

V.2

Django

Portal Users Client Users

Storage

Scala + Lift

Page 19: Юрий Буянов «Архитектура Goozy»

SCALA

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

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

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

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

•ООП + ФП

Page 20: Юрий Буянов «Архитектура Goozy»

V.2

Django

Portal Users Client Users

MongoDB

Scala + Lift

Page 21: Юрий Буянов «Архитектура Goozy»

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: Юрий Буянов «Архитектура Goozy»

РЕЗУЛЬТАТЫ

0

125

250

375

500

Old Old tuned New

450

10050

TPS

Page 23: Юрий Буянов «Архитектура Goozy»

ТЕСТЫ И 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: Юрий Буянов «Архитектура Goozy»

ТЕСТЫ И CI

• Scala (main + unit) : 10 500

• Groovy (functional): 5 500

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

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

Page 25: Юрий Буянов «Архитектура Goozy»

РАЗНОЕ

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

• Сборка: Gradle

• VCS: Git

• CI: Jenkins (ex-Hudson)

Page 26: Юрий Буянов «Архитектура Goozy»

ХОСТИНГ

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

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

• Апрель 2011 - Amazon EC2

Page 27: Юрий Буянов «Архитектура Goozy»

US-EAST-1B VPC

API API Portal

DB1 DB2 DB3

Memcached Stats & MuninElasticSearch

HAProxy HAProxy

Page 28: Юрий Буянов «Архитектура Goozy»

21 АПРЕЛЯ 2011

Page 29: Юрий Буянов «Архитектура Goozy»

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: Юрий Буянов «Архитектура Goozy»

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

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

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

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

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

Page 31: Юрий Буянов «Архитектура Goozy»

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

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

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

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

•MongoDB - просто RTFM

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

Page 32: Юрий Буянов «Архитектура Goozy»

LOOKING FORWARD

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

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

• Comet / Websockets

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

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