Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Китайские товары: просто, дёшево, надёжно

Китайские товары: просто, дёшево, надёжно

В начале прошлого года Одноклассники начали интегрировать платформу продажи товаров в социальную сеть и сейчас имеют свой маркетплейс с несколькими миллионами постоянных клиентов. Несмотря на большие нагрузки и требования к отказоустойчивости сервиса, инфраструктура и инженерные решения просты и экономичны. В докладе собран опыт проектирования, разработки и эксплуатации сервиса продажи товаров внутри социальной сети.

Автор в докладе рассмотрит архитектуру текущего решения:
- как драматически уменьшить зависимость от внешнего API, которое ты не контролируешь;
- как не погибнуть при синхронизации данных;
- двойное кэширование и почему оно помогает работать быстро, надежно и стабильно;
- преимущества избыточной репликации данных и почему иногда дешевле поднять и переехать на новый кластер, чем пытаться оптимизировать старый;
- когда действительно нужна консистентность и почему иногда не стоит пытаться её достигать;
- за какими метриками нужно следить, чтобы не было “разрывов”.

Avatar for Aleksandr Tarasov

Aleksandr Tarasov

April 08, 2019
Tweet

More Decks by Aleksandr Tarasov

Other Decks in Programming

Transcript

  1. Мнение докладчика может не совпадать с официальной позицией его работодателя,

    начальника, коллег или других специалистов. 
 Все представленные в докладе сведения, примеры, выводы и другую информацию вы можете использовать на свой страх и риск. За все ваши действия ответственность несёте только вы сами. 4 Минздрав предупреждает
  2. 6 71 млн Посещают нас в месяц 5,5 млн Заходят

    в маркетплейс Одноклассники в цифрах 2 000 Принятых решений в секунду
  3. • Сервис внутри сервиса • Отдельный раздел с точки зрения

    пользователя • Отдельный сервис с точки зрения архитектуры 10 Китайские товары
  4. • Сервис внутри сервиса • Отдельный раздел с точки зрения

    пользователя • Отдельный сервис с точки зрения архитектуры • Сторонние API • Логистика, информация о товарах • Покупка, оплата и т.д. 11 Китайские товары
  5. • Сторонний Mall Platform API • Мы не мастер-система •

    Как контролировать? 15 Что нас волнует?
  6. 16 Как это могло было бы быть, но не стало

    Запросы 
 от пользователя Mall Platform Данные Web/Mobile
  7. • Платформа недоступна/"тормозит" • Не можем купить • Не можем

    показать товары 17 Почему так не надо делать?
  8. • Платформа недоступна/"тормозит" • Не можем купить • Не можем

    показать товары • Влияем на платформу • Много запросов в пиковые часы • DDoS-атаки 18 Почему так не надо делать?
  9. • Платформа недоступна/"тормозит" • Не можем купить • Не можем

    показать товары • Влияем на платформу • Много запросов в пиковые часы • DDoS-атаки • Время ответа • Зависим от мощностей платформы • Ограничиваем себя в возможностях 19 Почему так не надо делать?
  10. 20 Как это могло было бы быть, но тоже не

    стало Запросы 
 от пользователя OK Gateway Проксируем Данные Web/Mobile Mall Platform
  11. 21 Как это могло было бы быть, но тоже не

    стало Запросы 
 от пользователя OK Gateway Проксируем Данные Web/Mobile Mall Platform
  12. • Платформа недоступна/"тормозит" • Не можем купить • Не можем

    показать товары • Влияем на платформу • Много запросов в пиковые часы • DDOS-атаки • Время ответа • Зависим от мощностей платформы • Ограничиваем себя в возможностях 22 Причины те же
  13. 23 А надо ли проксировать всё? Запросы 
 от пользователя

    OK Gateway Проксируем Данные Web/Mobile Mall Platform
  14. 25 Как это есть сейчас. Простая схема Запросы 
 от

    пользователя OK Mall Храним данные, проксируем 1% Процессинг заказов Web/Mobile Mall Platform
  15. • Минимизировали зависимость от внешнего API • Можем контролировать влияние

    на платформу • Можем реализовывать уникальные фичи • Повысили отказоустойчивость сервиса 30 Итоги #1
  16. • Какие данные хранить? • Как эти данные хранить? •

    Как синхронизировать данные? 31 Какие вопросы надо решить?
  17. • Данные для отображения витрины • Можем потерять • Но

    не очень хотим это делать • Данные заказов пользователей • Терять нельзя • Статистические данные • Нужно собрать и доставить в хранилище 33 Разные данные – разные требования
  18. • Данные для отображения витрины • Embedded Cassandra без транзакций

    • Данные заказов пользователей • Общий NewSQL (C*One) • Статистические данные • Kafka + Hadoop • DWH 34 Храним данные наиболее эффективно https://habr.com/ru/company/odnoklassniki/blog/417593/
  19. • Данные для отображения витрины • Embedded Cassandra без транзакций

    • Данные заказов пользователей • Общий NewSQL (C*One) • Статистические данные • Kafka + Hadoop • DWH 35 Храним данные наиболее эффективно
  20. • Что храним? • Информация о товарах (название, описание) •

    Варианты товаров (пары цвет-размер) • Рейтинги, отзывы 37 Данные для отображения витрины
  21. • Что храним? • Информация о товарах (название, описание) •

    Варианты товаров (пары цвет-размер) • Рейтинги, отзывы с других фронтов • Требования • Можем потерять, но не очень хотим это делать • latency < 50 мс • Не менее 2 000 rps 38 Данные для отображения витрины
  22. • Что храним? • Информация о товарах (название, описание) •

    Варианты товаров (пары цвет-размер) • Рейтинги, отзывы с других фронтов • Требования • Можем потерять, но не очень хотим это делать • latency < 50 мс • Не менее 2 000 rps • 98% всех запросов к сервису – запросы к витрине 39 Данные для отображения витрины
  23. • Embedded Cassandra • Базируется на собственном форке • Три

    инстанса (replication factor = 3) • Key-Value-схема хранения данных • Без обратных индексов 40 Cassandra as a Persistent Cache https://www.youtube.com/watch?v=k2efjgRxMp8
  24. • Embedded Cassandra • Базируется на собственном форке • Три

    инстанса (replication factor = 3) • Key-Value-схема хранения данных • Без обратных индексов • Capacity • > 100 млн. записей • TTL = пожизненно 41 Cassandra as a Persistent Cache
  25. 43 Схема хранения данных в Cassandra DC1 DC2 DC3 •

    Replication Factor = 3 • Write -> Quorum • Read -> Local
  26. 44 Схема хранения данных в Cassandra DC1 DC2 DC3 •

    Replication Factor = 3 • Write -> Quorum • Read -> Local
  27. 45 Схема хранения данных в Cassandra DC1 DC2 DC3 •

    Replication Factor = 3 • Write -> Quorum • Read -> Local
  28. • 2000 rps up to 1000 rows / 1 instance

    • Latency > 50ms 51 Хватит ли одной Кассандры?
  29. • 2000 rps up to 1000 rows / 1 instance

    • Latency > 50ms • Ок для витрины – не ок для ленты 52 Хватит ли одной Кассандры?
  30. • Добавить ещё нод • Шардинг • Увеличивать replication factor

    • Кэш • 99% запросов за “горячими” товарами • Можно не увеличивать количество инстансов 54 Какие варианты?
  31. • Off-Heap Map • Имплементацию можно найти в one-nio •

    Позволяет хранить десятки гигабайт без ущерба для Java Heap 56 In-Memory Cache
  32. • Off-Heap Map • Имплементацию можно найти в one-nio •

    Позволяет хранить десятки гигабайт без ущерба для Java Heap • Shared Memory • Обеспечивает быстрый старт сервиса без потери данных 57 In-Memory Cache
  33. • Off-Heap Map • Имплементацию можно найти в one-nio •

    Позволяет хранить десятки гигабайт без ущерба для Java Heap • Shared Memory • Обеспечивает быстрый старт сервиса без потери данных • Capacity • 10 млн. записей (10% от всей базы) • TTL = 24 часа 58 In-Memory Cache
  34. 63 Схема хранения данных в Cassandra DC1 DC2 DC3 •

    8 vCPU • 12 GB Mem • 512 GB HDD • 32 GB Shared Memory
  35. • Профиль работы определяет технические решения • Двойное кэширование –

    быстро и надёжно • Простота хранения – простота управления 64 Итоги #2
  36. • Какие данные хранить? • Как эти данные хранить? •

    Как синхронизировать данные? 65 Какие вопросы надо решить?
  37. • Большой импорт • Снапшот состояния внешней системы в виде

    набора JSON-файлов • Обновление более 16 млн. записей 67 Синхронизация данных
  38. • Большой импорт • Снапшот состояния внешней системы в виде

    набора JSON-файлов • Обновление более 16 млн. записей • Event-Based-апдейты • Чтение новых событий из Kafka 68 Синхронизация данных
  39. • Большой импорт • Снапшот состояния внешней системы в виде

    набора JSON-файлов • Обновление более 16 млн. записей • Event-Based-апдейты • Чтение новых событий из Kafka • Real-Time-апдейты • Актуализация данных через API перед покупкой товара 69 Синхронизация данных
  40. • Большой импорт • Снапшот состояния внешней системы в виде

    набора JSON-файлов • Обновление более 16 млн. записей • Event-Based-апдейты • Чтение новых событий из Kafka • Real-Time-апдейты • Актуализация данных через API перед покупкой товара 70 Синхронизация данных
  41. • Окно “в ночи” • Большой импорт провоцирует интенсивный Compaction

    • Replace-Only • Чтение, сверка данных - дорого (чтение в Кассандре дороже записи) • Данные по ключу всегда перетираются полностью 72 Особенности большого импорта
  42. • Окно “в ночи” • Большой импорт провоцирует интенсивный Compaction

    • Replace-Only • Чтение, сверка данных - дорого (чтение в Кассандре дороже записи) • Данные по ключу всегда перетираются полностью • Append-Only • Удаление через флаг • Накопление ненужных данных 73 Особенности большого импорта
  43. 76 Коварный Compaction • Если не успевает • Увеличивается количество

    SSTable (бывало и 13363) • java.lang.OutOfMemoryError: Java heap space
  44. 77 Коварный Compaction • Если не успевает • Увеличивается количество

    SSTable (бывало и 13363) • java.lang.OutOfMemoryError: Java heap space • Не самые приятные последствия • Резко увеличивается latencу (и таймауты тоже происходят) • Перестают работать снапшоты (тоже не успевают) • Инстансы долго стартуют (более чем в 10 раз)
  45. 79 Боремся с Compaction'ом • Больше потоков для обработки •

    Увеличили с 1 до 4 • Диски решают • Заменили HDD на SSD • Убрали снапшоты • Размазывание данных по “шпинделям"
  46. 80 Боремся с Compaction'ом • Больше потоков для обработки •

    Увеличили с 1 до 4 • Диски решают • Заменили HDD на SSD • Убрали снапшоты • Размазывание данных по “шпинделям" • Тюнинг параметров • MemtableThroughputInMB: 2MB -> 512MB
  47. 81 Платим за стабильность DC1 DC2 DC3 • 12 vCPU

    • 16 GB Mem • 2 x 512 GB SSD • 32 GB Shared Memory
  48. • Ночной импорт • Восстановление потерянной за день информации •

    Полное восстановление информации 84 Меры восстановления консистентности
  49. • Ночной импорт • Восстановление потерянной за день информации •

    Полное восстановление информации • Event-Based-апдейты • Актуализация данных близкая к реальному времени • Восстановление потерянной информации 85 Меры восстановления консистентности
  50. • Ночной импорт • Восстановление потерянной за день информации •

    Полное восстановление информации • Event-Based-апдейты • Актуализация данных близкая к реальному времени • Восстановление потерянной информации • Real-Time-апдейты • Проверка консистентности данных на момент покупки 86 Меры восстановления консистентности
  51. • Внешний источник данных • Любая информация всегда приходит с

    задержкой 87 Eventual Consistency как предел мечтаний
  52. • Внешний источник данных • Любая информация всегда приходит с

    задержкой • Пользователь, который покупает • Лаг по времени между показом товара и принятием решения о покупке 88 Eventual Consistency как предел мечтаний
  53. • Внешний источник данных • Любая информация всегда приходит с

    задержкой • Пользователь, который покупает • Лаг по времени между показом товара и принятием решения о покупке • Проще и дешевле быть немного неконсистентным • Менее 1% показа новой цены пользователю 89 Eventual Consistency как предел мечтаний
  54. • Шедулер с шардингом • Сплит по доменам по order_id

    • Разбиение до 256 доменов (реально используется 8) • Каждый инстанс шедулера обрабатывает свой домен 92 Асинхронная обработка заказов
  55. • Плюсы • Минимизируется конкурентность обработки заказов • Постоянная сверка

    с мастер-системой • Независимость от внешней системы 95 Преимущества и недостатки
  56. • Плюсы • Минимизируется конкурентность обработки заказов • Постоянная сверка

    с мастер-системой • Независимость от внешней системы • Минусы • Ограниченная параллелизация • Ручное перераспределение доменов 96 Преимущества и недостатки
  57. • Сразу минимизировали влияние внешнего API • Начали с простых

    и экономичных решений • Повышали надёжность и эффективность, не усложняя решение 100 Выводы