SlideShare une entreprise Scribd logo
1  sur  40
Архитектура Ленты на
Одноклассниках
Алина Васильева
разработчик сервиса Лента
Одноклассники
alina.vasiljeva@odnoklassniki.ru
Одноклассники
• Социальный портал
• Граф друзей
• Аудитория:
– 250 млн аккаунтов
– 6 млн пользователей онлайн
– более 40 млн посетителей в день
1
в среднем
90 друзей
12 групп
Лента
2
Лента
• Один из ключевых сервисов портала
• Цели
– показ пользователю действий и событий друзей и групп
– распространение контента по порталу
– стимулирование пользователей создавать контент
• Задачи
– показ интереснейшего контента максимально большому
количеству пользователей
– агрегация
– группировка
– сортировка
– выживание в условиях высокой нагрузки
3
События
• В ленту попадают события более чем 100 разных типов
– Фото
– Статусы
– Дружбы
– Классы
– Подарки
– Игры
– Группы
– Музыка
– Видео
– и многое другое...
4
Больше всего добавляется
классов к фото
По показам лидируют
темы из групп
Запись и хранение событий
• Для достижения цели необходимо записывать и
хранить события каждого пользователя
• Главная сущность: Feed
• Для каждого пользователя нужно хранить List<Feed>
5
class Feed {
long createDate;
short feedTypeId;
Long referenceId;
...
}
Запись и хранение событий
• SQL ?
6
• SELECT, JOIN, COUNT...
Нагрузка
• В час пик пользователи генерируют 1 миллион
событий в 5 минут (>3000 операций записи в секунду)
7
• Запросы ленты конкретного пользователя: >4000 в сек
• Запросы общей ленты на главной: >9000 в сек
История развития хранилища фидов
• SQL решение не рассматривалось изначально
– высокая нагрузка
– необходима высокая доступность
– характер данных, запросов и нагрузки
8
История развития хранилища фидов
• Oracle Berkeley DB
– Key / Value хранилище CP-типа
– Key: long feedOwnerId
– Value: List<Feed>  byte[]
– Хранятся последние N записей (500)
9
• Через ~2 года добавили Voldemort + Tarantool
– Key / Value хранилище AP-типа
– Хранение данных в памяти
– Более высокая производительность
– Более высокая доступность
– Хранятся последние 30 записей
– Использовался одновременно с Berkeley
Переход на Cassandra
• Причины
– Нестабильность Berkeley
– Ограничение на объѐм хранимых данных
– Упирались в трафик
• необходимо пересылать по сети все данные
• Преимущества
– Высокая доступность, распределѐнность
– Масштабирование, восстановление на ходу
– Высокая скорость записи
– Скорость чтения не зависит от объема
– Возможность реализации бизнес-логики
10
Cassandra
• Хранение данных в Column Family
– Row Key
– Column Key + Column Value + Timestamp
11
Хранение фидов в Cassandra
12
Общая картина
Feed Proxy -
координирующее
Java-приложение
13
Инфраструктура ленты
14
• Сервера распределены по трѐм дата-центрам
Feed Proxy кластер:
21 000 запросов/сек
Feed Storage кластер:
120 000 запросов/сек
Инфраструктура ленты
15
• Выдерживаем потѐрю целого дата-центра
Приложения
обновляются
путѐм отключения
серверов в одном ДЦ
Обновление
кластера Proxy:
5 минут
Обновление
кластера Storage:
30 минут
Общая лента
• Задача – показ ленты событий от всех друзей
16
распространение
информации
получение
информации
Общая лента
17
Список подписок
• При дружбе пользователи добавляются друг к другу в
список подписок (ObservedList)
• Формируется список друзей, за событиями которых
пользователь следит и которые попадают к нему в ленту
• Храним список подписок для каждого пользователя
18
class ObservedList {
List<ObservedItem> items;
...
}
class ObservedItem {
long feedOwnerId;
long lastUserAccessTime;
long lastFeedOccurrenceTime;
...
}
Хранение списка подписок
• SQL снова не подходит
– 350 добавлений в секунду (18 млн за сутки)
– 9000 чтений в секунду
– характер данных и запросов
• Хранили в Berkeley DB, перешли на Cassandra
19
1. Получаем список подписок из ObservedList
2. По каждой подписке получаем список фидов из Storage
3. Объединяем, сортируем
Алгоритм сборки общей ленты [simplified]
List<Feed> feeds = new ArrayList<Feed>();
ObservedList observedList = getObservedList(feedFollowerId);
for (ObservedItem item: observedList.getItems()){
List<Feed> userFeeds =
getFeeds(observedItem.getFeedOwnerId());
feeds.addAll(userFeeds);
}
Collections.sort(feeds, FEEDS_COMPARATOR);
20
Выполняется
на Feed Proxy
И опять нагрузка
• 9000 запросов получения общей ленты в секунду
– даже с учѐтом кэширования на вебе
– помним про 90 друзей и 12 групп у пользователей!
– 9000 * 102 = 918 000 походов в базу в секунду
• Базы данных не в состоянии эффективно обработать
такое количество запросов
21
Нужен кеш событий
общих лент пользователей
Feed Cache
• Java-приложение, цель которого получение, хранение
и отдача общих лент
22
Масштабы Feed Cache
• Самое мощное приложение инфраструктуры ленты
• 64 сервера, распределѐнные по трѐм дата-центрам
• Кол-во запросов: 100 тысяч в секунду (~1500 на сервер)
• В кэши входит 100 млн событий в 5 минут
• Трафик: 1 Гб/сек
– 10 Мб/сек входящего на 1 сервер
– 6 Мб/сек исходящего на 1 сервер
• Объем хранимых данных: 6 ТБ (в RAM)
– ~100 ГБ на 1 сервере
– в среднем 100 KБ на пользователя
23
Хранение данных в Feed Cache
• По ключу идентификатора пользователя хранится список фидов
• Длина списка ограничена
– 1000 записей, но, бывает, уменьшаем (при повышенной нагрузке)
– специальный алгоритм по вытестению данных из кэша
– планируем переход на Cassandra
24
Хранение данных в Feed Cache
• Помимо списка фидов хранятся также дополнительные данные
– время последнего логина
– время последнего открытия ленты
– время последнего обновления данных с Feed Proxy
– значение последнего выбранного фильтра
• Данные сериализуются и хранятся в Off-Heap памяти
• Раз в 12 часов сервер записывает данные на диск (снепшот)
• При рестарте приложение стартует со снепшота ~8 минут
• При старте без снепшота есть механизмы обеспечивающие
плавную загрузку данных
25
Кластер Feed Cache
26
• Шардинг – каждый сервер обслуживает 1/64 часть
пользователей
– партиционирование по id пользователя
• У каждого сервера есть «заместитель», на который
перенаправляются запросы в случае недоступности
• Обновление приложений всего кластера занимает
~1 час (обновление по ¼ серверов)
Feed Cache - Отдача данных
• Feed Cache запрашивает новые события с Feed Proxy по
истечению временного периода (15 минут)
– инфраструктура уже выдерживает обновления раз в 1 минуту
27
Время последнего события
• И всѐ же нагрузка на хранилище фидов получается
черезмерно большая
• При каждом обновлении на Feed Proxy обходить базы
всех друзей неоправданно дорого
• ведь новые события могли появиться всего у пары из них, а то
вообще ни у кого
• Решение - отдельно хранить дату добавления
последнего события в ленту пользователя
• Отдельная база: Voldemort + Tarantool (key / value)
– long feed_owner_id  long last_create_date
28
База UpdateInfo
• При добавлении нового события обновляется
timestamp в базе UpdateInfo
• Далее это значение проверяется при сборке событий
для общей ленты
29
• Перед запросом в базу Feeds проверяется значение
UpdateInfo - появились ли новые события
Алгоритм сборки общей ленты [improved]
30
public List<Feed> collectRecentFeeds(
long feedFollowerId, long lastUpdated){
1. ПОЛУЧАЕМ СПИСОК ПОДПИСОК (OBSERVED LIST)
2. ДЛЯ КАЖДОЙ ПОДПИСКИ
3. ПРОВЕРЯЕМ UpdateInfo
if (hasNewFeeds(item.getId(), lastUpdated)){
4. ПОЛУЧАЕМ ФИДЫ
5. ДОБАВЛЯЕМ ФИДЫ В ОБЩИЙ СПИСОК
}
}
...
}
Хотя в UpdateInfo тоже ходим не каждый раз.
Значения кэшируются в ObservedList.
Группировка событий
• Проблема – повторяющиеся бесполезные события
31
Группировка событий
• Решение – группировка событий
32
• Исключение событий
Группировка событий
• Решение – инфраструктура мержеров событий
33
List<Feed> feeds = getFeeds();
for (Merger merger: mergers){
merger.mergeFeeds(feeds);
}
Длина списка
уменьшается
на ~25%
Приоритеты событий
• Проблема – событий много, нужно показать
пользователю самое интересное
• Решение – подсчѐт весов событий и пересортировка
на их основании
• Вес подсчитывается при входе события в Feed Cache
• Также анализируется состояние кэша
– подсчитывется сколько событий каких типов уже присутствует в кэше
34
множество дополнительных коэффициентов и параметров
Feed Stats
• Отдельное Java-приложение с хранением данных в
Cassandra
• Сбор статистики о предпочтениях пользователей
• Записывает действия, которые пользователь
совершает по отношению к своим друзьям
– 53 000 записей в секунду
• На основании собранной статистики подсчитывает
веса друзей
• Далее этот вес используется лентой при подсчѐте
веса события
35
Полная картина
36
Real-time доставка событий
• Проблема: чтобы увидеть новые события
пользователю необходимо обновить страницу
• С учѐтом многоуровнего кэширования и ограничений
новое событие может прийти в ленту с задержкой
• Задача: доставлять события в ленты пользователей
моментально и автоматически
37
Real-time доставка событий
После добавления нового события Feed Storage
нотифицирует Feed Cache друзей в онлайне, отсылая
им фид, который далее переправляется прямо на Web
38
Спасибо!
Алина Васильева
разработчик сервиса Лента
Одноклассники
alina.vasiljeva@odnoklassniki.ru
odnoklassniki.ru/alina
v.ok.ru
job@odnoklassniki.ru

