METANIT.COM – Telegram
METANIT.COM
5.79K subscribers
1.64K photos
79 videos
9 files
986 links
Канал о программировании и разработке сайта metanit.com
Download Telegram
Лестница проектирования систем
(продолжение предыдущего поста)

Проектирование систем — это не единая глобальная концепция. Это лестница.
Большинство инженеров пытаются сразу перейти к «распределённым системам», а потом удивляются, почему всё рушится под нагрузкой.
Масштабирование нельзя просто скопировать и вставить. Его нужно развивать — шаг за шагом.

### ОСНОВЫ

Вы не можете масштабировать то, чего не понимаете.

Цель этого уровня — понять базовые строительные блоки того, как данные поступают в систему и выходят из нее.

Ступеньки этого уровня:

API и коммуникация

Знайте REST, gRPC и GraphQL; не только синтаксис, но и когда каждый из них подходит.

Балансировка нагрузки и обратные прокси

Распределение запросов, поддержание согласованности сессий и предотвращение единых точек отказа.

Кэширование

Мастерство в том, что кэшировать, когда аннулировать и как политики TTL и вытеснения влияют на производительность.

Базы данных и хранилище

Изучение компромиссов между реляционными и нереляционными системами, индексирования, нормализации (до BCNF) и транзакций.

Сетевые технологии и HTTP

Понимание того, как данные перемещаются: запросы, ответы, задержки и пропускная способность.



### МЕХАНИКА

Теперь вы создаете системы, а не просто сервисы.

Цель этого уровня — создать системы, которые выдерживают реальные условия: задержки, сбои и параллелизм.

Основные моменты этого уровня:

Безопасность и аутентификация

Охватываем основы: TLS, JWTs, OAuth2, ограничение скорости и дизайн с минимальными привилегиями.

Доступность и надежность

Понимание SLA, SLI и SLO; и проектирование для плавного снижения производительности, а не слепого времени безотказной работы.

Наблюдаемость

Реализация логирования, трассировки (OpenTelemetry, Sentry) и метрик для анализа, а не шума.

Согласованность данных и транзакции

Применение шаблонов распределенных транзакций (SAGA, 2PC, Outbox, CDC).

Асинхронное взаимодействие

Использование очередей сообщений и шинков событий для децентрализации систем (Kafka, RabbitMQ, MQTT и т.д.).

Шаблоны масштабирования

Изучение вертикального и горизонтального масштабирования, чтения и записи, а также стратегий партиционирования.


### ПРОДВИНУТЫЙ УРОВЕНЬ

Теперь вы не спрашиваете «как это построить», а «как это ведет себя под нагрузкой».

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

Основные моменты этого уровня:

Инженерия устойчивости

Предохранители, повторные попытки с отступами, тестирование на хаос и разделение систем.

Оптимизация производительности

Настройка узких мест на всех уровнях: БД, кэш, сеть, сериализация и ввод-вывод.

Эволюция системы

Проектирование для изменений: сине-зеленые развертывания, флаги функций и плавные миграции.

Моделирование данных в масштабе

Полиглот-персистентность, материализованные представления, эволюция схемы и аналитические конвейеры.

Архитектуры, управляемые событиями

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

Теория распределенных систем

CAP, PACELC, идемпотентность, конечная согласованность; и когда каждый компромисс приемлем.
👍144❤‍🔥2🔥2👎1
Как математики видят различные вещи
😁35👍11🤓63👎2🤡1
"Роскомнадзор принимает меры по частичному ограничению работы иностранных мессенджеров WhatsApp и Telegram "для противодействия преступникам", сообщила надзорная служба.

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

«Неоднократно направлявшиеся требования о принятии мер противодействия владельцами мессенджеров проигнорированы. Для противодействия преступникам в соответствии с материалами правоохранительных органов принимаются меры по частичному ограничению работы иностранных мессенджеров», — говорится в сообщении.

21 октября жители юга России снова пожаловались на сбои в работе мессенджера Telegram, а также на работу WhatsApp.
https://www.rbc.ru/politics/22/10/2025/68f8b08c9a7947cd6de9b5da
🤡43👎17😁6🤬6👍3💩2🐳1🍾1
Следующее поколение разработчиков
😭65😁41🎃7🤡4💩3🥴1
Быстрый совет по Linux:

Если вам нужно создать несколько директорий сразу, не обязательно делать это поочерёдно.

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

mkdir -p ~/noscripts/{site-01,site-02}/{backup,monitoring,network}


Эта команда моментально создаёт папки для двух сайтов, причём у каждого — свои поддиректории: backup, monitoring и network.

Отличный способ сэкономить время и поддерживать упорядоченную структуру директорий.

#linux
🔥36👍73😨2🤯1
Пул подключений в backend‑разработке
(продолжение в следующем посте)
Пул подключений в backend‑разработке
(продолжение предыдущего поста)

