Пишем веб-аналитику на Go и Python c Redis. Выбор архитектуры, обзор инструментов и кода

Ваша оценка компании



Мой курс «Хардкорная веб-разработка» — https://course.to.digital

Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: https://botanim.to.digital/
Telegram: https://t0digital.t.me

Сказать спасибо за это видео можно здесь — https://boosty.to/digitalize.team

Рассмотрим в этом выпуске реализацию несложной системы веб-аналитики на Go + Python с использованием in-memory базы данных Redis и, конечно, PostgreSQL. Поговорим об выбранном инструментарии, рассмотрим код и обсудим подходы к разработке.

0:00 О чем пойдет речь
1:02 Наши требования к системе веб-аналитики
2:20 RPS с Django, Fast API и Go серверами
3:41 Почему Redis? Обзор архитектуры
7:20 Смотрим код Go сервера
18:16 Смотрим код Python модуля
19:58 Выводы

/****************** about ******************/

Меня зовут Алексей Голобурдин, я программирую с 2004 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:

— Диджитализируй https://digitalize.team, разрабатываем сложные IT системы для бизнеса;
— Salesbeat https://salesbeat.pro, комплексный модуль доставки для интернет магазинов.

Если у вас есть проект на разработку, пишите нам на hi@digitalize.team.

С другими предложениями, а также если вам нужна одна или несколько индивидуальных консультаций/уроков по разработке (3000 руб/час), пишите мне на alexey@salesbeat.pro.

Telegram канал — https://t.me/t0digital
ВК — https://vk.com/digitalize.team
RuTube — https://rutube.ru/channel/24802975/about/
Дзен — https://dzen.ru/id/6235d32cb64df01e6e78c883