Contenu connexe

Tendances

Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Ontico
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)Ontico
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Ontico
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайOntico
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
 
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)Ontico
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеVolha Banadyseva
 
Hadoop > cascading -> cascalog (very short)
Hadoop  > cascading -> cascalog (very short)Hadoop  > cascading -> cascalog (very short)
Hadoop > cascading -> cascalog (very short)Andrew Panfilov
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache CassandraAlexander Tivelkov
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахAlexander Mezhov
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )Shamim bhuiyan
 

Tendances (20)

Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
 
1c bitrix-cluster-et
1c bitrix-cluster-et1c bitrix-cluster-et
1c bitrix-cluster-et
 
Webcluster cases
Webcluster casesWebcluster cases
Webcluster cases
 
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проекте
 
02 1c-bitrix-cloud-storage
02 1c-bitrix-cloud-storage02 1c-bitrix-cloud-storage
02 1c-bitrix-cloud-storage
 
Hadoop > cascading -> cascalog (very short)
Hadoop  > cascading -> cascalog (very short)Hadoop  > cascading -> cascalog (very short)
Hadoop > cascading -> cascalog (very short)
 
Введение в Apache Cassandra
Введение в Apache CassandraВведение в Apache Cassandra
Введение в Apache Cassandra
 
Cassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системахCassandra: быстрая запись данных в высоконагруженных системах
Cassandra: быстрая запись данных в высоконагруженных системах
 
