Задать вопрос
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake, если не очень понятно, то может оно и не нужно пока, nokimaro правильно заметил, что всегда нужно исходить из задачи и инструментов.
    Собственно в вашем примере, DB - это Service Locator специализирующийся только на соединениях с СУБД. Service Locator - не нарушает SRP, он ничего не знает об ответственности сервисов, которыми управляет, его ответственноть только получение и возврат объекта.
    На превый взгляд может показаться, что это ненужный посредник, но именно то, что он посредник и помогает. К примеру, если взять юнит-тестирование, то в варианте со статическим вызовом конкретных классов все печально, но если сделать посредника в виде ServiceLocator и в нем прописать возможность переопределения объектов, которые возвращают методы, то можно легко подменить реальные объекты на моки. А вот с универсализацией все плохо, но примерно также как и в случае с прямыми статическими обращениями к конкретным классам.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Если уж идти по этому пути, то лучше сразу завести сервис-локатор, чтото вроде:
    class ServiceLocator
    {
        public function getDB(): DB
        {
            ...
        }
    }

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

    Второй момент, а зачем внутри класса статическое обращение? Тащить через всю вереницу классов зависимость тяжко, но не обязательно в конечном классе делать эту зависимость.
    Т.е. выносим вызов сервис-локатора, ну или там синглтона, на уровень выше. А в классе Data чистая dependency injection. В итоге, вроде все тоже самое, но когда нет статических вызовов в конечном классе, то можно на него писать юнит-тесты без проблем.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake, вместо этого
    catch(PDOException $sql_connect_e)
    {  
        echo ("Ошибка подключения к базе данных. SQL erorr: ". $sql_connect_e->getMessage() ."");
        die();
    };

    так
    catch(PDOException $sql_connect_e)
    {  
        echo ("Ошибка подключения к базе данных. SQL erorr: ". $sql_connect_e->getMessage() ."");
        throw $sql_connect_e;
    };

    Зачем здесь echo не знаю, по мне логичнее было бы в лог кидать.
    Написано
  • Подключние к базе данных из класса - насколько правильно?

    @Vitsliputsli
    Anywake,
    Есть нюанс в том, что у меня несколько баз в колхозе и пользователю мне нужно показывать кто упал и почему упал.

    Сделайте на каждое соединение отдельный класс и будет все понятно, если только у вас не динамическое или большое кол-во соединений.
    Если очень хочется чтото вписать в лог ошибки, то пишите, но завершайте catch фразой:
    throw $sql_connect_e;
    Это выведет реальную ошибку. В варианте который вы привели в вопросе, в catch все данные об ошибке уничтожены, т.е. вы не сможете узнать, что за ошибка произошла.
    Написано
  • Как объединить 2 таблицы обращаясь к одному и тому же полю 2 раза?

    @Vitsliputsli
    survivor2005, а что именно не очевидно? Просто интересно, как взгляд со стороны, т.к. по мне наоборот все очевидно.
    Написано
  • Как учиться и практиковаться?

    @Vitsliputsli
    Максим Припадчев, у него обучающие материалы - это "в интернете полно информации", что ему там попалось и что он изучал неизвестно. Отсюда у него очень хороший вопрос "что я делаю правильно, а что нет?". А беря случайный, тем более "небольшой проект на гитхабе", вполне можно продолжить закреплять неправильные подходы.
    Написано
  • Как автоматически откатить в CI/CD миграции при помощи Goose, если их было несколько?

    @Vitsliputsli
    Станислав, если в разрезе "неких универсальных сервисов" обновляемых под нагрузкой - не откатывайте миграции, тем более автоматически. Одномоментное обновление и БД, и приложения невозможно. Поэтому любая версия приложения должна работать с ближайшими версиями БД. А значит в случае отката - возвращаете предыдущую версию приложения и не трогаете БД. Да, возможность отката БД должна быть, но в ручном режиме, на всякий случай.
    Откат миграции, в отличии от отката приложения, это не возвращение предыдущей версии БД, а новое состояние, новая версия, которая лишь теоретически должна соответствовать предыдуущей версии БД. Откатываем мы тогда, когда чтото пошло не так, чтото чего мы не предусмотрели при разработке и не проверили при тестировании. Т.е. творится невесть что, а мы не разбираясь автоматом вызываем еще дополнительные DDL операции - это плохо.
    К тому же, если ваша среда в нормальном состоянии, то вы не словите ошибку при накате миграций, а словите ее тогда, когда приложение начнет активно писать в соответствии с новой версией БД. А в таком состоянии, откат БД как правило будет сопровождаться потерей данных.
    Написано
  • Как установить русский язык в php:8.2-fpm-alpine?

    @Vitsliputsli
    Михаил, локаль здесь не при чем, вам нужны компоненты юникода ICU для всех языков, а не урезанные, которые по-умолчанию
    Написано
  • Как установить русский язык в php:8.2-fpm-alpine?

    @Vitsliputsli
    А зачем? Просто интересно
    Написано
  • Какой можно поставить дистрибутив линукс на Thinkpad-e330?

    @Vitsliputsli
    Кот Абсолютный,

    Что я должен знать? Что бубунта лучше генты? Что systemd лучше чем sysv init? Или что-то еще, более сакральное?

    Вообще это был стеб и троллинг. Что ж, троллинг удался, да еще как! Заревом пылающего тухеса пожалуй дорогу можно вместо фораней освещать...

    Поздравляю вас дяденька, соврамши! Откуда такое сакральное знание? Брателло, ты уверен, что я никогда ничего не собирал? Как доказывать будешь?

    А чего ты так расходишься? Когда ты делал выводы ничего не зная обо мне, тебя ничего не смущало. А когда с тобой так обошлись, кричишь "а доказательства!". Так что, смотри на себя в первую очередь, и, научись не хамить людям.
    Троллинг? Да какой там, обычное хамство и тупые издевки, чтобы потешить свое чсв, профессионально самореализоваться чтоли не получается?
    Удачный? Тоже нет, удачный это когда жертва упорно доказывает, обычно какую-нибудь глупость, но не может осознать этого из-за психологических установок. Как-нибудь покажу.


    Пересборка мира - нелепое и утомительное занятие, есть способы и много собирать только то, что обновилось. Но тем, кто только слышал, что в генте есть "пересборка мира" этого конечно же не понять...

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

    А мир откуда изначально взялся? Ты об этом не думал?
    Отличный аргумент. Зачем чтобы комп работал для тебя, это ты должен работать на него. Ну да ладно, так и зачем автору вопроса Gentoo? Ах да, "перформанс", он же прям увеличивается в разы производительность компа, когда комп постоянно чтото собирает. Гениально.


    Ой, правда? Статья написанная незнакомым мне чуваком (писал ее не я, еслиф че - меня на "большом" хабре нет и не будет до тех пор, пока там сборище... людей с определенными убеждениями) пять лет назад, в этом помогла? Ух ты... Что ж, спасибо, рекомендовать буду :DDD

    Я и не говорю, что ты. Ты опять ничего не понял и начал расходиться.


    Это проблемы автора :) Возможно он считает, что другие считают, что линуксоид = девственник. Я бы охотно поспорил с ним и доказал обратное (но себя хвалить неудобно). Это действительно слабый пассаж, уверенный в себе человек ничего никому не доказывает :)

    А вот про это я и говорил. Зачем-то, на пустом месте, он там доказывает, ты здесь... Что у вас за общая больная тема?
    "Себя хвалить неудобно", "доказал обратное"?! Тебе что 18 лет?


    Это тоже так себе ход. Реальная оптимизация ядра займет столько времени, что борода вырастет как у гнома, обычно туда приходят с конкретной проблемой. Я наоптимизировался ядра еще на FreeBSD, где без этого просто не поедет ничего.

    Как я и писал, самый важный момент, что Gentoo здесь совсем не при чем.


    Не обязательно. Можно иметь и жену и детей и друзей и генту - на сервере :) Потому что линух на рабочей станции - он опять же для работы, не для развлечений и собственно мало чем кроме графики от сервера отличается.

    И вот к чему было все хамство выше, если потом соглашаешься? Ах, да, хамство с троллингом перепутал...
    Написано
  • Какой можно поставить дистрибутив линукс на Thinkpad-e330?

    @Vitsliputsli
    Кот Абсолютный, я сподвигся, прочитал стать по ссылке "некоторые" (https://habr.com/ru/articles/525154/). Спасибо большое, я стал лучше понимать кто ты.

    Дмитрий прочитайте статью, прям живой пример, когда Gentoo можно найти на домашней системе.

    Сперва шедевральная цитата:
    Я не чувствую себя задротистым красноглазиком. У меня есть Tinder и я встречаюсь с девочками. Им я стараюсь не рассказывать о своей любви. Система просто работает. Я чуть лучше разобрался в GNU/Linux.

    Это основной аргумент: "оно работает, я его люблю". А "я встречаюсь с девочками" меня прям умиляет, ему, кстати, было 30 годиков на момент написания. Ктото спросит ну какая разница какая у автора сексуальная жизнь? И я про тоже, какая разница? Что его сподвигло в описании работы с Gentoo доказывать кому-то, что он не девственник. Это провал, Штирлиц.
    По делу текста много, смысла мало. Перешел типа потому, что требуются прям новые-новые версии пакетов, но обновляется не чаще раз в месяц (из-за понятных проблем дистрибутива), и то с его слов. "Зачем мне Arch? Gentoo дает перформанс" - собрал свое ядро, стандартно вырезав из него лишнее, радуется что оно маленькое и быстрое (что значит маленькое неизвестно, по сравнению с Ubuntu понятное дело маленькое), ну а отключенные модули неиспользуемого оборудования на производительность не повлияют, они и так не будут загружены. Тайлинговый i3 вместо классической DE и т.д. Что мешало сделать тоже самое на другом дистрибутиве, том же упомянутом Arch - неизвестно. Скорее всего то, что автору неизвестно, что так можно.
    В общем, если у вас нет жены, детей, друзей и нечем заняться, можно установить Gentoo. А возможно и в обратном порядке.
    Написано
  • Какой можно поставить дистрибутив линукс на Thinkpad-e330?

    @Vitsliputsli
    Дмитрий, полезно, и очень интересно. Но не для автора. Его цель не в изучении дистрибутивов GNU Linux, а работать, и так, чтобы было лучше, чем в Windows. Из перечисленного только Slaсkware мог бы подойти, но явно автору нужно что-то более дружелюбное.
    И даже если бы автор был готов разобраться в каком-то дистрибутиве и тратить на это время, то все равно не Gentoo, и не LFS. Не LFS, просто потому что это не дистрибутив, тут вообще фокус смещается от понимания дистрибутива на то, как собирать дистрибутивы. Не Gentoo, потому что он не предназначен для домашнего использования в 2025. Для неизменяемых встраиваемых систем возможно, для академического интереса - да, но дома, постоянно собирать все из исходников - это бред, даже Gentoo это понимает и пытается выкручиваться, но тогда зачем он. А вера в то, что легко и непринужденно соберешь систему лучше дистрибутивной наивна. На современных машинах выигрыш от такой сборки минимален и это при учете, что ты очень хорошо понимаешь, что делаешь. Но, остаются понтовщики, с гопарскими замашками "ты просто не осилил", сами они, конечно, ничего не собирали, а только читали, иначе бы знали какой это бессмысленно длительный процесс. Спросите у гентушника сколько собирается мир и он обязательно соврет, т.к. это даже стыдно сказать. Кто не знает как это, но пользуется Arch, может помнить, как одно время в Arch qt собирался из исходников, это занимало несколько часов, и это только qt, и так каждое мелкое обновление.
    Написано
  • Какой можно поставить дистрибутив линукс на Thinkpad-e330?

    @Vitsliputsli
    Кот Абсолютный,

    Нравятся мне такие ответы... Чилавег ниасилил генту - и говорит, что он никому не нужен. Но некоторые считают, что чилавег неправ :) (я так считаю тоже, но обычно своего мнения не навязываю)

    Ну и ЕДА, конечно же :)

    "Неосилил" это потому что не согласен с твоими заявлениями? Т.е. ничего не зная ты тупо ляпнул, да еще и мнение не навязываешь? Хотя... тут каждый второй всех кругом дураками считает.
    Ну что ж, тогда потрудись объяснить, зачем автору вопроса Gentoo?
    Написано
  • Какой можно поставить дистрибутив линукс на Thinkpad-e330?

    @Vitsliputsli
    Дмитрий, а в чем польза то? обычное издевательство, автор пишет что не осилил установку Debian, а в Ubuntu проблемы, которые не может решить, а ему советуют, как схватить еще больше проблем. И, конечно, же советуют только на основе 2 слов "надежные" и "хорошие". Чем они надежнее вообще неизвестно. А хорошие... Gentoo, который практически никому не нужен, и уж точно для домашнего использования, ну разве что понтоваться. Slackware, который много лет не мог осилить контроль зависимостей и утверждал, что это фича. Ну а LFS вообще не дистрибутив.
    Написано
  • Как использовать docker secrets в bash скриптах?

    @Vitsliputsli
    Hardoman,
    Нет смысла защищать секреты внутри контейнеров, как уже было сказано, если есть доступ к контейнеру, их в любом случае раскроют

    А если установить пользователя в контейнере не root, а секрет лежит в директории root без доступа для чтения?
    Написано
  • Имеет ли смысл реализация REST API через RabbitMQ?

    @Vitsliputsli
    Borisawa, архитектура вещь сложная, любой архитектор всегда смотрит субъективно, поэтому хорошая практика обсуждение архитектуры между несколькими лицами. Мое мнение не важно, смотрите на саму информацию и на сколько она вам подходит. Ну т.е. для 1 небольшой очереди действительно может быть избыточным, но вдруг это только первый шаг и у вас там глобальные планы по расширению проекта, тогда разумеется стоит сразу закладываться на более сложное, но универсальное решение.
    Написано
  • Имеет ли смысл реализация REST API через RabbitMQ?

    @Vitsliputsli
    Borisawa,

    Vitsliputsli, в принципе, всё что вы сказали коррелирует с тем, как мы хотим организоваться. Тогда подитожу:
    1) Клиент шлёт запрос через API-шлюз, запрос попадает в FastAPI-приложение;
    2) Приложение назначает запросу id и размещает его как сообщение в заранее объявленной durable-очереди RabbitMQ и ждет по нему ответа;
    3) Сервис-обработчик прослушивает эту очередь, скачивает сообщение, работает с ним, а затем отправляет json с данными и кодом ответа;
    4) Приложение обнаруживает, что сообщение обработалось и возвращает клиенту его содержимое;
    5) Если всё завершилось ожидаемым сценарием, приложение закрывает сообщение с флагом "ack".
    Сейчас у меня такая картина шины данных с брокером. Надеюсь, у вас тоже.

    В принципе да, вы описали вариант простой очереди, т.е. у вас очередь заданий, и воркер(ы) которые эту очередь разбирают. Для такого варианта я скорее всего не стал бы подключать брокер (если его в архитектуре не было), а реализовал бы очередь в БД (по уже названным причинам, лишняя точка отказа и т.д.).
    Но, если в п.3 сервис-обработчик не один (не в смысле 1 масштабирован в несколько, а в смысле обработчики осуществляющие разную бизнес-работу), т.е. обработчик сделал свое и отправил следующему, следующий дальше и т.д. Т.е. когда не 1 очередь, а пересылка между разными сервисами, тогда нужен брокер.
    Написано
  • Имеет ли смысл реализация REST API через RabbitMQ?

    @Vitsliputsli
    Borisawa,
    сейчас почти все сервисы работают как прямые интеграции, т.е. креды прописаны в каждом сервисе и запись напрямую в боевые БД.

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

    Правильно ли я вас понимаю - задача в том, чтобы назначить условный id (например либой uuid) сообщению (которое является post / get запросом клиента), а после этого "скачать" результат исполнения этой очереди и отдать его клиенту? В таком случае http-соединение не порвётся, так? Чувствуется, что время ожидания вырастет, но врядли это критично, если данные станут реально персистентны.

    Да, типа того. Прям подробно не скажу, нет сейчас под рукой такой системы, но логично что процесс, который принял запрос, размещая его в брокере указывает себя как отправителя. И когда сообщение будет обработано всеми необходимыми сервисами, конечное сообщение будет в адресате иметь этот адрес отправителя (да, какойто условный id).
    Т.е. пока идет обработка, процесс работающий с http висит на связи с брокером и ждет предназначенное ему сообщение. Нет никаких причин соединению отваливаться, разве что по таймауту, но это вопрос скорости работы сервисов.
    Время ожидания вырастет, но вряд ли критично, можете сами прикинуть, на основе кол-ва пересылок (т.е. кол-ва сервисов) и сетевого лага между ними. Если они в одном ДЦ, то это немного. Затраты накладные на брокер тоже будут небольшие. Другое дело, что брокер будет обрабатывать весь трафик, и там должна быть достаточная машина. Это может быть проблемой, если трафик очень большой.
    И еще, обратите внимание на момент, как будете управлять сообщениями, т.е. хореография или оркестрация. Этот выбор потом поменять очень сложно, поэтому выбирать нужно ответственно.
    Написано
  • Имеет ли смысл реализация REST API через RabbitMQ?

    @Vitsliputsli
    сергей кузьмин,
    Vitsliputsli, Это будет точкой отказа для всех сервисов
    it is common practice for an API Gateway to be load balanced, although the API Gateway itself can sometimes provide some basic load balancing capabilities for backend services.

    Можно подробнее. А то непонятно причем здесь балансировка API Gateway.
    Написано
  • Имеет ли смысл реализация REST API через RabbitMQ?

    @Vitsliputsli
    1) Это будет точкой отказа для всех сервисов;
    2) Нельзя реализовать ответ для http-запроса, ведь брокер разделяет процесс и не предназначен для синхронных запросов (так мне кажется).

    1) разумеется, но другие плюсы могут перевешивать этот минус.
    2) почему нет? типичная схема: клиент отправляет запрос по http и ждет, сервер валидирует запрос и кидает сообщение в брокер, оно там многократно крутится по разным сервисам, затем формируется сообщение для сервера работающего с http, он его забирает и формирует ответ по http.

    Мой вопрос: следует ли реализовывать передачу данных по REST API через RabbitMQ в данном случае?

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