Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
1
2 
Архитектура 
высоконагруженного 
сервиса на примере 
бэкенда Яндекс.Store 
Андрей Урусов, Алексей Васильев
3 
Магазин приложений для Android
4 
Магазин приложений для Android
5 
Магазин приложений для Android
6 
Процесс разработки 
! Непрерывная интеграция 
– Система контроля версий — git 
– Автосборка — TeamCity 
– Код-ревью — S...
7 
Архитектура системы
8 
Балансер 
nginx 
C++ backend 
(fastcgi-daemon) 
Смежные сервисы 
Авторизация 
Биллинг 
Поиск 
Отзывы и рейтинг 
Ресайзе...
9 
Балансер 
nginx 
C++ backend 
(fastcgi-daemon) 
Смежные сервисы 
Авторизация 
Биллинг 
Поиск 
Отзывы и рейтинг 
Ресайзе...
10 
Protobuf 
message Date 
{ 
required uint32 day = 1; 
required uint32 month = 2; 
required uint32 year = 3; 
} 
message...
11 
Обратная совместимость 
message Product 
{ 
enum ImageSize 
{ 
DEFAULT = 0; 
SMALL = 1; 
MEDIUM = 2; 
LARGE = 3; 
} 
o...
12 
Наследование 
message Application 
{ 
required uint32 version = 1; 
} 
message Subscription 
{ 
required Time period =...
13 
Наследование 
message Product 
{ 
required string title = 1; 
required Price price = 2; 
enum Type 
{ 
APPLICATION = 0...
14 
Наследование 
http://www.indelible.org/ink/protobuf-polymorphism/ 
https://clck.ru/9Jknx
15 
Балансер 
nginx 
C++ backend 
(fastcgi-daemon) 
Смежные сервисы 
Авторизация 
Биллинг 
Поиск 
Отзывы и рейтинг 
Ресайз...
16 
Прокси с авторизацией 
nginx 
C++ backend 
(fastcgi-daemon) 
nginx 
C++ backend 
(fastcgi-daemon) 
location /download ...
17 
Балансер 
nginx 
C++ backend 
(fastcgi-daemon) 
Смежные сервисы 
Авторизация 
Биллинг 
Поиск 
Отзывы и рейтинг 
Ресайз...
18 
Драйвер MongoDB 
mongo::DBClientConnection connection; 
connection.connect(config->GetDbAddress()); 
connection.auth( ...
19 
Драйвер MongoDB 
Assertion: 13111: 
wrong type for field (title) 2 != 16
20 
Алексей Васильев 
loudhorr@yandex-team.ru 
Андрей Урусов 
drobus@yandex-team.ru
Upcoming SlideShare
Loading in …5
×

Архитектура высоконагруженного сервиса на примере бэкенда Яндекс.Store — Андрей Урусов, Алексей Васильев

1,641 views

Published on

Яндекс.Store — это магазин приложений для устройств на платформе Android. Для безотказной работы ему необходим мощный бэкенд. Мы поговорим об архитектуре сервиса: об особенностях использования MongoDB в высоконагруженных проектах, а также о том, как мы проектировали протокол взаимодействия.

Published in: Technology
  • Be the first to comment

Архитектура высоконагруженного сервиса на примере бэкенда Яндекс.Store — Андрей Урусов, Алексей Васильев

  1. 1. 1
  2. 2. 2 Архитектура высоконагруженного сервиса на примере бэкенда Яндекс.Store Андрей Урусов, Алексей Васильев
  3. 3. 3 Магазин приложений для Android
  4. 4. 4 Магазин приложений для Android
  5. 5. 5 Магазин приложений для Android
  6. 6. 6 Процесс разработки ! Непрерывная интеграция – Система контроля версий — git – Автосборка — TeamCity – Код-ревью — Stash – Автотесты — Boost Unit Test Framework ! Нагрузочное тестирование — Яндекс.Танк ! Разработка в облаке — X11/ssh ! Пятничные холивары
  7. 7. 7 Архитектура системы
  8. 8. 8 Балансер nginx C++ backend (fastcgi-daemon) Смежные сервисы Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок Архитектура API Elliptics MongoDB
  9. 9. 9 Балансер nginx C++ backend (fastcgi-daemon) Смежные сервисы Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок Архитектура API Elliptics MongoDB
  10. 10. 10 Protobuf message Date { required uint32 day = 1; required uint32 month = 2; required uint32 year = 3; } message Event { required Date date = 2; required string description = 3; } message Log { repeated Event events = 1; } std::unique_ptr<Log> log (new Log); Event* event = log->add_events(); event->mutable_date()->set_day(20); event->mutable_date()->set_month(9); event->mutable_date()->set_year(2014); event->set_description("Я.Субботник"); log->SerializeToOstream(&std::cout);
  11. 11. 11 Обратная совместимость message Product { enum ImageSize { DEFAULT = 0; SMALL = 1; MEDIUM = 2; LARGE = 3; } optional ImageSize image_size = 1 [default = DEFAULT]; required bytes image = 2; } message Product { enum ImageSize { DEFAULT = 0; SMALL = 1; MEDIUM = 2; LARGE = 3; XLARGE = 4; } optional ImageSize image_size = 1 [default = DEFAULT]; required bytes image_landscape = 2; required bytes image_portrait = 3; }
  12. 12. 12 Наследование message Application { required uint32 version = 1; } message Subscription { required Time period = 1; } message Product { required string title = 1; required Price price = 2; optional Application application = 3; optional Subscription subscription = 4; }
  13. 13. 13 Наследование message Product { required string title = 1; required Price price = 2; enum Type { APPLICATION = 0; SUBSCRIPTION = 1; } required Type type = 3; extensions 100 to max; } message Application { extend Product { optional uint32 version = 100; } } message Subscription { extend Product { optional Time period = 200; } }
  14. 14. 14 Наследование http://www.indelible.org/ink/protobuf-polymorphism/ https://clck.ru/9Jknx
  15. 15. 15 Балансер nginx C++ backend (fastcgi-daemon) Смежные сервисы Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок Архитектура API Elliptics MongoDB
  16. 16. 16 Прокси с авторизацией nginx C++ backend (fastcgi-daemon) nginx C++ backend (fastcgi-daemon) location /download { fastcgi_pass your_download_authorizer; fastcgi_intercept_errors on; error_page 302 = @storage; } location @storage { rewrite ^ /get?file_name=$upstream_http_file_name break; proxy_pass http://your_storage; } Elliptics Elliptics
  17. 17. 17 Балансер nginx C++ backend (fastcgi-daemon) Смежные сервисы Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок Архитектура API Elliptics MongoDB
  18. 18. 18 Драйвер MongoDB mongo::DBClientConnection connection; connection.connect(config->GetDbAddress()); connection.auth( config->GetDbName(), config->GetDbUser(), config->GetDbPassword(), ...); // hardcoded connection.findOne("db_name.collection_name", ...); // inconvenient connection.findOne(config->GetDbName() + "collection_name", ...);
  19. 19. 19 Драйвер MongoDB Assertion: 13111: wrong type for field (title) 2 != 16
  20. 20. 20 Алексей Васильев loudhorr@yandex-team.ru Андрей Урусов drobus@yandex-team.ru

×