stroytam.ru
  1. @user-qd4sn3oy8w

    Опечатки намерено сделаны в названии структур? Seccessfull, секесный респонс

    Ответить
  2. @MikhailChernoskutov

    Привет
    <disclaimer> Мог не доглядеть какой-то кусок кода, да и прошло уже 2 недели (наверняка уже что-то исправлено), а что-то наверняка уже писали в коментах </disclaimer>

    10:01 Мы в команде пытаемся не создавать клиентов в глобальных переменных/переменных пакета (как в данном случае сделан клиент rdb).

    Да и делать отдельный background контекст в виде переменной тоже не совсем понятно зачем: никакой полезной нагрузки с ним сделать не получится, а создавать context.Background() по месту достаточно дешево.

    successfull и unsuccessfull response message я бы не стал разделять: они всё-равно судя по тегам будут замаршалены в один и тот же json. И кстати в названии типа опечатка (unsEccessful)

    По поводу того чтобы называть переменную также как и тип у нас в команде недавно поднимался вопрос: пришли для себя к тому что тип данных сам всё говорит и писать `var fooBar fooBar` это масло масляное и взрывает мозг читающему 🙂

    Ответить
  3. @derfic

    если интересно на пайтоне все таки это реализовать, можно взять сборочку python + bjoern ( bjoern это wsgi сервер для python, вроде на плюсах написан и выдает тоже приличные результаты по rps )

    Ответить
  4. @MAKAPOHOC

    Не знаю советовали уже или нет, но попробуйте пакет fasthttp вместо стандартного http, вполне возможно получите 145 тыс. Rps

    Ответить
  5. @user-kh7nl8sv1j

    Давай больше Go!)

    Ответить
  6. @devracoon

    В голанг тоже можно без запаривания 9:38 map[string]interface{}
    Дальше говнокодишь:
    eventCode := message.Data.(map[string]interface{})["event_code"].(string)

    Ответить
  7. @DimiEG

    Из Python обычно идут в Go, что и свершилось. 😉 Ждём больше видео по этому языку. Сам перепрыгнув через Go понёсся в Rust. Тоже очень интересный язык, но сыроват и похоже не взлетит. Так что желание заняться Go серьёзнее сохранилось. К тому же для сетевых приложений он идеален. И на нём так же можно создавать сайты. Но похоже нет такого же мощного фреймворка как Django. Спасибо за видео.

    Ответить
  8. @UFCbattles

    Рассматривали ль вы использования C# вместо Go? Если да, то почему выбрали Go? Если — нет, то почему не рассматривали? Спасибо.

    Ответить
  9. @dmitriyobidin6049

    19:28 Скорость написания кода не особо важна, а вот читабельность…
    Но я бы всё таки из 3 углов: скорость написания, читабельность и простота поддержки выбрал именно последние 2 пункта, а по ним Go за счет строгой типизации выигрывает. Там код может быть более самодокументированным. Особенно что касается точек интеграции. В Python/JS проекте если нет документации то хрен разберешься какие форматы JSON'а куда и откуда передаются. И да, gRPC/Protobuf еще лучше будут в этом плане.

    Ответить
  10. @flont1204

    Лично мое мнение и мой фкус по поводу превьюхи видоса. Больше по душе прошлый стиль превьюх, глаз радуется

    Ответить
  11. @user-dm5fe7pq4w

    Не совсем понял принцип работы…

    Поднимается сервер на Go, который ловит на "send" данные а скрипт на python'е просто заносит эти данные в удобном виде в бд?

    Ответить
  12. @ThePashkinz

    Для гоу может быть есть смысл рассмотреть ETCD?

    Ответить
  13. @Virdevir

    Отличная информация , спасибо ! Захотелось освоить Golang , посоветуй пожалуйста книгу или курс по нему для начала ?

    Ответить
  14. @SergeyChernetsky

    А что будет, если в Redis придут записи во время работы питоновского скрипта?

    Ответить
  15. @user-lc6iw9rh8p

    Алексей, я вот щас в смятении правильно ли я выбрал язык для изучения (Python) ?
    Так много разговоров про растущую востребованность, скорость итд golang'а. И тут еще увидел ваш ролик про go….. Может сможете как-то помочь направиться туда куда нужно?)))) Цели у меня на будущее: веб приложения в основном

    Ответить
  16. @rtme846

    после питона синтаксис не вызывает разочарования, спасибо за видео.

    Ответить
  17. @user-mz8fr1li7n

    Гошка топ!!!

    Ответить
  18. @varuzam

    Странный результат у вас получился у fastapi. Подозреваю вы тестили в однопроцессном режиме. Лично в моих тестах fastapi выдает 25000rps, да это все равно меньше чем у golang, но и этого могло хватить

    Ну и плюсую к предыдущим комментариям, редис и питон скрипт в кроне лишние. Хранить счетчики можно прям в памяти программы, и скидывать в базу отдельной горутиной.

    Ответить
  19. @emutant01

    За golang жирный "+", с нетерпением жду видео по нему

    Ответить
  20. @thequarkie

    Отличное видео, бесценные комментарии. Спасибо!!!

    Ответить
  21. @nikitaomen666

    Спасибо за интересные идеи. Тоже писал сервис аналитики на голэнге, но с прямой записью в БД, но у меня и нагрузка не такая, как у вас. Делал не на основе аякс запроса, а на основе подгрузки изображения 1х1пиксель с дополнительными гет параметрами.

    Ответить
  22. @dzianish6223

    Очень крутые темы, спасибо.
    А почему было не писать из го в какую-нибудь очередь по типу кафки? Дальше было бы удобно без кастылей (цикла по редису) складывать события из очереди в бд. Ну и бонусом получили бы историю всех событий и персистентность при необходимости

    Ответить
  23. @ShortsPageTech

    Можно видео сравнения go python

    Ответить
  24. @cyberblogru

    Безусловно Go резвый, но смущает такой бешенный обход по бенчмаркам. В связи с чем вопрос: они точно были проведены корректно? Python фреймворки были распределены по ядрам? Ты ведь понимаешь, что роутер у Go распараллелен, и каждый хендлер сам по себе запускается в новой Горутине, и Go по умолчанию растекается по всем ядрам? Я не сомневаюсь, я просто интересуюсь)

    P.S. Написал два небольших вебсервера на Go (полностью). Сейчас стоит задача написать вебсервер потяжелее, с ролями и доступами, и… не решился) Решил писать на Python

    Ответить
  25. @DK-ue5uf

    3:15 что такое рпс?

    Ответить
  26. @misha_tgshv

    Спасибо за видео! А реально передавать данные об юзере? Например, ip, браузер и гео?

    Ответить
  27. @bingo5334

    Hi, it would be great if you put this code on Github and leave the link in the description. It's a very interesting video.

    Ответить
  28. @kirillthunder1604

    А что у вас за шрифт стоит в vim'e?

    Ответить
  29. @flikos

    Подскажите пожалуйста, а где происходит обнуление счётчика в Редисе?

    Ответить
  30. @sergheiungurean8262

    В FastAPI можно было бы использовать background tasks так как в случае веб аналитики на не важен сам ответ с сервера. Но все ровно больше 7.5k req/sec не поднимится.

    Ответить
  31. @amigo4884

    20:15 — нет ли риска race condition?

    Ответить
  32. @AlexandrSpirit

    Как долго осваивали Go ?

    Ответить
  33. @doom678

    Спасибо!

    Ответить
  34. @realmoftheminone

    Крутой чел

    Ответить
  35. @Levelord92

    почему редИс-то, если это рЕдис… редИс у тебя на огороде растёт

    Ответить
  36. @yan200go

    Спасибо! Хотелось бы больше подобных решений реальных задач

    Ответить
  37. @pavelmilanov3368

    Алексей, подскажите, пожалуйста , на каких ресурсах изучаете Go?

    Ответить
  38. @andavidov

    Отличный материал!

    Ответить
  39. @andreysokolov2335

    Спасибо Алексей, ролик отлично помог моему пониманию "а в каких случаях/для чего/как" можно использовать Go c веб-проектами.

    Ответить
  40. @golden_smiles

    Вангую мы скоро увидим кучу видео по Go 😉 Кучу комплиментов от питониста в сторону данного языка слышать приятно.

    Ответить
  41. @avechess

    2:58

    Ответить
  42. @samrybkin9184

    Привет спасибо за видео уже который раз пересматриваю 🙂 просто интересно твоё мнение какие преимущества есть у golang перед python и какие недостатки перед тем же python?

    Ответить
  43. @ilyachudakov7944

    Супер! Очередное доказательство того что быстрее упираемся в скорость работы БД, чем в производительность языка. Однако вопрос: отчего на го параллельно нельзя писать в БД — типа очередями в удаве? Понятно, что производительность не будет такой же как с Redis, но даже в доке написано, что он только для некритических данных.

    Ответить
  44. @EugeneSereda

    Алексей или сообщество. Вопрос такой. Если Python вытягивает поток, то где гарантия, что второй сервис на python не вытянет такой же поток запросов аналитики? Я правильно же понимаю: зашел на страницу, с нее ajax запрос куда-то ушел. Т.е. одна страница — один запрос?

    Просто пытаюсь понять… зачем здесь был go?

    У нас был проект который на GO принимал все запросы и клал в clickHouse, а оттуда уже медленный PHP вытягивал данные и фасовал в MySQL для аналитики и управления. Здесь оправданно, а в вашем случае…

    Ответить
  45. @revoluxe

    Компиляция и типизация — разные вещи)))

    Ответить
  46. @AlexandrSpirit

    Смотрел что бы изучить вторым языком, Rust или Go
    Для себя понял, что нужно начать с Rust. После него, Go будет намного проще.
    Это как с Flask/FastApi и Django. Новичку начать использовать Flask/FastApi будет сложно. Нужно время что бы во всем разобраться. С джангой проще. Но по себе скажу, после Flask/FastApi джанга кажется простой. Я её толком не изучал, почти сразу на Flask перешел, потом FastApi. А недавно спокойно на джанге несколько тестовых заданий сделал. Может не так быстро, но проблем не возникло вообще.
    Короче, вторым языком нужно брать раст, после можно и го.
    На расте недавно пробовал делать библиотеку для пайтона. Ничего сложного. Зато очень быстро работает.

    П.С. Видел что новая версия Pydantic не только синтаксис поменяла, но и на Rust теперь

    Ответить
  47. @mkhnuser

    Рассматривали бы вы сейчас асинхронное решение на Python (скажем, AIOHTTP, Async FastAPI), вместо сервиса на Go?

    Ответить
Напишите, что вам понравилось