$30 off During Our Annual Pro Sale. View Details »

Moscow Python Meetup №94. Алексей Жиряков (KI...

Moscow Python Meetup №94. Алексей Жиряков (KION — руководитель направления, техлид бекенд команды витрины). Geo по IP без усилителей вкуса и консервантов

Расскажем о том, мы в KION готовим Geo по IP, как обогащаем продуктовые события (6000RPS), как используем в витринах гео информацию. Как мы это делаем быстро и вкусно, используя только Python, FastAPI и Mongo. Как подготавливаем и томим геоинформацию в Monge чтобы отвечать очень быстро.

Видео: https://moscowpython.ru/meetup/94/geo-by-ip/

Moscow Python: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru
Заявки на доклады: https://bit.ly/mp-speaker

Moscow Python Meetup

September 20, 2024
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. О себе Алексей Жиряков Руководитель направления бэкенд команды витрины в

    KION Знаю, что такое контроль хвостовой рекурсии Больше 10 лет в медиа ИТ Люблю Python и комедии В качестве хобби написал распределённую поисковую систему
  2. О чем поговорим Наша проблема Сравнение БД Поиск адреса по

    диапазонам Что выбрали Обогащение Geo по Ip
  3. Наша проблема: Geo обогащение 6000 RPS продуктовых событие 600 RPS

    витрин Х RPS запросов смежных подразделений
  4. Геолокация для витрин «Прилипала» — промо- баннер Показ прилипалы в

    зависимости от витрины, АЗ/неАЗ, для абонентов МТС или для всех
  5. Проблемы определения 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
  6. Проблемы определения 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
  7. Геолокация для продуктовых метрик Модуль ipaddress Парсинг в классы IPv4Network,

    IPv6Network IPv4 адреса переводим в int через класс IPv4Address
  8. Геолокация для продуктовых метрик “109.252.215.128/26” geo_ip: [ 1845286784, 1845286784 ]

    Networks В базе подсетей лежат диапазоны IP адресов в int
  9. Геолокация для продуктовых метрик “109.252.215.131” Поиск по вхождению в подсети

    id: “524901” city_name: “Moscow” . . . “109.252.215.128/26” geoname_id: “524901” Networks Cities
  10. Архитектура базы данных Networks Cities Countries Диапазоны IP адресов в

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

    IP 1–5% попаданий в кеш Ограничение по памяти кеша User MongoDB aLRU cache Есть в кеше? Client IP Нет Да
  12. Своё решение Первая итерация содержала промежуточный маппинг Три запроса вместо

    двух После рефакторинга — 2 запроса Подсеть Маппинг Город Подсеть Город
  13. Сравнение с реализацией на 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)
  14. Сравнение с реализацией на PosgreSQL 150rps на под В среднем

    50мс на запрос Тестировалась с модулем asyncpg
  15. Сравнение с реализацией на PosgreSQL Быстрее Поддержка IPv6 Удобные запросы

    Проще масштабировать Проще Удобнее в работе из Python