0
GOOZY     В поисках идеальной архитектуры2011, e-Legion ltd.               Юрий Буянов Goozyware inc.                     ...
• Пара   слов о проекте• Первая    версия и первые проблемы• Новые    требования и новая архитектура•В   самом низу• Прикл...
СПЕЦИФИКА• Социальность: пользователь   хочет быть постоянно в курсе •2  req/min от каждого пользователя (даже когда он   ...
V.1Portal Users               Client Users                Django               Memcached                MySQL
ПЕРВАЯ НАГРУЗКА
ПЕРВАЯ НАГРУЗКА
ПЕРВАЯ НАГРУЗКА
ПОДРОБНЕЕ О НАГРУЗКЕ   Portal Users               Client Users                   Django                  Memcached        ...
ПОДРОБНЕЕ О НАГРУЗКЕ   Portal Users               Client Users                   Django                  Memcached        ...
LOAD TEST• Пропускная   способность: 50 TPS• Отклик: 2500   ms
НЕМНОГО ЧИСЕЛ• 11   000 пользователей• 1000   онлайн (в пике)•2   сервера• 500   мб данных
НЕМНОГО ЧИСЕЛ• 11   000 пользователей   • 11   000 пользователей• 1000   онлайн (в пике)   • 23   000 стикеров•2   сервера...
НОВЫЕ ТРЕБОВАНИЯ    1 000 000
НОВЫЕ ТРЕБОВАНИЯ•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов
НОВЫЕ ТРЕБОВАНИЯ•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов        НЕ ОК !
V.2Portal Users             Client Users  Django                 API Server               Storage
V.2Portal Users             Client Users  Django                 Scala + Lift               Storage
SCALA• Работает   на JVM• Полностью   совместима с Java• Статическая   типизация• Лаконичность   и выразительность• ООП   ...
V.2Portal Users             Client Users  Django                 Scala + Lift               MongoDB
MONGODB• Document   - Oriented        > db.users.findOne( {                                      "phones.mob" : "+79219423...
РЕЗУЛЬТАТЫ                  TPS500375250                            450125      50          100  0      Old       Old tune...
ТЕСТЫ И CIprintln("Trying to create group with slug $slug")reqBody = [name: “Test Group”, slug: “test”, ... ]builder.reque...
ТЕСТЫ И CI• Scala   (main + unit) : 10 500• Groovy    (functional): 5 500• Прогон     при каждом Push• Тестирование  интег...
РАЗНОЕ• Полнотекстовый      поиск: ElasticSearch• Сборка: Gradle• VCS: Git• CI: Jenkins   (ex-Hudson)
ХОСТИНГ• Май   2009 - OVH (Франция)• Декабрь   2010 - Exchange Guru (NY)• Апрель   2011 - Amazon EC2
US-EAST-1BVPC              HAProxy               HAProxy      API                  API                Portal      DB1     ...
21 АПРЕЛЯ 2011
US-EAST-1B                US-EAST-1B               US-EAST-2B        HAProxy                   HAProxy   API           Por...
• Сервера   и реплики в нескольких зонах• Бэкап-реплика   в другом регионе• Автоматическоеуправление конфигурацией для быс...
СИНЯКИ И ШИШКИ• Bleeding   edge не такой уж bleeding• Scala: разработчиков   мало, но они в тельняшках• Gradle   + Scalac ...
LOOKING FORWARD• Уход   от tomcat и сервлетов• Автоматизация   нагрузочного тестирования• Comet   / Websockets• Push   для...
Q&AЮрий Буяновyuri.buyanov@e-legion.com     http://www.e-legion.ru@digal                               http://goozy.com
Юрий Буянов «Архитектура Goozy»
Upcoming SlideShare
Loading in...5
×

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

792

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
792
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. GOOZY В поисках идеальной архитектуры2011, e-Legion ltd. Юрий Буянов Goozyware inc. @digal
  2. 2. • Пара слов о проекте• Первая версия и первые проблемы• Новые требования и новая архитектура•В самом низу• Приключения с хостингом• Синяки и шишки• Looking Forward
  3. 3. СПЕЦИФИКА• Социальность: пользователь хочет быть постоянно в курсе •2 req/min от каждого пользователя (даже когда он ничего не делает).• Вездесущность: работает на всех сайтах • Запрос при открытии каждой страницы.
  4. 4. V.1Portal Users Client Users Django Memcached MySQL
  5. 5. ПЕРВАЯ НАГРУЗКА
  6. 6. ПЕРВАЯ НАГРУЗКА
  7. 7. ПЕРВАЯ НАГРУЗКА
  8. 8. ПОДРОБНЕЕ О НАГРУЗКЕ Portal Users Client Users Django Memcached MySQL
  9. 9. ПОДРОБНЕЕ О НАГРУЗКЕ Portal Users Client Users Django Memcached MySQL
  10. 10. LOAD TEST• Пропускная способность: 50 TPS• Отклик: 2500 ms
  11. 11. НЕМНОГО ЧИСЕЛ• 11 000 пользователей• 1000 онлайн (в пике)•2 сервера• 500 мб данных
  12. 12. НЕМНОГО ЧИСЕЛ• 11 000 пользователей • 11 000 пользователей• 1000 онлайн (в пике) • 23 000 стикеров•2 сервера • 30 000 комментариев• 500 мб данных •2 200 000 таймлайн-записей
  13. 13. НОВЫЕ ТРЕБОВАНИЯ 1 000 000
  14. 14. НОВЫЕ ТРЕБОВАНИЯ•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов
  15. 15. НОВЫЕ ТРЕБОВАНИЯ•1 000 000 пользователей•> 100 000 онлайн•> 10 000 TPS•> 50 Гб данных•200 серверов НЕ ОК !
  16. 16. V.2Portal Users Client Users Django API Server Storage
  17. 17. V.2Portal Users Client Users Django Scala + Lift Storage
  18. 18. SCALA• Работает на JVM• Полностью совместима с Java• Статическая типизация• Лаконичность и выразительность• ООП + ФП
  19. 19. V.2Portal Users Client Users Django Scala + Lift MongoDB
  20. 20. MONGODB• Document - Oriented > db.users.findOne( { "phones.mob" : "+792194234" })• Вторичные индексы { "_id" : ObjectId ("4d94d822596f0e3f4d4a51bc"), "name" : "Vasya",• Язык запросов "age" : 22, "phones" : { "mob" : "+792194234", "home" : "+812342341"• Атомарные апдейты }, "roles" : [ "admin", "staff"• Скорость ] }• Автошардинг и репликация
  21. 21. РЕЗУЛЬТАТЫ TPS500375250 450125 50 100 0 Old Old tuned New
  22. 22. ТЕСТЫ И 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.") }}
  23. 23. ТЕСТЫ И CI• Scala (main + unit) : 10 500• Groovy (functional): 5 500• Прогон при каждом Push• Тестирование интеграции с поиском, Twitter, S3, etc.
  24. 24. РАЗНОЕ• Полнотекстовый поиск: ElasticSearch• Сборка: Gradle• VCS: Git• CI: Jenkins (ex-Hudson)
  25. 25. ХОСТИНГ• Май 2009 - OVH (Франция)• Декабрь 2010 - Exchange Guru (NY)• Апрель 2011 - Amazon EC2
  26. 26. US-EAST-1BVPC HAProxy HAProxy API API Portal DB1 DB2 DB3 Memcached ElasticSearch Stats & Munin
  27. 27. 21 АПРЕЛЯ 2011
  28. 28. US-EAST-1B US-EAST-1B US-EAST-2B HAProxy HAProxy API Portal API Portal DB Master DB Replica 1 DB Replica 2 ... ... ... ... ... ...
  29. 29. • Сервера и реплики в нескольких зонах• Бэкап-реплика в другом регионе• Автоматическоеуправление конфигурацией для быстрого развёртывания (Opscode Chef)• Полное устранение SPOF (Memcached)• Мониторинг и алерты
  30. 30. СИНЯКИ И ШИШКИ• Bleeding edge не такой уж bleeding• Scala: разработчиков мало, но они в тельняшках• Gradle + Scalac - время сборки• MongoDB - просто RTFM• EC2 - непостоянные IP-адреса
  31. 31. LOOKING FORWARD• Уход от tomcat и сервлетов• Автоматизация нагрузочного тестирования• Comet / Websockets• Push для мобильных• Автоматическое управление конфигурацией и развёртыванием
  32. 32. Q&AЮрий Буяновyuri.buyanov@e-legion.com http://www.e-legion.ru@digal http://goozy.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×