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

Фильм және анимация

Мой курс «Хардкорная веб-разработка» - course.to.digital
Книжный клуб Ботаним!, где мы читаем хорошие ИТ-книги: botanim.to.digital/
Telegram: t0digital.t.me
Сказать спасибо за это видео можно здесь - 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 года и на этом канале делюсь своим опытом. Я основатель и руководитель компаний:
- Диджитализируй digitalize.team, разрабатываем сложные IT системы для бизнеса;
- Salesbeat salesbeat.pro, комплексный модуль доставки для интернет магазинов.
Если у вас есть проект на разработку, пишите нам на hi@digitalize.team.
С другими предложениями, а также если вам нужна одна или несколько индивидуальных консультаций/уроков по разработке (3000 руб/час), пишите мне на alexey@salesbeat.pro.
Telegram канал - t.me/t0digital
ВК - digitalize.team
RuTube - rutube.ru/channel/24802975/ab...
Дзен - dzen.ru/id/6235d32cb64df01e6e...

Пікірлер: 289

  • @georgeparhomenko8432
    @georgeparhomenko84323 жыл бұрын

    Это свершилось! Специалист, который доходчиво объясняет и пишет на языке, который я люблю и использую в работе, использовал и показал как именно технологию, которая мне интересна и которую хочу изучить. Большое спасибо! Побольше бы роликов о таком взаимодействии этих двух технологий

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо! Да, планирую делать материал и по Python, и по Go

  • @evgeniykuts6756

    @evgeniykuts6756

    3 жыл бұрын

    Ещё со школы помню правило, «кто ясно мыслит, тот ясно излагает» это про вас @Didgitalize

  • @t0digital

    @t0digital

    3 жыл бұрын

    @@evgeniykuts6756 спасибо:)!

  • @MaksimZhashkevych

    @MaksimZhashkevych

    3 жыл бұрын

    Привет! Если ищешь материал по Go, заходи ко мне на канал) Я недавно начал публиковать, но на очереди уже стоит огромное количество тем которые я буду раскрывать в дальнейших роликах)

  • @user-oi1zl6de8i
    @user-oi1zl6de8i3 жыл бұрын

    Спасибо за то, что поделились интересным опытом.

  • @miky7miky
    @miky7miky3 жыл бұрын

    Ну наконец то, Алексей, ты добрался до Golang! Счастью нет предела! Ждем массы материалов по Golang, т.к. твои видео очень приятно смотреть! Именно не синтаксис и прочие неинтересности, а где и как его можно применить. Golang + RabbitMQ, Golang + Kafka, Golang + gRPC, Golang + QUIC и прочие интересные связки. Ну и решение каких-то практических задач с помощью Golang. В общем продолжай в том же духе! P.S. многие наверняка уже написали про panic :)

  • @andreysokolov2335
    @andreysokolov2335 Жыл бұрын

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

  • @whoiam7138
    @whoiam71383 жыл бұрын

    Это был самый сочный код на Go. У меня даже пинг приподнялся

  • @user-td6vu1hh3y
    @user-td6vu1hh3y3 жыл бұрын

    обожаю такие видосы с разбором практических кейсов, всегда что-то выношу для себя

  • @t0digital

    @t0digital

    3 жыл бұрын

    Рад, что полезно!

  • @vladimirezh
    @vladimirezh3 жыл бұрын

    В golang не надо использовать panic, верни ошибку. Тем более без defer. Потом pattern matching в golang хорош, лучше перейти на него if-else глаз режет. Ну и я не понял зачем скрипт на удаве, можно запустить горутину и делать раз минуту то, что нужно для выгрузки в базу, тем более, что у таймера есть канал, в который приходит сообщение тика. Ещё бы я подумал над тем, что статистика с разными типами данных приходила в разные обработчики, тогда логика хендлера будет проще. А вообще молодец, что изучаешь и применяешь что-то новое)

  • @killers512

    @killers512

    3 жыл бұрын

    Что подразумевается под pattern matching в golang?

  • @vladimirezh

    @vladimirezh

    3 жыл бұрын

    @@killers512 если просто, то switch в golang умеет много.

  • @ievgenk.8991

    @ievgenk.8991

    3 жыл бұрын

    Какой в го паттерн матчинг?

  • @fazamaza801

    @fazamaza801

    3 жыл бұрын

    Подписываюсь под каждым словом vladimirezh . Лично у нас на проекте panic вообще запрещено использовать. Сервис будет падать нонстоп. При старте main перед Serve и правда можно завести тикер (функция NewTicker из стандартной либы time) и стартануть отдельную горутину. Компилировать исходники лучше на всякий случай прямо на сервере или в докере в аналогичном окружении. WriteSuccessfullResponse / WriteUnsuccessfullResponse лучше вынести в defer, чтобы не дублировать. Не совсем понятно зачем из Find возвращать индекс, если при единственном вызове функции значение индекса игнорируется (_). Ну и switch, да. А вообще для практики проект прекрасный, однозначно лайк.

  • @ievgenk.8991

    @ievgenk.8991

    3 жыл бұрын

    @@vladimirezh Уточни плиз, что switch может, я уже инет перешерстел и ничего интересного не нашел

  • @tankowot
    @tankowot3 жыл бұрын

    Очень круто, лойс, делай еще. Приятно смотреть и вникать!

  • @yan200go
    @yan200go2 жыл бұрын

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

  • @Zermond
    @Zermond3 жыл бұрын

    За голенг лойс:) интересно смотреть ролики, когда с умом выбираются инструменты

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо!

  • @user-fi9xc6nc1q
    @user-fi9xc6nc1q3 жыл бұрын

    Здравствуйте! Спасибо за вашу работу, вы невероятно круто и доходчиво все объясняете! Очень бы хотелось побольше видео о golang))))

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибооо! По Go планирую материалы, да

  • @tam0jennik
    @tam0jennik3 жыл бұрын

    Спасибо за интересную подачу материала и приятные технологии. В свое время делали подобный велосипед на net core, потребовалась пара недель времени (махровый Энтерпрайз -- согласования, подключение ELK,, выдача виртуального сервера и пр.) Отдельная интересная задача была на стороне браузера посылать события пользователя (у нас часть действий никак не завязана на запросы к api, и мы использовали rxjs и buffer оператор для пакетной отправки данных раз в пару секунд, очень круто получилось снизить нагрузку. С интересом слежу за творчеством, хотя и ничерта не пишу на питоне.

  • @troyhunter3586
    @troyhunter35863 жыл бұрын

    Очень круто) благодарю тебя !!!

  • @golden_smiles
    @golden_smiles Жыл бұрын

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

  • @limonred5283
    @limonred52833 жыл бұрын

    Качество контента зашкаливает) Минимум воды, реальные прикладные вещи вместе с кодом и комментарием - это то что нужно людям.

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо! Рад, что полезно

  • @emutant01
    @emutant013 жыл бұрын

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

  • @thequarkie
    @thequarkie3 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    Рад, что полезно!

  • @bpospanov
    @bpospanov3 жыл бұрын

    Охрененное видео, спасибо большое

  • @user-lz3ez3nn4j
    @user-lz3ez3nn4j3 жыл бұрын

    Спасибо за работу, лайк!

  • @nikitaomen666
    @nikitaomen6663 жыл бұрын

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

  • @andy_ap
    @andy_ap3 жыл бұрын

    Хай, большое спасибо за подобного рода видео. Когда курсы? B будет ли там затронут GO?

  • @user-xj2xs3mz9v
    @user-xj2xs3mz9v3 жыл бұрын

    Весьма интересное видео, спасибо!

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо!

  • @jankaban2871
    @jankaban28713 жыл бұрын

    Для первой пробы и написанного за ночь хороший результат, местами чувствуется что по 'питонячески' написано, все же правду говорят что если понимаешь что делаешь то сделаешь на любом языке

  • @devracoon
    @devracoon3 жыл бұрын

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

  • @andavidov
    @andavidov2 жыл бұрын

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

  • @Virdevir
    @Virdevir3 жыл бұрын

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

  • @samrybkin9184
    @samrybkin9184 Жыл бұрын

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

  • @pin689
    @pin6893 жыл бұрын

    Второе соображение по архитектуре, как уже правильно написали, редис тут может и ненужен, достаточно просто большого словаря в памяти прямо в go сервере, только надо незабыть его синхронизировать. И там же в go сервере задача раз в минуту все суммирует и складывает в postgres, вместо скрипта на python

  • @user-dy2ei6hl5q
    @user-dy2ei6hl5q3 жыл бұрын

    Дайте пожалуйста информацию по курсам! Уже за середину сентября перевалило, а обещали в начале месяца первый модуль...

  • @evgeniykuts6756
    @evgeniykuts67563 жыл бұрын

    Круто очень сам работаю в рекламной бирже. Все сервисы на Golang, python используем для парсинга статистики с других бирж. Полезный материал, спасибо!!! Когда уже курсы от вас будут? С удовольствием пойду, если там будет похожие вещи, не совсем уже для начинающих разработчиков.

  • @artydevco
    @artydevco3 жыл бұрын

    Спасибо большое! Коммент для продвижения :)

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо!

  • @sergheiungurean8262
    @sergheiungurean82623 жыл бұрын

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

  • @ASKOLDEX
    @ASKOLDEX3 жыл бұрын

    Перед тем как читать r.Body, строчкой выше добавь defer r.Body.Close() иначе будет течь память

  • @DimiEG
    @DimiEG3 жыл бұрын

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

  • @lEpIvIaKl

    @lEpIvIaKl

    Жыл бұрын

    А как нынче Go? А то он кажется тоже сыроватым в плане некоторых аспектов. А Раст всё же сыроват тоже остался?

  • @gwhite224
    @gwhite2243 жыл бұрын

    Я бы только в питоновском скрипте при подготовке запроса с форматированием строки использовал бы psycopg2 -> sql -> SQL. Он защищает строку от инъекций и иного рода неожиданностей. Хотя в данном случае это и не обязательно, но у меня работает уже как условный рефлекс :)

  • @derfic
    @derfic3 жыл бұрын

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

  • @likhomanov_777
    @likhomanov_7773 жыл бұрын

    Задам вопрос, который меня когда-то заинтересовал. Я узнал о таком понятии как orm, то есть в питоне это как-бы приветствуется. Что думаете о таком подходе при работе с бд? То есть мы работаем как с моделью с peewee, нежели через psycopg2 .

  • @user-qi6ow4dx5r
    @user-qi6ow4dx5r3 жыл бұрын

    Классно!

  • @misha_tgshv
    @misha_tgshv3 жыл бұрын

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

  • @bandirom
    @bandirom3 жыл бұрын

    Супер информативно

  • @flont1204
    @flont12043 жыл бұрын

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

  • @pavelmilanov3368
    @pavelmilanov33682 жыл бұрын

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

  • @levcoder
    @levcoder3 жыл бұрын

    по надобности, если нужно увеличить рпс то посмотри в сторону go fasthttp

  • @makeitgit
    @makeitgit3 жыл бұрын

    keys у Redis имеет сложность O(n). Попробуйте использовать hincrby, тогда скрипт на питоне будет обращаться всего к двум ключам через hscan

  • @rinat661
    @rinat6613 жыл бұрын

    Забавный язык, на работе в некоторых сервисах(пуш, чат, аналитика)использую, хотя в плане гибкости язык достаточно слабый, поддержки метапрограммирования как такового нет, рефлексия только но... это не то. Самое шикарное в языке это горутины и минимализм по сравнению с другими языками строгой типизации, ждем дженериков для большего удобства в го) А для души я лично использую Rust )

  • @alexanderpastuhanov174
    @alexanderpastuhanov1743 жыл бұрын

    Круто! Пора садиться за Golang)

  • @t0digital

    @t0digital

    3 жыл бұрын

    интересный язык, да

  • @rumartru

    @rumartru

    3 жыл бұрын

    Ага, только работы по нему для джунов нет.

  • @MaksimZhashkevych

    @MaksimZhashkevych

    3 жыл бұрын

    Заходи на мой канал, там сможешь найти материалы чтобы стартануть с Go)

  • @user-kh7nl8sv1j
    @user-kh7nl8sv1j3 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    Постепенно будет больше Go, да

  • @mkhnuser
    @mkhnuser8 ай бұрын

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

  • @azamatmuratshin
    @azamatmuratshin3 жыл бұрын

    Спасибо)

  • @doom678
    @doom6782 жыл бұрын

    Спасибо!

  • @friedrichalbertkyuri
    @friedrichalbertkyuri3 жыл бұрын

    Пишем давно на го в компании. Юзаем grpc и go-micro для сервисов, а api gateway на echo пишем. Echo очень удобный фреймворк, лишает ненужной мороки

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо за упоминания! Посмотрю

  • @alexfish289
    @alexfish2893 жыл бұрын

    Нужно больше веба на го

  • @omdez
    @omdez3 жыл бұрын

    связка Python/Go прекрасна

  • @t0digital

    @t0digital

    3 жыл бұрын

    Да! Go скорость работы, Python скорость реализации

  • @voynere

    @voynere

    3 жыл бұрын

    @@t0digital Лучше go + angular 😁

  • @user-lc6iw9rh8p
    @user-lc6iw9rh8p3 жыл бұрын

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

  • @MrPeredreifus
    @MrPeredreifus3 жыл бұрын

    Всё прикольно, но я бы советовал не использовать panic. Лучше возвращать error. Тогда тебе не придется ловить паники через recover

  • @dzianish6223
    @dzianish62233 жыл бұрын

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

  • @vlaih0
    @vlaih03 жыл бұрын

    Ну, Кен Томпсон красавчик. Отличную работу провели и отличный язык создали. Так сказать отыгрались за Си, созданный на коленке.

  • @t0digital

    @t0digital

    3 жыл бұрын

    отыгрались, да:)

  • @misteranderson6058
    @misteranderson60583 жыл бұрын

    I'd like you to give us lessons on golang, ranging from simple to more complex

  • @vadimdorokhov8375
    @vadimdorokhov83753 жыл бұрын

    Go крутой) да))) и видос крутой) спасибо

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо!

  • @mrbush1872

    @mrbush1872

    3 жыл бұрын

    @@t0digital похоже , проектов на Golang станет больше ) Похоже , зашел те ЯП )))

  • @t0digital

    @t0digital

    3 жыл бұрын

    @@mrbush1872 быстрый, конечно. Больший RPS - меньше серверов надо и бОльшую нагрузку тянем. Мы сейчас 10% выручки тратим на сервера, это овер дофига

  • @mrbush1872

    @mrbush1872

    3 жыл бұрын

    @@t0digital интересно намного ли сложнее реализовать , то что можно сделать на Django ?...хотя по тех показателям в будущем будет выигришь

  • @t0digital

    @t0digital

    3 жыл бұрын

    @@mrbush1872 пока не ответил себе на этот вопрос. В будущем поделюсь :)

  • @MikhailChernoskutov
    @MikhailChernoskutov3 жыл бұрын

    Привет Мог не доглядеть какой-то кусок кода, да и прошло уже 2 недели (наверняка уже что-то исправлено), а что-то наверняка уже писали в коментах 10:01 Мы в команде пытаемся не создавать клиентов в глобальных переменных/переменных пакета (как в данном случае сделан клиент rdb). Да и делать отдельный background контекст в виде переменной тоже не совсем понятно зачем: никакой полезной нагрузки с ним сделать не получится, а создавать context.Background() по месту достаточно дешево. successfull и unsuccessfull response message я бы не стал разделять: они всё-равно судя по тегам будут замаршалены в один и тот же json. И кстати в названии типа опечатка (unsEccessful) По поводу того чтобы называть переменную также как и тип у нас в команде недавно поднимался вопрос: пришли для себя к тому что тип данных сам всё говорит и писать `var fooBar fooBar` это масло масляное и взрывает мозг читающему :)

  • @ilyachudakov7944
    @ilyachudakov7944 Жыл бұрын

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

  • @user-gs6ms6qd3k
    @user-gs6ms6qd3k3 жыл бұрын

    Алексей, pipenv vs. poetry?

  • @AlexandrSpirit
    @AlexandrSpirit9 ай бұрын

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

  • @EdwVee
    @EdwVee3 жыл бұрын

    Где-то 6-7 минута - с гоу можно ж хранить данные сразу в оперативке веб сервера и оттуда писать батчи или агрегаты в базу. Зачем редис и скрипт на питоне? А если для статы взять clickhouse (при условии, что подходит) будет ещё в разы веселее.

  • @ThePashkinz
    @ThePashkinz3 жыл бұрын

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

  • @rtme846
    @rtme8463 жыл бұрын

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

  • @valentynanzhurov4465
    @valentynanzhurov44653 жыл бұрын

    Спасибо за крутой видос!!!! Что за чёрная штука справа? Что за часы и что за белая штука в руках ?))))

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо! Справа колонка Harman Kardon Aura Studio 3. Часы Casio GA-2110SU-9A, я часовой маньяк, пополнил недавно мини коллекцию:) В руках текстовыделитель EDDING EcoLine 24, нравится тактильно и что-то выделить иногда приятно

  • @ShortsPageTech
    @ShortsPageTech3 жыл бұрын

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

  • @maxpower6755
    @maxpower67553 жыл бұрын

    в комментах не нашел, сорян если дубликат для сериализации json в структуру - оч реккомендую easyJson от mailRu. Суть в том, что коробочный сериалищатор оч медленный, ибо он работает через рефлексию. натравливаешь easyJson на свой go файл где описаны struct, он тебе сгенерит файл, который будет значительно быстрей выполнять де/сериализацию json так ты сможешь еще увеличить нагрузку на гошный сервак и да, как ранее писали, panic лучше не юзать. замени на логирование с алертом. паника дорогая операция, которую надо оборачивать в recovcery, иначе бинарник свалится и надо будет ждать его рестарта (если он как демон)

  • @LRXAORLOV
    @LRXAORLOV3 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    Будет Go:)

  • @bingo5334
    @bingo53343 жыл бұрын

    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.

  • @temirzhanyussupov6997
    @temirzhanyussupov69973 жыл бұрын

    Спасибо за видео! Подскажите пожалуйста, на 16:00 что за vim шорткаты, чтобы быстро пройти к дефиниции Find, а потом обратно вернуться к тому место где были изначально?

  • @t0digital

    @t0digital

    3 жыл бұрын

    Команда * делает переход к следующему использованию того слова, на котором сейчас стоит курсор, он стоит на Find, жмем *, переходим к определению Find в этом же файле. Вернуться назад - скорее всего я использовал метку на изначальной строке, у меня на автоматизме это происходит в фоне, не задумываясь. Комбинация mx ставит метку x на текущей позиции, и потом, когда к ней надо вернуться, комбинация 'x возвращает к метке. Меток можно делать много, когда в одном файле надо прыгать между двумя блоками, ставлю две метки mx и mq и прыгаю по ним 'x и 'q соответственно, удобно. Если надо перейти к последнему месту, в котором происходило редактирование, команда `. это сделает.

  • @itosla

    @itosla

    3 жыл бұрын

    @@t0digital Добрый день. Подскажите, есть ли возможность увидеть ваш vimrc файл? Это очень помогло бы в настройке редактора.

  • @t0digital

    @t0digital

    3 жыл бұрын

    @@itosla есть такое видео на канале, там есть описание и ссылка

  • @Ackep_Tu6ae8

    @Ackep_Tu6ae8

    3 жыл бұрын

    @@t0digital круто! А не хотите сделать обзор этих и других трюков по Vim?

  • @t0digital

    @t0digital

    3 жыл бұрын

    @@Ackep_Tu6ae8 как-нибудь сделаю!

  • @user-qd4sn3oy8w
    @user-qd4sn3oy8w3 жыл бұрын

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

  • @sergeyk1982
    @sergeyk19823 жыл бұрын

    ИМХО, есть 2 проблемы в такой архитектуре: 1. когда структура данных измениться или дополниться новыми полями/евентами, необходимо будет менять (и тестировать) 2 программы. Если будет баг, его скорее всего придется искать в двух местах. 2. данные не сохраняются в своем оригинальном виде (в котором AJAX их присылает), нет лога. Если завтра будет нужно изменить логику агрегации данных (подсчитывать что-то по другому) или выявится какой-то косяк в логике, эти скрипты невозможно прогнать ретроактивно, скажем, на все данные пришедшие с начала месяца. А значит изменения можно делать только для данных, которые придут потом. Я бы сделал чтобы GO только писал пришедшие данные (как они есть) в конец кокого-нибудь yyyy-mm-dd.log файла и сразу возвращал 200 ОК. Максимально быстро и "тупо". Скорее всего в GO можно даже сразу вернуть 200 и закрыть http соединение, а уже потом заниматься записью пришедших данных - будет еще быстрее для клиента. Конечно получиться много мегабайтов на диске, но кто их считает в наши дни :) И уже python скрипт занимался бы парсингом лог файлов и сохранением в БД. А агрегацию (подсчет различных каунтеров) я бы вынес еще в отдельный скрипт и делал бы это уже внутри БД - postgres справляется с такими задачами отлично. Возможно вместо файлов можно использовать Kafka, как уже писали. Но Redis тут наверняка лишний. Я обычно использую парсинг скрипты которые бегут из крона с определенной периодичностью (в зависимости от того, насколько актуальной должна быть статистика в отчетах). Эти скрипты каждый раз перерабатывают 2 последних yyyy-mm-dd.log файла: стирают данные за последние 2 дня в БД, парсят данные из файлов и заносят обновленные результаты за те же 2 дня обратно в БД (если данных прям "очень много", то можно использовать баффер в 2 часа). А потом, если нужно, данные агрегируются по дням, месяцам, или чему-то еще, и результаты заносятся в агрегационные таблицы (которые уже используются для отчетов). Это конечно не 100% эффективно, но надежно, тестируется, ошибки/недоработки всегда можно исправить и все пересчитать за любой период.

  • @MakarenkoSasha
    @MakarenkoSasha3 жыл бұрын

    Так.. что там по курсам?

  • @dmitriyobidin6049
    @dmitriyobidin60493 жыл бұрын

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

  • @user-tx4ie5fd6d
    @user-tx4ie5fd6d3 жыл бұрын

    Если правильно понял, то не стоит обнулять счетчики, иначе потеряете несколько новых значений пока работает крон скрипт. Лучше уменьшить значение счетчика на то чесло, что было считано изначально(которое записали постгрес)

  • @t0digital

    @t0digital

    3 жыл бұрын

    Обнуление происходит через GETSET, один вызов возвращает значение и обнуляет его в Redis. При этом сам Redis однопоточный, то есть на время работы GETSET никакой другой код не работает с этим ключом. Значения не теряются

  • @Plysho
    @Plysho3 жыл бұрын

    А как вы определяете момент обнуления счётчиков и перелив скриптом в базу? Как быть уверенным что в этот момент в Reids ничего не прилетит?

  • @t0digital

    @t0digital

    3 жыл бұрын

    Getset отдаёт значение ключа и сбрасывает его за одну команду. И redis однопоточный, что удобно

  • @tanks-blitz-shorts
    @tanks-blitz-shorts3 жыл бұрын

    Видео классные, очень нравятся, Спасибо!! Вот теперь еще и про Go узнал(точнее впервые код увидел на Go), заинтересовало) Но вот каждый раз я задаюсь вопросом: а где ссылка на github? Не знаю как другим, а мне интересно посмотреть код в редакторе после просмотра видео)

  • @t0digital

    @t0digital

    3 жыл бұрын

    Мой код на go пока плохой, не хочу выкладывать. Как изучу язык нормально, буду выкладывать. Вы узнали про go, заинтересовались - цель этого видео достигнута:) продолжим о go в следующих видео

  • @nurk9928

    @nurk9928

    3 жыл бұрын

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

  • @Johniooooo
    @Johniooooo3 жыл бұрын

    Лайк за реальный кейс

  • @bloodielie7280
    @bloodielie72803 жыл бұрын

    Хотелось бы увидеть код тестов rps разных фреймворков, а именно fastapi

  • @Deletedeletedelete

    @Deletedeletedelete

    3 жыл бұрын

    Было же

  • @realmoftheminone
    @realmoftheminone2 жыл бұрын

    Крутой чел

  • @Delimor
    @Delimor3 жыл бұрын

    Запускай хоть fmt, а то анотации у структур не читабельные. Кстати, проще запустить горутину которая будет слушать канал от time.NewTicker(15 * time.Minute), это позволит более легко менять код, да и будет легкий scratch контейнер (не нужно тащить cron).

  • @nurbekerkulov8154
    @nurbekerkulov81543 жыл бұрын

    Интересно не мешает ли работа python скрипта на работу сервера на golang. Т.е. что будет, если в момент когда питон скрипт обнуляет redis golang захочет что-то записать... Возможно я что-то не понимаю ибо не работал с redis.

  • @t0digital

    @t0digital

    3 жыл бұрын

    забор ключей питоном происходит через GETSET, то есть одной командой забирается значение и проставляется новое (ноль или пустая строка в нашем случае), соответственно между забором данных в питон скрипт и следующей записью Go программой в редис данные не потеряются. И надо понимать, что Редис однопоточный

  • @user-ce9tt7si1p
    @user-ce9tt7si1p3 жыл бұрын

    Спасибо за контент! Как думаешь, сможет ли Go вытолкать Python, PHP из веб, если обрастет различными плюшками для работы со структурами данных, CRUD-генераторами/админки(аля Django)? Или все равно упремся в вопрос невозможности построения абстракций в Go при попытке создать большой проект и выходом в итоге на большую головную боль? Сложилось впечатление, что Go хорош для узких, но требовательных задач. Как в твоем случае, например. Интересно твое мнение.

  • @nornad-x

    @nornad-x

    3 жыл бұрын

    У go своя ниша. Он не стремится вытеснить других полностью.

  • @flikos
    @flikos3 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    там через getset происходит считывание данных из редиса в питон скрипте, то есть одной командой данные считываются и устанавливается новое значение

  • @Deletedeletedelete
    @Deletedeletedelete3 жыл бұрын

    Синтаксис Го выглядит довольно привычным после Python, Ruby и Crystal

  • @UFCbattles
    @UFCbattles3 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    Не рассматривал, хотя знаю, что многие C# любят и хвалят

  • @amigo4884
    @amigo48843 жыл бұрын

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

  • @alexander_farkas

    @alexander_farkas

    2 жыл бұрын

    getset - атомарная операция

  • @vadimdorokhov8375
    @vadimdorokhov83753 жыл бұрын

    Сервис очередей можно было бы, на мой взгляд, использовать вместо (redis+скрипт раз в минуту).

  • @t0digital

    @t0digital

    3 жыл бұрын

    Да, можно

  • @evrmk
    @evrmk3 жыл бұрын

    Очепатка - может Successful?) Спасибо за видео! Можно ли легко внедрить такую технологию на любой Django проект?

  • @t0digital

    @t0digital

    3 жыл бұрын

    Можно!

  • @evrmk

    @evrmk

    3 жыл бұрын

    @@t0digital Круто 😁 Спасибо за Ваши труды. Очень жду курс и надеюсь, что хватит на него денег 😅

  • @SergeyChernetsky
    @SergeyChernetsky3 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    Редис работает в одном потоке, все будет ок

  • @user-xj2xs3mz9v
    @user-xj2xs3mz9v3 жыл бұрын

    про гошный пакет для ssl сертификатов. вот прям слов не хватает чтобы выразить насколько это круто! Но только. А гошный сервис у вас что, наружу торчит? А он у вас задеплоен отдельно от основной приложухи? А если нет, то почему бы его за nginx (или что вы там предпочитаете) не спрятать? тогда еще и надобность в cors отпадет

  • @t0digital

    @t0digital

    3 жыл бұрын

    С этим гошным пакетом для SSL у нас кстати возникли сложности (некоторые запросы отрабатывали ооочень долго, десятки секунд), я пока не могу утверждать, что точно из-за него, но сейчас мы все-таки проставили там заранее подготовленные сертификаты и таких долгих ответов пока не замечаем. Гошный сервис лежит на отдельном сервере, чтобы он точно не влиял на работу основной железки, на которой крутится админка сайта и прочие сервисы. Ставить Go приложеньку за nginx или не ставить я пока не понял общей практики. Кто-то ставит, кто-то нет. В целом Go сервер хорошо и статику отдаёт (dl.google.com на Go, это сервер отдачи файлов от Google, раздаёт Google Chrome в частности). Если ставить go приложение за nginx, RPS сразу падает в несколько раз. Возможно надо докручивать Nginx, но с дефолтными настройками это выглядит грустно.

  • @user-oi1zl6de8i
    @user-oi1zl6de8i3 жыл бұрын

    Скажите, а Вы не пробовали cython для ускорения python-кода?

  • @t0digital

    @t0digital

    3 жыл бұрын

    не пробовал

  • @user-oi1zl6de8i

    @user-oi1zl6de8i

    3 жыл бұрын

    @@t0digital Мне удавалось компилировать свои модули и ускорять выполнение функций в сотни, тысячи раз.. и даже больше.. рекомендую обратить внимание на эту технологию

  • @t0digital

    @t0digital

    3 жыл бұрын

    Спасибо, посмотрю в эту сторону!

  • @EugeneSereda
    @EugeneSereda Жыл бұрын

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

  • @grokgustavo
    @grokgustavo3 жыл бұрын

    Алексей, как передать данные в go с сайта, через ajax? А то я так и не понял, как это у вас происходит.

  • @t0digital

    @t0digital

    3 жыл бұрын

    Так же, как и в случае с любым другим языком на бэкенде. Не понял вопрос

  • @grokgustavo

    @grokgustavo

    3 жыл бұрын

    @@t0digital Вы вообще спите? 😄

  • @t0digital

    @t0digital

    3 жыл бұрын

    @@grokgustavo ananasposter.ru/noch-rabote-ne-pomeha :)

  • @grokgustavo

    @grokgustavo

    3 жыл бұрын

    @@t0digital Спасибо за бесценные видео!

  • @alexanderdark
    @alexanderdark3 жыл бұрын

    Интересно, но нашёл ошибку в коде на 17:35, правда в комментарие)) Undefined word: finded.

  • @Deletedeletedelete

    @Deletedeletedelete

    3 жыл бұрын

    У вас тоже ошибка в «комментарие»

  • @user-mz8fr1li7n
    @user-mz8fr1li7n3 жыл бұрын

    Гошка топ!!!

  • @kirillthunder1604
    @kirillthunder16043 жыл бұрын

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

  • @t0digital

    @t0digital

    3 жыл бұрын

    Скорее всего Monaco тут

  • @kirillthunder1604

    @kirillthunder1604

    3 жыл бұрын

    @@t0digital спасибо

  • @user-hi6jj5qv9k
    @user-hi6jj5qv9k3 жыл бұрын

    Go + Python = реализация абсолютно любой задачи для бизнеса.

  • @t0digital

    @t0digital

    3 жыл бұрын

    Дааа!

  • @nitroflap

    @nitroflap

    3 жыл бұрын

    @@t0digital Абсолютно согласен с вами и Александром! Вообще смешно немного вышло, я использую почти тот же стек во многих проектах.

  • @Ackep_Tu6ae8

    @Ackep_Tu6ae8

    3 жыл бұрын

    Кроме фронтэнда, мобильной разработки и embeded-разработки.

  • @misteranderson6058

    @misteranderson6058

    3 жыл бұрын

    @@Ackep_Tu6ae8 Придет время Go будет и в мобилках и десктопе и в embeded

  • @adatanold9067

    @adatanold9067

    3 жыл бұрын

    @@misteranderson6058 ой, а что это? Ой, а это не структура с кучей анонимных структур? Ой, а что это? Задержки при GC раз в 2 минуты на 300 мс? Ой, а что это UB? Ой, а как-то? Сказал не подумав?

Келесі