Highload++ 2015
Highload++ 2015Highload++ 2015
Highload++ 2015
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
 

En vedette

Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013it-people
 
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...odnoklassniki.ru
 
"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)AvitoTech
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?AvitoTech
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015Alex Chistyakov
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)AvitoTech
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Ontico
 
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Ontico
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooMail.ru Group
 
Golang в avito
Golang в avitoGolang в avito
Golang в avitoAvitoTech
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)AvitoTech
 
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)AvitoTech
 
Selling electronic devices!?
Selling electronic devices!?Selling electronic devices!?
Selling electronic devices!?fraillunatic2504
 
The Public Library Catalogue as a Social Space
The Public Library Catalogue as a Social SpaceThe Public Library Catalogue as a Social Space
The Public Library Catalogue as a Social SpaceLouise Spiteri
 

En vedette (20)

Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
 
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
Олег Анастасьев "Ближе к Cassandra". Выступление на Cassandra Conf 2013
 
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
Франкенштейнизация Voldemort или key-value данные в Одноклассниках. Роман Ан...
 
"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)"Building data streams" Константин Евтеев (Avito)
"Building data streams" Константин Евтеев (Avito)
 
Зачем в Avito Аналитика?
Зачем в Avito Аналитика?Зачем в Avito Аналитика?
Зачем в Avito Аналитика?
 