Введение

→ Пул подключений — это техника повторного использования подключений с базой данных вместо создания нового соединения для каждого запроса клиента.
→ Это повышает производительность, снижает задержки и оптимизирует использование ресурсов в backend‑системах.
→ Широко применяется в приложениях, обрабатывающих множество параллельных запросов к базе данных.

Как работает пул подключений

→ При запуске приложения создаётся пул (набор) соединений с базой данных.
→ Каждый входящий запрос берёт соединение из пула, выполняет запрос и возвращает соединение после завершения.
→ Свободные соединения повторно используются для будущих запросов, что позволяет избежать затрат на открытие и закрытие новых подключений.

Почему пул подключений необходим

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

Преимущества пула подключений

Повышение производительности → Сокращает время, затрачиваемое на установление новых подключений.
Оптимизация ресурсов → Ограничивает количество активных подключений.
Масштабируемость → Эффективно обрабатывает множество параллельных запросов.
Надёжность → Предотвращает перегрузку базы данных и исчерпание подключений.

Ключевые параметры пула подключений

Максимальное количество подключений → Определяет, сколько подключений может одновременно содержать пул.
Время ожидания для свободных подключений → Время, по истечении которого свободные соединения закрываются.
Срок жизни соединения → Максимальный срок существования соединения до его повторного создания.
Политика повторных попыток → Определяет, как обрабатываются неудачные соединения (повторные попытки или замена).

Распространённые инструменты и библиотеки

Node.jspg-pool для PostgreSQL, mysql2 pool для MySQL.
Java → HikariCP и Apache DBCP для управления соединениями JDBC.
Python → Пул подключений в SQLAlchemy и поддержка пула в psycopg2.
.NET → Встроенное пул подключений в ADO.NET.

Рекомендации

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

Аналогия

→ Представьте ресторан с ограниченным количеством столиков (подключений).
→ Посетители (запросы) обслуживаются, когда освобождается столик, а после ухода гостей столик повторно используется.
→ Без пулирования каждому посетителю требовалось бы каждый раз готовить новый столик — это неэффективно и медленно.
👍10👏32
Наглядно умножение матриц в нейронных сетях
Согласно внутренней утечке, Amazon Web Services уволила до 40% DevOps-инженеров, заменив их экспериментальной AI-системой автоматического управления инфраструктурой с целью снизить расходы и ускорить обслуживание облака. Новая AI-система вроде как способна автоматически исправлять ошибки IAM, восстанавливать виртуальные сети, перезапускать инстансы и даже откатывать неудачные деплои Lambda без участия человека.

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

Amazon официально не комментирует ситуацию. Но по cлухам, внутри компании идёт обсуждение — стоит ли давать ИИ слишком много контроля над критической инфраструктурой.
https://80.lv/articles/amazon-allegedly-replaced-40-of-aws-devops-workers-with-ai-days-before-crash
😁34🤡19🤮6🤪5❤‍🔥21
Компания JetBrains на днях выпустила отчёт о состоянии экосистемы разработчиков в 2025 году. В нем приняли участие 24 534 разработчика из 194 стран

Некоторые выводы

Наиболее используемый язык - Python

TypeScript демонстрирует самый впечатляющий рост в реальном использовании за последние пять лет. Rust, Go и Kotlin тоже постепенно укрепляют свои позиции, хотя их успехи не столь заметны, как у TypeScript.
А PHP, Ruby и Objective-C продолжают уверенно терять популярность.

Индекс Language Promise от JetBrains оценивает языки по трём критериям: рост, стабильность и готовность разработчиков их осваивать. Согласно этому индексу, в 2025 году наибольший потенциал роста демонстрируют TypeScript, Rust и Go, тогда как JavaScript, PHP и SQL, судя по всему, достигли стадии зрелости.

Список самых высокооплачиваемых разработчиков возглавлавила Scala — 38%, хотя этот язык является основным всего у 2% специалистов. Похоже, сказывается узкая специализация

https://devecosystem-2025.jetbrains.com/
🤝127🖕5💩2
В руководство по языку Java добавлены новые статьи:

Переменные volatile в многопоточных приложениях
https://metanit.com/java/tutorial/8.16.php

Атомарность и Atomics. Потокобезопасность без блокировок в многопоточных приложениях
https://metanit.com/java/tutorial/8.17.php

#java
👍22👾3
Рабочий процесс Docker
(подробное описание в следующем посте)
4💩43🐳2
Рабочий процесс Docker
(описание предыдущего поста)

#### Шаг 1: Написание кода приложения

Начните с создания вашего приложения с использованием предпочитаемого языка программирования (например, Node.js, Python или Java).
Убедитесь, что все зависимости проекта чётко определены в конфигурационных файлах, таких как package.json или requirements.txt.

