Slide 1

Slide 1 text

Geo по IP без усилителей вкуса и консервантов

Slide 2

Slide 2 text

О себе Алексей Жиряков Руководитель направления бэкенд команды витрины в KION Знаю, что такое контроль хвостовой рекурсии Больше 10 лет в медиа ИТ Люблю Python и комедии В качестве хобби написал распределённую поисковую систему

Slide 3

Slide 3 text

О чем поговорим Наша проблема Сравнение БД Поиск адреса по диапазонам Что выбрали Обогащение Geo по Ip

Slide 4

Slide 4 text

Наша проблема: Geo обогащение 6000 RPS продуктовых событие 600 RPS витрин Х RPS запросов смежных подразделений

Slide 5

Slide 5 text

Геолокация для витрин «Прилипала» — промо- баннер Показ прилипалы в зависимости от витрины, АЗ/неАЗ, для абонентов МТС или для всех

Slide 6

Slide 6 text

Геолокация для витрин Баннеры для определённых городов или регионов

Slide 7

Slide 7 text

Геолокация для продуктовых метрик “109.252.214.31”

Slide 8

Slide 8 text

Почему не взяли готовое? Высокие нагрузки Внутренний контур

Slide 9

Slide 9 text

Какие технологии используем Много маленьких запросов Минимальное время ответа Кеширование на стороне API

Slide 10

Slide 10 text

Какие технологии используем Много маленьких запросов Минимальное время ответа Кеширование на стороне API

Slide 11

Slide 11 text

Проблемы определения Geo по IP “109.252.215.131” Поиск по вхождению в подсети “109.252.215.128/26” 109.252.215.128 - 109.252.215.191 “109.252.215.0/24” 109.252.215.0 - 109.252.215.255 geoname_id: “524901” geoname_id: “524512” Networks

Slide 12

Slide 12 text

Проблемы определения Geo по IP “109.252.215.131” Поиск по вхождению в подсети “109.252.215.128/26” “109.252.215.0/24” 109.252.215.0 - 109.252.215.255 geoname_id: “524901” geoname_id: “524512” 109.252.215.128 - 109.252.215.191 Networks

Slide 13

Slide 13 text

Геолокация для продуктовых метрик Модуль ipaddress Парсинг в классы IPv4Network, IPv6Network IPv4 адреса переводим в int через класс IPv4Address

Slide 14

Slide 14 text

Геолокация для продуктовых метрик “109.252.215.128/26” geo_ip: [ 1845286784, 1845286784 ] Networks В базе подсетей лежат диапазоны IP адресов в int

Slide 15

Slide 15 text

Геолокация для продуктовых метрик “109.252.215.131” Поиск по вхождению в подсети id: “524901” city_name: “Moscow” . . . “109.252.215.128/26” geoname_id: “524901” Networks Cities

Slide 16

Slide 16 text

Архитектура базы данных Networks Cities Countries Диапазоны IP адресов в виде int geoname_id - ID города network - подсеть (строка) Данные по городам Данные по региону (область, страна) Код города + код страны Данные по странам Название и код страны Подключается опционально 600mb 840mb index 8+млн ключей 10mb 2mb index 150к ключей 30kb 20kb index 250+ ключей

Slide 17

Slide 17 text

Кеш ответов Асинхронный кеш aLRU Одно устройство пользователя — один IP 1–5% попаданий в кеш Ограничение по памяти кеша User MongoDB aLRU cache Есть в кеше? Client IP Нет Да

Slide 18

Slide 18 text

Своё решение Исходные данные в CSV Geo2IP база Конвертируем в более удобный вид

Slide 19

Slide 19 text

Свое решение Первая итерация содержала промежуточный маппинг Три запроса вместо двух После рефакторинга - 2 запроса

Slide 20

Slide 20 text

Своё решение Первая итерация содержала промежуточный маппинг Три запроса вместо двух После рефакторинга — 2 запроса Подсеть Маппинг Город Подсеть Город

Slide 21

Slide 21 text

Своё решение Оптимизация запроса в MongoDB

Slide 22

Slide 22 text

Нагрузочное тестирование До 800 rps на под В среднем 20мс на запрос

Slide 23

Slide 23 text

Сравнение с реализацией на PosgreSQL 2 таблицы Тип данных inet для хранения подсетей “109.252.215.131” id: “524901” city_name: “Moscow” . . . “109.252.215.128/26” geoname_id: “524901” Networks Cities Индекс gist (network inet_ops)

Slide 24

Slide 24 text

Индекс btree Сравнение с реализацией на PostgreSQL Индекс gist (network inet_ops)

Slide 25

Slide 25 text

Сравнение с реализацией на PosgreSQL DDL таблиц

Slide 26

Slide 26 text

Сравнение с реализацией на PosgreSQL 150rps на под В среднем 50мс на запрос Тестировалась с модулем asyncpg

Slide 27

Slide 27 text

Сравнение с реализацией на PosgreSQL Быстрее Поддержка IPv6 Удобные запросы Проще масштабировать Проще Удобнее в работе из Python

Slide 28

Slide 28 text

Вопросы? @AlexeyZhi