5. Проблема
• Много анкет
• Много запросов – ещё и блоки
• Часто обновляются
• Сортировка
6. Проблема
• Много анкет
• Много запросов – ещё и блоки
• Часто обновляются
• Сортировка
• Много полей
7. Проблема
• Много анкет
• Много запросов – ещё и блоки
• Часто обновляются
• Сортировка
• Много полей
• Сложные стандартные запросы
8. Проблема
• Много анкет
• Много запросов – ещё и блоки
• Часто обновляются
• Сортировка
• Много полей
• Сложные стандартные запросы
а запросы расширенного поиска ещё сложнее!
21. JSON RPC 2.0
• асинхронный
• человекочитаемый
• для любых языков и платформ
• годится и для client-server, и для обмена
между сервисами
{"jsonrpc": "2.0", "method": "
find_by_oid", "params":
{"oids":[173963232]}, "id": 1}
{"jsonrpc": "2.0", "result": 19, "id": 1}
22. Архитектура связанных демонов
запрос на поиск /
wwwX получение анкет сёрчер сёрчер
(слейв) (слейв)
обновление
анкет
mysql
анкеты, реги
оны сёрчер
(мастер) попутчики
ставки активность / банерка
лидеры
Демон онлайн-
пользователей
24. Блоки анкет
• %xmmN регистры
• 128 бит каждый
• анкеты разбиваются на блоки
• по 512 анкет в 1 блоке
25. Побитовое хранение блока
• 1ый бит 1го поля всех анкет 1го блока
(итого 512 бит = 64 байта)
• 2ой бит 1го поля всех анкет 1го блока ...
• потом - 2ое поле всех анкет 1го блока
• последнее поле
• А потом – следующий блок.
27. Типы полей
Тип данных размер операции
• Enum, компактно Ln(N) m*Ln(N)
enum {a=00, b=01, c=10, d=11}
• Int и Bool – частные случаи enum/compact
28. Типы полей
Тип данных размер операции
• Enum, компактно Ln(N) m*Ln(N)
enum {a=00, b=01, c=10, d=11}
• Int и Bool – частные случаи enum/compact
• Enum/Set, некомпактно N m
enum {a=0001, b=0010, c=0100, d=1000}
29. Типы полей
Тип данных размер операции
• Enum, компактно Ln(N) m*Ln(N)
enum {a=00, b=01, c=10, d=11}
• Int и Bool – частные случаи enum/compact
• Enum/Set, некомпактно N m
enum {a=0001, b=0010, c=0100, d=1000}
• Range N 2
[18..25]
{10000000, 11000000, 11100000, 11110000, 1111100
0, 11111100, 11111110, 11111111}
40. Все индексы
1. все анкеты, все поля
2. Россия-М, поля простого поиска
3. Россия-Ж, поля простого поиска
4. ВИП, поля простого поиска
5. онлайны, все поля
6. созданные недавно, все поля
41. Операции
• поиск
• получение по id
• получение места анкеты в поиске
• и репликация
43. Время отклика (find)
Avg = 3.3ms
t(50%) < 1.7 ms
t(80%) < 4.2 ms
t(95%) < 14 ms
t(99%) < 28 ms
https://github.com/mambaru/btp-daemon - отличная статистика!
44. Надёжность
• failover на стороне приложения
• что если падает мастер?
• что если падает слейв?
• что если падает база?
45. Особенности реализации
• асинхронно, многопоточно
• C++11
• много шаблонов и списков типов
• виртуальных функций почти нет
• множественное наследование, но
основном от пустых родителей