#### Шаг 2: Создание Dockerfile

Dockerfile — это шаблон, определяющий, как будет собираться ваш образ.

Пример:

# Использование базового образа
FROM node:20

# Установка рабочего каталога
WORKDIR /app

# Копирование файлов проекта
COPY . .

# Установка зависимостей
RUN npm install

# Открытие порта приложения
EXPOSE 3000

# Команда для запуска приложения
CMD ["npm", "start"]


Этот файл гарантирует, что ваше приложение будет работать стабильно в любой среде.

#### Шаг 3: Сборка Docker-образа

Выполните команду для сборки вашего образа:

docker build -t myapp:latest .


Флаг -t присваивает вашему образу имя и версию. Docker считывает инструкции из Dockerfile и создаёт повторно используемый образ.

#### Шаг 4: Запуск Docker-контейнера

Используйте образ для запуска контейнера:

docker run -d -p 3000:3000 myapp:latest


Флаг -d запускает контейнер в фоновом режиме.
Флаг -p сопоставляет порт контейнера с портом вашего локального компьютера. Приложение теперь доступно локально по адресу localhost:3000.

#### Шаг 5: Управление контейнерами

- Список запущенных контейнеров:

  docker ps


- Остановка контейнера:

  docker stop <id_контейнера>


- Удаление контейнера:

  docker rm <id_контейнера>


- Удаление образа:

  docker rmi myapp:latest


#### Шаг 6: Использование Docker Compose (опционально)

Для приложений с несколькими контейнерами (например, приложение + база данных) используйте файл docker-compose.yml.

Пример:

version: '3'
services:
app:
build: .
ports:
- "3000:3000"
db:
image: mongo
ports:
- "27017:27017"


Запуск всех сервисов:

docker-compose up -d


#### Шаг 7: Публикация образов в Docker Hub

- Вход в Docker Hub:

  docker login


- Присваивание тега вашему образу:

  docker tag myapp username/myapp:v1


- Публикация в Docker Hub:

  docker push username/myapp:v1


Это позволяет другим пользователям (или вашему CI/CD конвейеру) загружать и развёртывать ваш образ.

#### Шаг 8: Развёртывание в продакшене

Используйте платформы вроде AWS ECS, Kubernetes или Docker Swarm для развёртывания в масштабе. Эти платформы загружают ваши образы и автоматически управляют оркестровкой контейнеров, сетью и масштабированием.
9👍4🐳2😁1💩1
Студентам самого известного колледжа Екатеринбурга пригрозили отчислением. За отказ установить MAX

В Екатеринбурге студентам колледжа имени Ползунова угрожали отчислениями — под раздачу попали те, кто отказался устанавливать мессенджер MAX.

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

Заведующая одного из отделений колледжа собрала все заявления и дала обучающимся время до понедельника. Для наглядности текст заявления даже написали на доске в аудитории.
https://www.e1.ru/text/education/2025/10/23/76088087/
🤡34🤬12🤯6👍1💊1
Как LLM воспринимают мир
(описание в следующем посте)
Как LLM воспринимают мир
(описание к предыдущему посту)

Когда вы вводите фразу "Hello world" в ChatGPT или Claude, модель не обрабатывает эти буквы и пробелы так, как вы читаете этот пост прямо сейчас. Вместо этого она преобразует всё в числа посредством процесса, о котором большинство людей даже не задумывается.

Сначала происходит предварительная обработка. Текст нормализуется: символы Unicode, особенности пробелов и специальные символы очищаются и стандартизируются. Фраза "Hello world" превращается в формат, с которым модель может работать.

Затем наступает очередь токенизации. Здесь начинается самое интересное. Модель разбивает текст на токены, и существует несколько подходов к этому:

1. Посимвольная токенизация разбивает текст на отдельные символы. Фраза "Hello world" становится ["H", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]. Этот метод прост, но неэффективен.

2. Пословная токенизация разбивает текст на целые слова. ["Hello", "world"]. Такой подход выглядит более чистым, но сталкивается с трудностями при обработке редких слов и создаёт огромные словари.

3. Подсловная токенизация — это то, что фактически используют современные LLM. GPT, Gemini, Claude — все они полагаются на этот метод. Фраза "Hello world" преобразуется примерно так: ["Hell", "o", "world"]. Этот метод обеспечивает баланс между эффективностью и гибкостью, обрабатывая редкие слова путём разбиения их на известные подсловные части.

Последний шаг — это присвоение идентификаторов токенов. Эти подсловные части сопоставляются с числами, например, [15496, 345, 995]. Каждый идентификатор токена соответствует вектору встраивания внутри модели. Именно эти векторы обрабатывает нейронная сеть.
👍5🔥3🖕2👎1