Митя Камаев@mitya_k
SuperPuper Backend Developer
Информация
- В рейтинге
- 1 200-й
- Откуда
- Москва, Москва и Московская обл., Россия
- Зарегистрирован
- Активность
Специализация
Бэкенд разработчик
Ведущий
От 500 000 ₽
Node.js
TypeScript
MySQL
PostgreSQL
Docker
RabbitMQ
Linux
Высоконагруженные системы
Проектирование архитектуры приложений
Apache Kafka
Полезная статья, cпасибо за нее
Не понятно, как локальный тип может влиять на функцию
area? При импортеShapeTS скажет, что конфликт с оригинальным: `Import declaration conflicts with local declaration of 'Shape'`. Мердж типов работает только дляinterface, что бывает полезно при разработке либ.Можно использовать следующий eslint plugin https://typescript-eslint.io/rules/switch-exhaustiveness-check/ для того чтобы не держать это в голове
Пункт 7
Можно добавить
defaultдля того чтобы компилятор сказал, что есть необработанныйcase:Хорошая идея с vpn per browser tab.
Согласен задетектить наличие КВН они так могут, но получить IP тут будет непросто ресурс должен быть у пользователя прописан в правилах + уязвимость сервиса.
Но можно как вариант можно использовать трехзвенную структуру VPN дабы меньше париться над деаноном выходного IP:
client => vps (ru/заграница) => vps(заграница)Пользуюсь Obsidian Git в связке с приватным репозиторием для того чтобы синхронизировать заметки на Ubuntu и MacOS
Полезная статья, спасибо. В примерах кода есть ошибки (дублирование кода, где пример теста
"broadcasts messages from one client to all others")Согласен с автором. GraphQL актуален для задач, когда есть очень «толстое» api с сотнями полей в запросе, и клиенту нужна небольшая их часть. Но это редкий кейс, как правило больших компаний, аля Facebook.
В остальных случаях не очень понятно, какие есть от него плюсы, когда есть кодогенерация REST клиента с типами на основе OpenAPI схемы, которая тоже генерится на основе сервера, а так же есть OpenAPI Editor для ручных запросов.
Я как правило для этого использую API Prometheus/API Portainer или что-то аналогичное для получения статуса контейнеров
100 из 100. Во многом из-за переусложнения как с технической части, так и с бизнесовой, проекты превращаются в макаранного монстра, где "идеальная архитектура" и за неделю не дает простую фичу добавить, а кол-во непонятно кем используемого функционала продукта тормозит дальнейшее развитие...
Да, пробовал ts-sql-query. Его несомненный плюс это поддержка больше кол-во типов БД, но как вы отметили kysely с типизацией через строки лаконичнее и прям очень похож на sql. А ts-sql-query при использовании выглядел очень многословно, как в плане запросов, так и в плане создании типов. Плюс когда запрос содержит кучу подобных методов
notEqualsIfValue, greaterOrEqualsIfValue тяжело читать, но это уже дело вкуса.Это и правда верно. Но вот проблему c тем, что везде, где подключается папка придется дописать
/index, судя по всему не решается. И сts-nodeиtsxкак-то это все-равно не дружит из коробки.Список отличий commonjs vs esm module для Node js. Любой код из npm или свой, который что-то из этого использует придется переписывать или искать альтернативу. Да, и плашка о esm у jest, пока не вдохновляет + плюс тесты придется переписывать
TypeScript не может использовать директиву
imports в package.jsonc настройкой"module": "commonjs". Получается итоговая сборка должна запускаться в Nodejs использующей esm модули, это далеко не всегда приемлемо. В результате, если хочешь использовать в итоговой сборке commonjs, то надо использовать сборщик, который сделает трансляцию... Это как-то слишком жирно для бэкенд кода.А с path aliases делаешь просто замену регуляркой в коде
/[\.\.\/]+model\/User=>@model/UserИ как бы все
Тут не совсем все просто. Нативные alias работают только с ESM модулями
Например:
Несмотря на то, что алиасы работают как для ES‑модулей, так и для CommonJS модулей, Node.js использует правила поиска модулей, которые применяются для ES‑модулей. Проще говоря, появляются два новых требования:
При импорте необходимо указывать полный путь до файла, включая расширение файла.
При импорте нельзя указывать путь до директории, ожидая импорта файла
index.js. Вместо этого необходимо указывать полный путь до файлаindex.js.Для легаси проектов получается этот способ не заведется без рефакторинга....
Спасибо, было полезно освежить некоторые моменты в голове.
Что же будет при массовом возгорании таких автомобилей на стоянке или в массовом ДТП....
В большинстве случаев лучше спрятать его от внешнего мира, по тем же причинам, что и БД прячут.
Если все-таки надо RabbitMQ сделать доступным снаружи, то необходимо коннектиться через ssl ради безопасности, но это добавит приседаний с сертификатами и их обновлением, а также снизит скорость передачи данных
Если есть еще ноды с ролью
managerи кворум может быть разрешен, то новая нода станет ведущей. Swarm использует алгоритм Raft поэтому следует использовать нечетное кол-воmanagerнод чтобы кворум работал. Да, контейнеры работать останутся, но добавлять и обновлять сервисы в кластере будет нельзя. Да, контейнеры сmanagerнод так же мигрируют, как и с обычных нод.Ну, в swarm есть встроенный балансировщик, который прослушивает порты (указанные в сompose файле) на все нодах и пробрасывает трафик, либо в контейнер, который есть на этой ноде, либо на другую доступную в кластере.
Я всегда об этом подозревал, ибо мою жену они жрут постоянно, а меня чуть ли не игнорят)
Данная команда, запускает контейнер с агентом portainer на всех нодах в кластере:
При появлении новой ноды в кластере, manager нода автоматически запустит агента portainer на новой ноде. И весь функционал portainer будет доступен для контейнеров на этой ноде. Если логику запуска portainer надо поменять, то правим файл portainer-agent-stack.yml.
Нет, порт 9443 нужен только для веб морды portainer.