HBase on Dev{Highload}
HBase on Dev{Highload}HBase on Dev{Highload}
HBase on Dev{Highload}
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
"Кластеры баз данных: делаем сложные вещи просто" Андрей Тихонов (Avito)
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
 
Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...Использование Tarantool в качестве платформы виртуализации данных / Константи...
Использование Tarantool в качестве платформы виртуализации данных / Константи...
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Golang в avito
Golang в avitoGolang в avito
Golang в avito
 
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
«Как 200 строк на Go помогли нам освободить 15 серверов» – Паша Мурзаков (Badoo)
 
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
Kubernetes в production - Павел Селиванов (Центр Недвижимости от Сбербанка)
 
Selling electronic devices!?
Selling electronic devices!?Selling electronic devices!?
Selling electronic devices!?
 
The Public Library Catalogue as a Social Space
The Public Library Catalogue as a Social SpaceThe Public Library Catalogue as a Social Space
The Public Library Catalogue as a Social Space
 

Similaire à Архитектура Ленты на Одноклассниках

масштабируемый Sphinx кластер. вячеслав крюков. зал 1
масштабируемый Sphinx кластер. вячеслав крюков. зал 1масштабируемый Sphinx кластер. вячеслав крюков. зал 1
масштабируемый Sphinx кластер. вячеслав крюков. зал 1rit2011
 
FT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоFT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоАлександр Ежов
 
Управление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULT
Управление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULTУправление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULT
Управление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULTКРОК
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиBadoo Development
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...Yandex
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковFuenteovejuna
 
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...Yandex
 
Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruodnoklassniki.ru
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераDaniel Podolsky
 
Data Destribution service OMG standart
Data Destribution service OMG standart Data Destribution service OMG standart
Data Destribution service OMG standart Sergei Seleznev
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015OSLL
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?Aleksey Stukalov
 
Сервисы на базе автоматизации тестирования
Сервисы на базе автоматизации тестированияСервисы на базе автоматизации тестирования
Сервисы на базе автоматизации тестированияSQALab
 
Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5Docsvision
 
Вадим Мадисон "Опыт разработки через микросервисы"
Вадим Мадисон "Опыт разработки через микросервисы"Вадим Мадисон "Опыт разработки через микросервисы"
Вадим Мадисон "Опыт разработки через микросервисы"Tanya Denisyuk
 
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.Alexander Frolov
 
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)Ontico
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва it-people
 

Similaire à Архитектура Ленты на Одноклассниках (20)

масштабируемый Sphinx кластер. вячеслав крюков. зал 1
масштабируемый Sphinx кластер. вячеслав крюков. зал 1масштабируемый Sphinx кластер. вячеслав крюков. зал 1
масштабируемый Sphinx кластер. вячеслав крюков. зал 1
 
FT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это простоFT & HA Rails приложений приложений — это просто
FT & HA Rails приложений приложений — это просто
 
Управление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULT
Управление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULTУправление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULT
Управление данными и защита от сбоев. Решения КРОК на основе продуктов COMMVAULT
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитики
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
Как упростить жизнь системному администратору с помощью Python – Андрей Васил...
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав КрюковSphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
 
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
 
Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ru
 
Спасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного ХецнераСпасение 6 миллионов файлов в условиях полного Хецнера
Спасение 6 миллионов файлов в условиях полного Хецнера
 
Data Destribution service OMG standart
Data Destribution service OMG standart Data Destribution service OMG standart
Data Destribution service OMG standart
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015
 
RAD на Java: как устроена CUBA Platform?
RAD на Java: как устроена  CUBA Platform?RAD на Java: как устроена  CUBA Platform?
RAD на Java: как устроена CUBA Platform?
 
Rusiem 2017_обзор
Rusiem 2017_обзорRusiem 2017_обзор
Rusiem 2017_обзор
 
Сервисы на базе автоматизации тестирования
Сервисы на базе автоматизации тестированияСервисы на базе автоматизации тестирования
Сервисы на базе автоматизации тестирования
 
Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5Производительность и надежность Docsvision 5
Производительность и надежность Docsvision 5
 
