Задать вопрос
Ответы пользователя по тегу Go
  • Как организовать отправку сообщений в множество микросервисных нод?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если у тебя будет 100 нод-получателей то полюбому хотя-бы одна из них будет недоступна в момент отправки.
    Такова природа вещей. И не стоит требовать от сетей перфекционизма. Сети работают как погода. Как дождь
    или снег. Надо это учитывать.

    Поэтому брокер сообщений на базе Kafka или Apache Pulsar или Rabbit будет вполне себе реальным решением.

    Ты пишешь про p2p. Но какой ценой этот p2p ты собираешся поддержать на продюсере? Ты создашь 100 сокетов
    и 100 буферов отправки сообщений?

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    В данном задании непонятно насколько остро стоит необходимость именно в MQ системе.

    Можно начать просто с централизованного сбора логов. Мне кажется это проще
    чем строить кафку. Кроме того логгирование работает всегда, пока есть файловая
    система. А Кафка может быть недоступна какое-то количество минут или секунд в году.
    И вам надо будет думать что делать с событиями которые не ушли в Кафку. Блокировать.
    Дропать события. Или искать резервное мето куда форварднуть.
    Ответ написан
  • Как конвертировать .ogg в другой аудио-формат (.mp3, .wav) на Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вариант

    $ oggdec file_example_OOG_5MG.ogg file_example_OOG_5MG.wav
    $ lame file_example_OOG_5MG.wav


    И из Go соотвественно надо вызвать внешний процесс

    exec.Command(".....")
    Ответ написан
    Комментировать
  • Почему некоторые программисты на GO работают с бд на голом SQL без ORM?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего - специфика Go-задач.

    Дело в том что область применения ORM обычно ограничивается CRUD приложениями.
    И если мы заходим в область утилит для ETL и BigData то там оказывается что ORM вообще не нужен.
    Там работают во первых диалекты SQL, (Spark-SQL, Hive-SQL, MS U-SQL). Во вторых дизайн
    entities очень громоздкий (по 500-1000 колонок). И эти колонки еще и двигаются во времени
    следуя schema evolution на ходу. Тоесть добавляя новые колонки и расширяя типы от узких к широким.
    Представить себе ORM в таких условиях просто невозможно. Кроме того ORM кеширует объекты
    в коллекциях языка а это, сами понимаете не вопрос Bigdata и аналитики.

    Вообще ORM - это пугало, которым пугают на собеседованиях новичков. Для java-junior знание ORM - уже
    приравнивается к знанию сопромата и философии Конфуция. Знаешь ORM - получи должность
    в банке и сиди себе с умным видом на митинге.

    С моей точки зрения ORM ограничивает сильно в оптимизации запросов. Хинт уже так просто не поставить.

    Кроме ORM (Object-Relational-Mapping) есть и другая философия. Не от объектов к реляциям а наоборот.
    От базе к объектам. (Фреймворк MyBatis например). В нем причинно-следственная связь перевернута.
    Сначала таблицы и хранимые процедуры существовали в БД и уже потом, a posteriori, разработчик
    описывает для них мапппинги в обратном направлении.

    Существует также миф о том что ORM позволяет лихо прыгать по разным базам. Ни разу я для себя этот
    миф не подтвердил. Чем крупнее система - тем плотнее она сидит на лицензии от DBMS, и тем глубже
    она использует фичи этой DBMS (язык хранимых процедур особые режимы таблиц и партишенинга)
    и совершенно нет никакой надежды что миграция произойдет в один мышко-клик. Скорее наоборот.
    Миграция - это боль и слёзы и крупные платежи сектору разработки и облачным провайдерам.
    Баги и просадки перформанса в самых неожиданных местах БД.

    Хотя для вашего pet-project ORM вполне удобен особенно когда вы тестируете например веб-приложуху
    на H2 в перспективе с переходом на Postgres.
    Ответ написан
    Комментировать
  • Как улучшить качество декомпозиции в Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    неприлично долго думаю над тем что нужно вынеси в отдельный пакет, а что достаточно вынести в отдельную структуру


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

    Поэтому просто откажись от декомпозиции. Пиши сначала прототип в олимпиадном стиле. Тоесть функция
    main - и погнал писать как чукча. Что вижу то и пою.

    И после того как ты напишешь 1000 строк например к тебе придет понимание как следует декомпозировать.
    И к этому моменту у тебя будут ДОКАЗАТЕЛЬСТВА выгодности твоего дизана. И теоретические споры можно
    уже исключить.
    Ответ написан
    1 комментарий
  • Я усложняю или так правильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если ты начинающий - то лучше написать работающее приложение. А архитектура должна быть мотивированной.
    Вот в книжках по шаблонам проектирования так и пишут дескыть motivation.

    А если на пустом hello world делать архитектуру - то оно выглядит как-то странно. И принцип KISS/Yagni
    никто не отменял. И бритву Оккама.
    Ответ написан
    2 комментария
  • Библиотека для индексации документов Golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Когда-то давным давно использовали logrotate. Эта утилита просто дробила лог на дневные и часовые
    и прочие доли. Это позволяло искать быстрее. Если ты заранее знаешь что событие произошло например
    за последние сутки а не за последние 10 лет к примеру. Но logrotate может не работать под Windows.

    Коробочного решения для твоего вопроса я не знаю. Кроме Elastic ничего не приходит в голову.

    Есть еще программный продукт Splunk. Но я его никогда не использовал поэтому советовать не буду. Почитай сам.

    Вообще тебе нужен разработчик. Я думаю что дешевле всего трекать отдельные логи по событию event:login к примеру. Я так делал для сужения поиска. Для библиотек log4j это конфигурируется на уровне приложения.
    Там как-то добавляется appender + rule.
    Ответ написан
    Комментировать
  • Как под капотом реализованы интерфейсы в go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут пишут https://go.dev/tour/methods/9 весьма сухо.

    Interfaces
    An interface type is defined as a set of method signatures.
    A value of interface type can hold any value that implements those methods.


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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно в проекте заводят отдельный модуль. Версионный контроль для БД. Можно на базе
    liquibase или flyway. Можно на базе каких-то Go-технологий.

    Но суть такова. Хранимка устанавливается синхронно с обновлением версии комплекса. Как
    часть установочного pipeline. И далее из кода ты ее просто вызываешь по имени.
    Ответ написан
    Комментировать
  • Почему падает скорость при скачивание с lux?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если youtube не предоставляет никаких гарантий относительно скорости - то это нормально. Это нормальная политика троттлинга всех "качков". В противном случае инфраструктура youtube упала-бы для всех остальных клиентов которые смотрят видео с браузеров. Ведь расчет средней нагрузки на сети идет как раз из обычных пользователей а не качков.

    Названий у таких алгоритмов много. Троттлинг, шейпинг, rate limiting, leaky bucket (протекающее ведро).
    Ответ написан
    3 комментария
  • Как сравнить значения из разных моделей в Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    А попробуй замени это
    {{$projectID := .Note.ProjectID}}
    на константу
    {{$projectID := "00000011112222" }
    Ответ написан
    Комментировать
  • Как сжать файл?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для exe-шников еще в 90-е создавались не архиваторы а всякие "упаковщики". Из таковых я помню UPX https://upx.github.io/
    Ответ написан
    Комментировать
  • Как в golang заменить текст в консоли?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не знаю как в Го-шке. Но в сях есть два базовых подхода к работе с текстовой графикой.
    Первое - это печатать управляющией символы (backspace) чтоб стирать предыдущие.
    Так например работает текстовый архиватор Rar пока печатает прогресс. Все это на уровне STDOUT.

    Второе - это использовать библиотеки наподобие ncurses. Это такая Rich-графика в тексте.
    Можно делать красивые цветные текстовые таблицы наподобие TurboVision. И даже интерактивность.
    Диалоговые окна. Edit boxes e.t.c.
    Ответ написан
    Комментировать
  • Какой проект с открытым исходным кодом на go можно использовать, чтобы поучиться писать backend на go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот еще в гитхабе есть. Курьируемый список проектов. Про веб фреймворки
    https://github.com/avelino/awesome-go#web-frameworks

    Да и вообще просто поищи по ключевым словам backend/web.
    Ответ написан
  • Как запустить на фоне программу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Поскольку речь идет об .exe то скорее всего автор хочет запускать без command-shell окошка.

    Вот так.
    start /B программа.exe
    Ну и цикл там сделать внутри.
    Ответ написан
  • Как сформировать деревья в json используя golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я-бы предложил для начала уйти от этого странного способа описанию деревьев к инверсному списку
    По сути - добавить еще одну колонку которая указывает на родителя.

    id name     path  parent
    -----------------------
    1  Беларусь 1     null
    2  Россия   2     null
    3  Минск    1.3   1
    4  Москва   2.4   2
    5  СПБ      2.5   2
    6  Невский  2.5.6 5


    Ну а дальше - select... connect prior и получим ранжированый курсор по дереву. Там-же будет
    доступно виртуальное поле level. И обходом этого курсора можно сделать JSON документ.
    Если level растет - то увеличиваем indentation и открываем вложенный элемент соотв.

    Если go-lang поддерживает stremable json writers то даже лучше.
    Ответ написан
    9 комментариев
  • Как конвертировать строку в any тип protobuf в Go?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Попробуй замени any на bytes.
    map<string,bytes> property = 1;
    Ответ написан
    Комментировать
  • Как считывать из бесконечного Stdout?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Читай не по строкам а по символам.
    Ответ написан
  • Какой лучший паттерн для тестирования дао на GO?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно там где танцует Go - там рядышком docker/kubernetes. Тоесть не проблема очень быстро поднять тестовую БД, наполнить ее данными и сразу прогнать все тесты по DAO.

    Иного способа протестировать DAO я думаю не существут. Смысл DAO - доступаться к внешним источникам данных. Если его мокать - то это уже не тестирование DAO а тестирование логики следующего уровня. Бизнес-логики и прочее.
    Ответ написан
    Комментировать
  • Всегда ли нужно переиспользовать переменные?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Оба примера - одинаковы по смыслу поэтому можно брать любой.

    Но если-бы я писал это на Rust/Scala то я всегда предпочитал бы константу. Ибо идеология и доказуемость значения в константе важнее гипотетических performance fixes.

    В данном случае - я все равно не специалист в Go и поэтому исходил бы из best practices и рекомендаций от самих создателей. Что они пишут по обработке ошибок? Дают ли они примеры? Вот если они в документации шлёпнут хотя-бы один сниппет с присвоением константы - то я скажу Окей мне все ясно и пойду писать код.

    Где там идолы что пишут у себя в pet-projects - надо смотреть.
    Ответ написан
    Комментировать