Задать вопрос
  • Какой можно применить алгоритм для хранение индекса для 50 миллиардов записей в golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Немного бухгалтерии. Если взять по максимуму.

    Размер одной записи должен быть порядка 60 + 32 +8 = 100 символов (байт для простоты)

    При 50 млрд записей объем хранимых данных должен быть порядка

    50 000 000 000 * 100 = 5 000 000 000 000 = 5 триллионов байт.

    В дисковом хранении это будет примерно 4.5 терабайта. Задачка для in-memory неподъемная. Нужен диск + мемори.

    Если я там где-то ошибся в расчетах - то только в средних значениях. Если подставить не максимумы а среднее - то цифры будут поскромнее. Но в любом случае - многовастенько для покупки памяти.

    Вобщем нужна дисковая БД которая встраивается в приложение. На требование менеджеров которые запретили использовать БД забейте. Они ничего не понимают. Делайте БД встраиваемую в приложение. В качестве таких (встраиваемых систем можно поробовать) LevelDb, BerkeleyDb, RocksDb. Они поддерживают индекс класса B+Tree и это даст возможность искать группы записей по одному ID. Для этого класса систем любую запись можно найти за 4-5 дисковых IOPS. Если какдый IOPS стоит 15 мс (это я так мерял свой собственный магнитный HDD) то любой поиск группы ключей для TTFB будет порядка 15 * 5 = 75 милисекунд. Ну если вы поставите SSD - то быстрее.

    По поводу предложений хранить в файлах. До того как обсуждать это - надо уяснить требования по времени отклика. Сколько секунд вы согласны ждать - насколько можно и партицировать (или шардировать ваш файл).
    В простейшем случае мы делим большой CSV файл на 512 partitions по хешу от ID и получаем соотв время фулл-скана всего файла поделенное на 512. Дальше - играйтесь с этим параметром партишенинга выводя его на доступный уровень отклика. Из недостатков - будет россыпь файлов. Надо почиать документацию на вашу файловую систему (ext4?) и тюнить ее так чтоб она не сдохла от такого числа inodes.

    Я поддержу оба сценария. И с встраиваемой БД и с файлами. Но с БД надежнее т.к. есть транзакции а файлы у вас могут быть в крешнутом состоянии долго. И вы об этом ничего знать не будете.

    По поводу Parquet. Не взлетит. Скорее всего индекс по данному типу файла - это совсем не то что вкладывают туда релационные системы. Обычно Parquet/Orc/Delta вкладывают в индекс смысл - отбрасывания тех полосок данных (stripes) которые бесполезны при чтении всего файла. Такой индес - обычно просто либо range-признак либо карта Блума. И в случае с range - дает эффект на сортированных данных. Для прочих - будет бесполезно т.к. фулл-скан все равно обеспечен. А если фулл-скан то зачем тогда вообще индекс.

    Вобщем для дизайна архитектуры нам нужны цифры. Средние длины по колонкам. И я-бы еще запросил кардинальность по полю ID.
    Ответ написан
    7 комментариев
  • Как правильно реализовывать прелоадеры?

    0xD34F
    @0xD34F Куратор тега Vue.js
    должен быть более лаконичный способ, чем плодить такие переменные

    Смотрите, где какие куски кода есть похожие, оформляете их в отдельный компонент. А что у них разного - будет параметрами этого компонента.

    Или это считается нормальной практикой?

    Да, считается. У говнокодеров.
    Ответ написан
    3 комментария
  • Как подключитЬся с помощью Golang к другой программе?

    1. Через сетевой протокол на API сторонней программы. (обычно используют JSON RPC, REST, GRPC)
    2. Через вызов клиента другой программы в командной строке из вашего приложения и парсинг вывода.
    3. Вызов функций SDK, предоставленного сторонней программой (обычно через cgo).

    Остальные способы обычно довольно геморойные и редко используются.
    Ответ написан
    Комментировать
  • Есть ли подводные камни в использовании ссылок Golang в горутинах?

    @Zolg
    но открыл для себя особенность, что если передавать ссылку в горутину, в горутине будет самое последнее значение переменной в цикле
    это не 'особенность', это основная фича ссылок. В любом ЯП.

    Сама переменная - это некоторая область в памяти, в которой записано то, что в этой переменной содержится.
    При передаче параметра по значению ('без ссылок') создается еще одна такая же область в памяти, куда копируется содержимое исходной переменной. И код вызванной функции работает уже со своей копией.

    При передаче параметра по указателю ('с сылками') копия переменной не создается, а в вызываемую функцию передается адрес (указатель, ссылка) области памяти в которой лежат оригинальная переменная. И вызванная функция работает уже с ним.

    Очевидно, что когда два куска кода одновременно могут писать читать в одно и то же место памяти - они мгновенно 'видят' изменения, вносимые каждым.

    И, естественно, в общем случае без дополнительных усилий это не thread/goroutine/etc. safe. Причем в случае, если сама переменная - что-то посложнее int, то эффект от такой одновременной работы может быть гораздо более занятным, чем просто изменение значения.
    Ответ написан
    2 комментария
  • Стоит ли использовать esbuild для сборки фронта сегодня?

    @deliro
    Я пару недель назад перевёл сборку фронта с rollup на esbuild. Время сборки упало с 13с до 200мс (x65 ускорение). У коллег на M1 это время стало вообще 40мс

    Из минусов заметил только отсутствие таргета ES5 (ну как заметил, об этом в доках пишут везде). Кстати, перевод таргета на ES6 уменьшил размер бандла незначительно (в основном за счёт сокращения function() в ()=>)

    Больше проблем нет
    Ответ написан
    2 комментария
  • Один проект или коммерческая разработка?

    RAFAILgaley
    @RAFAILgaley
    нет в жизни ничего хуже чем работа на заказ в россии
    лучше пилить один продукт и заниматься своими проектами
    Ответ написан
    Комментировать
  • Как скрыть див блок кнопкой в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно вообще без JS, только стилями и невидимым чекбоксом, но разметка должна быть специфической:

    Ответ написан
    Комментировать
  • Почему так тяжело решать задачи?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Это нормально. Мозг развивается практикой и процесс этот мало того, что не быстрый, так ещё и бесконечный.
    Ответ написан
    Комментировать
  • Почему так тяжело решать задачи?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Попробуй поднять 300 кг, если никогда до этого не занимался тяжелой атлетикой.
    Думаешь через 5 месяцев станет легко?

    Мозг также само развивается не так быстро, как хочется.
    Это только кажется что прочитал 10 книг и стал умнее. Надо решить тысячу задач, чтобы мозг привык их решать и начал оптимизировать собственные процессы.

    Решай, смотри чужие решения. После того, как решил задачу каким-то неэффективным способом, а потом нашел улучшение а потом еще и подсмотрел чужое - ты будешь гораздо лучше понимать почему хорошее решение хорошее.
    Ответ написан
    2 комментария
  • Что нужно знать перед изучением angular и react?

    Про Реакт не скажу, но в Ангуляре (если мы о 2-м - 4-м) очень важной зависимостью является RxJS. Это сама по себе очень полезная вещь.
    Более того, я бы посоветовал вместо Ангуляра и Реакта посмотреть на замечательный фреймворк CycleJS, который построен на идее RxJS. У него очень простая, чистая и мощная архитектура. Если её освоить - многое увидится в новом безоблачном свете. Главный минус CycleJS в отсутствии готовых комплектов вроде Material для Ангуляра. Это скорее инструмент, чем готовое решение. Но в обучении это лишь плюс - больше простора для практики.

    Кроме того, полезно освоить концепцию функционального программирования, насколько это возможно в JS. Идею иммутабельных (персистентных) структур данных. Основные функции высшего порядка (вроде map, flatMap, foldLeft/reduce и др). Функциональную композицию и point-free (tacit) стиль. Очень рекомендую посмотреть на библиотеку Ramda. Всё это не является обязательным пререквизитом для Ангуляра и Реакта, но может существенно повлиять на то, как Вы пишете код.

    CycleJS и Ramda - точно помогут в более углублённом изучении JS.
    Angular очень хорошо учить по книге ng-book 2.
    Ответ написан
    Комментировать
  • Курс или полный гайдлайн по git?

    Попробуйте следовать https://www.atlassian.com/ru/git/tutorials/compari...

    К проблеме которую вы описали:

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


    Не сливайте feature-ветку пока она не будет полностью протестирована и code-rewiew'ирована.
    Склеивайте комиты в feature-ветке, чтобы их в итоге было не больше 1-3.

    Из собственного опыта могу сказать, что чем крупнее и неспешнее проект - тем проще следовать git-flow.
    А вот когда 1-2 разработчика и нужно вот сейчас ещё вчера запилить 10 фич... бывает сложновато.

    Это вопрос дисциплины и организованности. Как ставятся задачи, как вы фокусируетесь на текущей фиче (нельзя носиться по всему проекту и фиксить по пути всё что под руку попалось). Организации самого проекта в конце концов - как изолированы компоненты и т.д.
    Ответ написан
    Комментировать
  • Где найти книги или курсы по PHP, где даётся проектирование приложений с учётом ООП?

    DollyPapper
    @DollyPapper
    Их не нужно сравнивать. Эти подходы дополняют друг друга. Внутри методов класса ты как ни крути пишешь процедурный код.
    Ответ написан
    Комментировать
  • Как быстро вникнуть в чужой код?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Задавать окружающим вопросы. Ртом. Повторять пока не станет понятно
    Ответ написан
    5 комментариев
  • Как запустить n горутин на golang?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Например так
    //На N промежутков
    step:=(end-start)/N
    for n := 0; n < N; n++ {
        from := start + n*step
        to := from + step
        group.Go(func() error{ 
             return process(from, to)})
         })
    }
    Ответ написан
    Комментировать
  • Как запустить n горутин на golang?

    @12rbah
    Честно говоря не совсем понял в чем проблема, просто запускайте горутины в цикле, который будет иметь кол-во итераций зависящее от start-end.
    Ответ написан
    2 комментария
  • Как понимать програм-е, и писать собственный код?

    @rPman
    Как эффективнее всего выйти из этих рамок , и научиться писать собственный код?
    Решать задачи не через использование готовых решений но и до крайностей не доходить. Совершенно нормально не заниматься разбором видеофайлов на низком уровне, хватит научиться пользоваться ffmpg.

    Еще важный момент - правильный выбор задач.

    Задача не должна быть слишком сложной - иначе неудачи отобьют желание учиться.
    Задача не должна быть бессмысленной - найдите какую-нибудь простую задачу, которую вы делаете руками постоянно, файлики переименовываете, запятые в экселе лишние удаляете ручками,... вроде простые задачи руками легко, но и польза от автоматизации будет.
    Выбирайте удобный и приятный для использования именно вам инструмент, а не то что советую откружающие. Одно время все говорили - бери bash крутой скриптовый язык, мегакруто, мегаудобно... ага, но мне почему то на php скрипты общего назначения писать получается гораздо удобнее, и читабельнее абракадабры.

    Нужно понимать, что великим программистом за сутки вы не станете, и за месяц не получится, и за год тоже, хотя через год, при должном старании, можно выйти на вполне себе заметную оплату труда.
    Ответ написан
    Комментировать
  • Как понимать програм-е, и писать собственный код?

    Чтобы научиться писать код, надо писать код. Да, даже если не получается просто брать и решать задачу, даже если ее решения не видно.
    Ответ написан
    Комментировать
  • В каких приложениях Go существенно эффективнее чем Node.js и PHP?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Бенчмарки - это хорошо, но очень важно понимать что именно там меряли и почему результаты именно такие.

    Несколько лет назад я тоже делал бенчмарки Python, PHP, Node, Go.
    Для меня были важны две вещи:
    1 - скорость ответа сервера/кол-во запросов в секунду
    2 - объём сервиса в памяти, т.к. от этого зависит стоимость ресурсов

    На тесте, где сервисы не делали запросы в базу - из всех четверых лучше всего отработал Go с приличным отрывом, цифры, к сожалению, уже не помню.

    Но вся эта разница сошла на нет, как только добавился всего один простой SQL запрос в базу, в таблицу с 10 строками. И на этом фоне разница по скорости ответа была меньше 10%.

    Иными словами если ваш сервис работает с базой - критической разницы по скорости работы между Go/Rust/PHP/Node/Java, особо не будет.

    Другое дело если ваш сервис не будет делать запросы в базу, или будет кешировать результаты запросов, тогда вы почувствуете ощутимую разницу.

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

    Один экземпляр Go занимал в памяти порядка 6мб RAM, при том, что Pytho+Django порядка 60мб.
    Node уже не помню сколько, но что-то близкое к Python'у.

    Вот тут уже, когда серверов у вас будет много - количество серверов с Go у вас будет в 10 раз меньше, соответственно расходы за эти сервера у вас будут в 10 раз меньше :)

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

    Где-то читал статью, что у людей было API на порядка 40 серверов на Node, после переписывания на Go - серверов осталось два, из которых второй запасной :)
    Ответ написан
    13 комментариев
  • Как обновить сайт из git репозитория?

    BorLaze
    @BorLaze
    Java developer
    Не надо загружать ветки. Ветка - для разработки. master - для "боевого кода".

    Релизуем фичу в ветке, проверяем, если считаем, что все ок, мержим ее в мастер.
    На коммит в мастер стартует CI/CD, который прогоняет тесты (они ведь у вас есть, правда?) и, в случае успешной сборки, проливает код на прод.
    Ответ написан
    1 комментарий
  • Стоит ли учить Jquery в 2021?

    @Guccigang
    Нет, не стоит совсем. Лучше хорошенько подтянуть нативный JS и переходить на React/Vue.
    Ответ написан
    Комментировать