Вадим Мадисон "Опыт разработки через микросервисы"
Вадим Мадисон "Опыт разработки через микросервисы"Вадим Мадисон "Опыт разработки через микросервисы"
Вадим Мадисон "Опыт разработки через микросервисы"
 
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
 
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
 
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва  Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
Реактивный кэш в Android, Андрей Мельников, Rambler&Co, Москва
 

Plus de Dmitry Buzdin

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?Dmitry Buzdin
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Dmitry Buzdin
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?Dmitry Buzdin
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?Dmitry Buzdin
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDmitry Buzdin
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureDmitry Buzdin
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIsDmitry Buzdin
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fmDmitry Buzdin
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIDmitry Buzdin
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsDmitry Buzdin
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional ProgrammingDmitry Buzdin
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contestDmitry Buzdin
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery Dmitry Buzdin
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOpsDmitry Buzdin
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump AnalysisDmitry Buzdin
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test AutomationDmitry Buzdin
 

Plus de Dmitry Buzdin (20)

How Payment Cards Really Work?
How Payment Cards Really Work?How Payment Cards Really Work?
How Payment Cards Really Work?
 
Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?Как построить свой фреймворк для автотестов?
Как построить свой фреймворк для автотестов?
 
How to grow your own Microservice?
How to grow your own Microservice?How to grow your own Microservice?
How to grow your own Microservice?
 
How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?How to Build Your Own Test Automation Framework?
How to Build Your Own Test Automation Framework?
 
Delivery Pipeline for Windows Machines
Delivery Pipeline for Windows MachinesDelivery Pipeline for Windows Machines
Delivery Pipeline for Windows Machines
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop Infrastructure
 
JOOQ and Flyway
JOOQ and FlywayJOOQ and Flyway
JOOQ and Flyway
 
Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIs
 
Whats New in Java 8
Whats New in Java 8Whats New in Java 8
Whats New in Java 8
 
Dart Workshop
Dart WorkshopDart Workshop
Dart Workshop
 
Riding Redis @ask.fm
Riding Redis @ask.fmRiding Redis @ask.fm
Riding Redis @ask.fm
 
Rubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part IIRubylight JUG Contest Results Part II
Rubylight JUG Contest Results Part II
 
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching SolutionsRubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Poor Man's Functional Programming
Poor Man's Functional ProgrammingPoor Man's Functional Programming
Poor Man's Functional Programming
 
Rubylight programming contest
Rubylight programming contestRubylight programming contest
Rubylight programming contest
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump Analysis
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test Automation
 

