Архитектура высоконагруженного сервиса на примере...

20
1

Upload: yandex

Post on 05-Dec-2014

497 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

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

1

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

2

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

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

3

Магазин приложений для Android

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

4

Магазин приложений для Android

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

5

Магазин приложений для Android

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

6

Процесс разработки

!  Непрерывная интеграция –  Система контроля версий — git –  Автосборка — TeamCity –  Код-ревью — Stash –  Автотесты — Boost Unit Test Framework !  Нагрузочное тестирование — Яндекс.Танк !  Разработка в облаке — X11/ssh !  Пятничные холивары

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

7

Архитектура системы

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

8

Балансер

nginx

C++ backend (fastcgi-daemon)

Смежные сервисы

Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок

Архитектура API

Elliptics MongoDB

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

9

Балансер

nginx

C++ backend (fastcgi-daemon)

Смежные сервисы

Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок

Архитектура API

Elliptics MongoDB

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

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);

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

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; }

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

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; }

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

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; } }

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

14

Наследование

http://www.indelible.org/ink/protobuf-polymorphism/

https://clck.ru/9Jknx

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

15

Балансер

nginx

C++ backend (fastcgi-daemon)

Смежные сервисы

Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок

Архитектура API

Elliptics MongoDB

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

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

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

17

Балансер

nginx

C++ backend (fastcgi-daemon)

Смежные сервисы

Авторизация Биллинг Поиск Отзывы и рейтинг Ресайзер картинок

Архитектура API

Elliptics MongoDB

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

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", ...);

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

19

Драйвер MongoDB

Assertion: 13111: wrong type for field (title) 2 != 16

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

20

Андрей Урусов

[email protected] Алексей Васильев

[email protected]