Архитектура Ленты на Одноклассниках

  • 1. Архитектура Ленты на Одноклассниках Алина Васильева разработчик сервиса Лента Одноклассники alina.vasiljeva@odnoklassniki.ru
  • 2. Одноклассники • Социальный портал • Граф друзей • Аудитория: – 250 млн аккаунтов – 6 млн пользователей онлайн – более 40 млн посетителей в день 1 в среднем 90 друзей 12 групп
  • 4. Лента • Один из ключевых сервисов портала • Цели – показ пользователю действий и событий друзей и групп – распространение контента по порталу – стимулирование пользователей создавать контент • Задачи – показ интереснейшего контента максимально большому количеству пользователей – агрегация – группировка – сортировка – выживание в условиях высокой нагрузки 3
  • 5. События • В ленту попадают события более чем 100 разных типов – Фото – Статусы – Дружбы – Классы – Подарки – Игры – Группы – Музыка – Видео – и многое другое... 4 Больше всего добавляется классов к фото По показам лидируют темы из групп
  • 6. Запись и хранение событий • Для достижения цели необходимо записывать и хранить события каждого пользователя • Главная сущность: Feed • Для каждого пользователя нужно хранить List<Feed> 5 class Feed { long createDate; short feedTypeId; Long referenceId; ... }
  • 7. Запись и хранение событий • SQL ? 6 • SELECT, JOIN, COUNT...
  • 8. Нагрузка • В час пик пользователи генерируют 1 миллион событий в 5 минут (>3000 операций записи в секунду) 7 • Запросы ленты конкретного пользователя: >4000 в сек • Запросы общей ленты на главной: >9000 в сек
  • 9. История развития хранилища фидов • SQL решение не рассматривалось изначально – высокая нагрузка – необходима высокая доступность – характер данных, запросов и нагрузки 8
  • 10. История развития хранилища фидов • Oracle Berkeley DB – Key / Value хранилище CP-типа – Key: long feedOwnerId – Value: List<Feed>  byte[] – Хранятся последние N записей (500) 9 • Через ~2 года добавили Voldemort + Tarantool – Key / Value хранилище AP-типа – Хранение данных в памяти – Более высокая производительность – Более высокая доступность – Хранятся последние 30 записей – Использовался одновременно с Berkeley
  • 11. Переход на Cassandra • Причины – Нестабильность Berkeley – Ограничение на объѐм хранимых данных – Упирались в трафик • необходимо пересылать по сети все данные • Преимущества – Высокая доступность, распределѐнность – Масштабирование, восстановление на ходу – Высокая скорость записи – Скорость чтения не зависит от объема – Возможность реализации бизнес-логики 10
  • 12. Cassandra • Хранение данных в Column Family – Row Key – Column Key + Column Value + Timestamp 11
  • 14. Общая картина Feed Proxy - координирующее Java-приложение 13
  • 15. Инфраструктура ленты 14 • Сервера распределены по трѐм дата-центрам Feed Proxy кластер: 21 000 запросов/сек Feed Storage кластер: 120 000 запросов/сек
  • 16. Инфраструктура ленты 15 • Выдерживаем потѐрю целого дата-центра Приложения обновляются путѐм отключения серверов в одном ДЦ Обновление кластера Proxy: 5 минут Обновление кластера Storage: 30 минут
  • 17. Общая лента • Задача – показ ленты событий от всех друзей 16 распространение информации получение информации
  • 19. Список подписок • При дружбе пользователи добавляются друг к другу в список подписок (ObservedList) • Формируется список друзей, за событиями которых пользователь следит и которые попадают к нему в ленту • Храним список подписок для каждого пользователя 18 class ObservedList { List<ObservedItem> items; ... } class ObservedItem { long feedOwnerId; long lastUserAccessTime; long lastFeedOccurrenceTime; ... }
  • 20. Хранение списка подписок • SQL снова не подходит – 350 добавлений в секунду (18 млн за сутки) – 9000 чтений в секунду – характер данных и запросов • Хранили в Berkeley DB, перешли на Cassandra 19
  • 21. 1. Получаем список подписок из ObservedList 2. По каждой подписке получаем список фидов из Storage 3. Объединяем, сортируем Алгоритм сборки общей ленты [simplified] List<Feed> feeds = new ArrayList<Feed>(); ObservedList observedList = getObservedList(feedFollowerId); for (ObservedItem item: observedList.getItems()){ List<Feed> userFeeds = getFeeds(observedItem.getFeedOwnerId()); feeds.addAll(userFeeds); } Collections.sort(feeds, FEEDS_COMPARATOR); 20 Выполняется на Feed Proxy
  • 22. И опять нагрузка • 9000 запросов получения общей ленты в секунду – даже с учѐтом кэширования на вебе – помним про 90 друзей и 12 групп у пользователей! – 9000 * 102 = 918 000 походов в базу в секунду • Базы данных не в состоянии эффективно обработать такое количество запросов 21 Нужен кеш событий общих лент пользователей
  • 23. Feed Cache • Java-приложение, цель которого получение, хранение и отдача общих лент 22
  • 24. Масштабы Feed Cache • Самое мощное приложение инфраструктуры ленты • 64 сервера, распределѐнные по трѐм дата-центрам • Кол-во запросов: 100 тысяч в секунду (~1500 на сервер) • В кэши входит 100 млн событий в 5 минут • Трафик: 1 Гб/сек – 10 Мб/сек входящего на 1 сервер – 6 Мб/сек исходящего на 1 сервер • Объем хранимых данных: 6 ТБ (в RAM) – ~100 ГБ на 1 сервере – в среднем 100 KБ на пользователя 23
  • 25. Хранение данных в Feed Cache • По ключу идентификатора пользователя хранится список фидов • Длина списка ограничена – 1000 записей, но, бывает, уменьшаем (при повышенной нагрузке) – специальный алгоритм по вытестению данных из кэша – планируем переход на Cassandra 24
  • 26. Хранение данных в Feed Cache • Помимо списка фидов хранятся также дополнительные данные – время последнего логина – время последнего открытия ленты – время последнего обновления данных с Feed Proxy – значение последнего выбранного фильтра • Данные сериализуются и хранятся в Off-Heap памяти • Раз в 12 часов сервер записывает данные на диск (снепшот) • При рестарте приложение стартует со снепшота ~8 минут • При старте без снепшота есть механизмы обеспечивающие плавную загрузку данных 25
  • 27. Кластер Feed Cache 26 • Шардинг – каждый сервер обслуживает 1/64 часть пользователей – партиционирование по id пользователя • У каждого сервера есть «заместитель», на который перенаправляются запросы в случае недоступности • Обновление приложений всего кластера занимает ~1 час (обновление по ¼ серверов)
  • 28. Feed Cache - Отдача данных • Feed Cache запрашивает новые события с Feed Proxy по истечению временного периода (15 минут) – инфраструктура уже выдерживает обновления раз в 1 минуту 27
  • 29. Время последнего события • И всѐ же нагрузка на хранилище фидов получается черезмерно большая • При каждом обновлении на Feed Proxy обходить базы всех друзей неоправданно дорого • ведь новые события могли появиться всего у пары из них, а то вообще ни у кого • Решение - отдельно хранить дату добавления последнего события в ленту пользователя • Отдельная база: Voldemort + Tarantool (key / value) – long feed_owner_id  long last_create_date 28
  • 30. База UpdateInfo • При добавлении нового события обновляется timestamp в базе UpdateInfo • Далее это значение проверяется при сборке событий для общей ленты 29
  • 31. • Перед запросом в базу Feeds проверяется значение UpdateInfo - появились ли новые события Алгоритм сборки общей ленты [improved] 30 public List<Feed> collectRecentFeeds( long feedFollowerId, long lastUpdated){ 1. ПОЛУЧАЕМ СПИСОК ПОДПИСОК (OBSERVED LIST) 2. ДЛЯ КАЖДОЙ ПОДПИСКИ 3. ПРОВЕРЯЕМ UpdateInfo if (hasNewFeeds(item.getId(), lastUpdated)){ 4. ПОЛУЧАЕМ ФИДЫ 5. ДОБАВЛЯЕМ ФИДЫ В ОБЩИЙ СПИСОК } } ... } Хотя в UpdateInfo тоже ходим не каждый раз. Значения кэшируются в ObservedList.
  • 32. Группировка событий • Проблема – повторяющиеся бесполезные события 31
  • 33. Группировка событий • Решение – группировка событий 32 • Исключение событий
  • 34. Группировка событий • Решение – инфраструктура мержеров событий 33 List<Feed> feeds = getFeeds(); for (Merger merger: mergers){ merger.mergeFeeds(feeds); } Длина списка уменьшается на ~25%
  • 35. Приоритеты событий • Проблема – событий много, нужно показать пользователю самое интересное • Решение – подсчѐт весов событий и пересортировка на их основании • Вес подсчитывается при входе события в Feed Cache • Также анализируется состояние кэша – подсчитывется сколько событий каких типов уже присутствует в кэше 34 множество дополнительных коэффициентов и параметров
  • 36. Feed Stats • Отдельное Java-приложение с хранением данных в Cassandra • Сбор статистики о предпочтениях пользователей • Записывает действия, которые пользователь совершает по отношению к своим друзьям – 53 000 записей в секунду • На основании собранной статистики подсчитывает веса друзей • Далее этот вес используется лентой при подсчѐте веса события 35
  • 38. Real-time доставка событий • Проблема: чтобы увидеть новые события пользователю необходимо обновить страницу • С учѐтом многоуровнего кэширования и ограничений новое событие может прийти в ленту с задержкой • Задача: доставлять события в ленты пользователей моментально и автоматически 37
  • 39. Real-time доставка событий После добавления нового события Feed Storage нотифицирует Feed Cache друзей в онлайне, отсылая им фид, который далее переправляется прямо на Web 38
  • 40. Спасибо! Алина Васильева разработчик сервиса Лента Одноклассники alina.vasiljeva@odnoklassniki.ru odnoklassniki.ru/alina v.ok.ru job@odnoklassniki.ru