Все публикации

Все материалы сайта в обратном хронологическом порядке

Надёжность распределённых систем: карта

Архитектура

Надёжность распределённых систем: карта

Навигатор по надёжности распределённых систем: консенсус, согласованность, атомарность и транзакции, гарантии доставки сообщений и устойчивость под нагрузкой — как это связано и в каком порядке разбираться

Когда нужен OLAP: ClickHouse против PostgreSQL для аналитики
📦

Базы данных

Когда нужен OLAP: ClickHouse против PostgreSQL для аналитики

Чем OLAP-нагрузка отличается от OLTP, как колоночное хранение и векторное исполнение делают ClickHouse быстрым на аналитике, в какой момент PostgreSQL перестаёт тянуть агрегаты по большим таблицам — и где ClickHouse категорически не подходит

Паттерны и антипаттерны индексирования
📦

Базы данных

Паттерны и антипаттерны индексирования

Что делать и чего избегать с индексами: over-indexing и write-amplification, неиспользуемые и дублирующие индексы, bloat и обслуживание, covering под горячие запросы, online-создание без блокировок, индексы под пагинацию — и антипаттерн «индекс на всё»

Мульти-хранилищный стенд: один сценарий по всем БД и карта выбора
📦

Базы данных

Мульти-хранилищный стенд: один сценарий по всем БД и карта выбора

Финал серии: единый сценарий (списание с инвариантом «баланс не в минус») реализован поверх PostgreSQL, Redis, MongoDB и ScyllaDB и прогнан одним нагрузчиком. Что каждая система гарантирует из коробки, что ломается под конкуренцией, цена корректности — и итоговая карта выбора

Брокеры и стриминг: транзакции в очереди и логе — RabbitMQ и Kafka
📦

Базы данных

Брокеры и стриминг: транзакции в очереди и логе — RabbitMQ и Kafka

Что значит «транзакция» в брокере: AMQP-транзакции RabbitMQ против publisher confirms, транзакционный producer и exactly-once в Kafka, consume-process-produce и read_committed, границы EOS и outbox-паттерн как мост к БД. Примеры на Go и Java

Как выбирать и использовать индексы
📦

Базы данных

Как выбирать и использовать индексы

Практика индексов: селективность и кардинальность, покрывающие индексы и index-only scan, составные индексы и порядок колонок, частичные и функциональные, и главное — почему индекс НЕ используется и как это увидеть

Вероятностные структуры: Bloom-фильтры и компания — когда эффективны, когда нет
📦

Performance

Вероятностные структуры: Bloom-фильтры и компания — когда эффективны, когда нет

Bloom-фильтры, Cuckoo, HyperLogLog, Count-Min Sketch и родственники: как они экономят память и время ценой приблизительности, где реально эффективны (LSM-БД, кэш/CDN, дедупликация, аналитика уникальных), а где только вредят — с прикидкой параметров и примерами на Go и Java

KV и документные: «транзакций» почти нет — Redis, MongoDB, ScyllaDB
📦

Базы данных

KV и документные: «транзакций» почти нет — Redis, MongoDB, ScyllaDB

Что означает «транзакция» там, где нет классического ACID-движка: Redis MULTI/EXEC без rollback и WATCH-CAS, multi-document транзакции MongoDB поверх snapshot, LWT на Paxos в ScyllaDB и почему BATCH — это не транзакция. Примеры на Go и Java

Транзакции в реляционных БД на практике: PostgreSQL, изоляция и нагрузочный стенд
📦

Базы данных

Транзакции в реляционных БД на практике: PostgreSQL, изоляция и нагрузочный стенд

PostgreSQL как эталон управляемой изоляции: уровни в деле, SELECT FOR UPDATE, SERIALIZABLE с retry на 40001, advisory locks. Примеры на Go (pgx) и Java (JDBC) плюс нагрузочный стенд, воспроизводящий lost update и write skew под конкуренцией

Индексы в БД: зачем нужны, какие бывают и как устроены
📦

Базы данных

Индексы в БД: зачем нужны, какие бывают и как устроены

Фундамент про индексы: зачем они (ускорение поиска ценой записи и места), какие бывают — B-tree, hash, bitmap, инвертированный (GiN), GiST, BRIN, R-tree, LSM — и как каждая структура устроена, что ускоряет и чем платит

Сканирование уязвимых зависимостей (SCA): Dependabot, osv-scanner, govulncheck
📦

Безопасность

Сканирование уязвимых зависимостей (SCA): Dependabot, osv-scanner, govulncheck

SCA на практике: почему Dependabot показывал 0, а osv-scanner нашёл полсотни; чем различаются базы advisory (GitHub Advisory, OSV, Go vuln DB, RustSec) и методы (presence-based против call-graph govulncheck); плейбук починки транзитивных CVE по экосистемам (Go, Maven, Python, Rust) и честная работа с no-fix и ложными срабатываниями

Go modules: go.mod, версионирование и управление зависимостями

Go

Go modules: go.mod, версионирование и управление зависимостями

go.mod, go.sum, семантический импорт версий, minimal version selection, replace/exclude, vendoring и workspaces (go.work). Как Go решает, какие версии зависимостей брать, почему MVS отличается от других менеджеров пакетов, и как этим управлять на практике

Бэкапы ценного: фото, эскизы, проекты и готовность к потере

Инфраструктура

Бэкапы ценного: фото, эскизы, проекты и готовность к потере

Как защитить необратимые данные — фото, свои эскизы и проекты: правило 3-2-1, проверка дисков и тест восстановления простыми словами, готовые бытовые сценарии без командной строки и облака (зашифрованный диск у близких) и что делать, если облако кажется дорогим

slog: структурированное логирование в стандартной библиотеке Go
📦

Go

slog: структурированное логирование в стандартной библиотеке Go

log/slog (Go 1.21) — структурированное логирование в стандартной библиотеке: уровни, атрибуты, группы, JSON и text-хендлеры, With для контекста и связка с context. Как устроены Handler/Record, как писать свой хендлер и почему slog вытесняет самописные обёртки над log — на живых примерах вывода

Полнотекстовый поиск в OpenSearch: запросы, анализаторы и подсветка результатов
📦

Базы данных

Полнотекстовый поиск в OpenSearch: запросы, анализаторы и подсветка результатов

Как устроен полнотекстовый поиск в OpenSearch: типы запросов, анализаторы для русского и английского языков, подсветка результатов, оптимизация релевантности и сравнение с полнотекстовым поиском в PostgreSQL и MongoDB

Гарантии доставки и идемпотентность: как получить effectively-once
📦

Архитектура

Гарантии доставки и идемпотентность: как получить effectively-once

Вся событийная архитектура держится на одной связке, которую редко проговаривают вслух: at-least-once доставка + идемпотентный консьюмер = effectively-once. Разбираем, почему сквозной exactly-once недостижим в принципе, чем at-least-once отличается от at-most-once, как сделать консьюмер идемпотентным (ключи идемпотентности, dedup-хранилище, естественная идемпотентность, окно дедупа) и где эта связка уже работает в серии — в outbox, saga и проекциях

Досрочное погашение и архитектурные решения: почему ранняя коррекция курса обходится дешевле

Архитектура

Досрочное погашение и архитектурные решения: почему ранняя коррекция курса обходится дешевле

Аннуитетный кредит как модель технического долга. Интерактивный калькулятор, реальные ставки ЦБ РФ и архитектурная аналогия: чем раньше вы меняете курс – тем дешевле это стоит

Что кладём в событие: notification vs event-carried state transfer
📦

Архитектура

Что кладём в событие: notification vs event-carried state transfer

Самое базовое решение событийной архитектуры — что положить в событие: тонкое уведомление (просто «заказ изменился», ID) или толстое событие с полным состоянием. Первое слабо связывает, но провоцирует «GET-storm» обратно на источник; второе автономно, но раздувает payload, устаревает и тащит связанность по данным. Разбираем два паттерна из таксономии Фаулера, их компромиссы (связанность ↔ автономность ↔ staleness), версионирование нагрузки, приватность в событии и когда что выбирать

Хореография vs оркестрация: кто знает бизнес-процесс
📦

Архитектура

Хореография vs оркестрация: кто знает бизнес-процесс

Многошаговый процесс между сервисами координируют двумя способами: хореография — сервисы реагируют на события, единого дирижёра нет, поток эмерджентный; оркестрация — центральный координатор явно ведёт шаги и обрабатывает отказы. Разница не в технологии, а в том, ГДЕ живёт знание о процессе: размазано по сервисам или собрано в одном месте. Разбираем компромиссы, антипаттерны (event-спагетти vs god-оркестратор), когда что и почему реальные системы почти всегда гибрид

sqlc и SQL-builders в Go: генерация кода из SQL vs конструирование запросов

Go

sqlc и SQL-builders в Go: генерация кода из SQL vs конструирование запросов

Два подхода к работе с SQL в Go без ORM на одном домене: sqlc генерирует типизированный код из SQL, а SQL-builders (squirrel, goqu) конструируют запросы программно. Где каждый силён, где кусается и как их комбинировать

Streams в RabbitMQ: Kafka-подобный лог и можно ли заменить Kafka
📦

Сообщения

Streams в RabbitMQ: Kafka-подобный лог и можно ли заменить Kafka

Что такое streams в RabbitMQ — append-only лог с offset-чтением и репликацией, как их объявлять и читать (native stream-протокол и AMQP), super streams для партиционирования, честное сравнение с Kafka и разбор, где RabbitMQ Streams реально заменяет Kafka, а где нет

HTTP/2 Bomb: как склейка двух старых приёмов кладёт веб-сервер

Безопасность

HTTP/2 Bomb: как склейка двух старых приёмов кладёт веб-сервер

Разбор атаки HTTP/2 Bomb: HPACK-бомба и удержание через нулевое flow-control окно по отдельности известны десять лет, но вместе кладут nginx, Apache, IIS, Envoy и Pingora за секунды. Как устроен механизм на уровне фреймов, кто уязвим и что пропатчено, почему Angie (и khorost.tech) не тронут, как проверить свой сервер — и почему эту склейку первым увидел ИИ

Terraform для Docker-хостов и сетей: где проходит граница пользы
📦

Инфраструктура

Terraform для Docker-хостов и сетей: где проходит граница пользы

Где Terraform реально помогает в Docker-инфраструктуре — хост, firewall, генерация Ansible inventory, — а где только добавляет слой абстракции: lifecycle контейнеров и docker-сети. С рабочим примером стыка Terraform → Ansible из digital-cookbook

Ansible и Docker Compose: раскатываем сервисы без ручной магии
📦

Инфраструктура

Ansible и Docker Compose: раскатываем сервисы без ручной магии

Как использовать Ansible для управления Docker Compose стеками: inventory, group_vars для нескольких окружений, шаблоны compose и .env, секреты через ansible-vault и модуль community.docker.docker_compose_v2 — с рабочим примером из digital-cookbook

Proxmox + Terraform: автоматизируем создание VM и контейнеров в домашней лаборатории
📦

Инфраструктура

Proxmox + Terraform: автоматизируем создание VM и контейнеров в домашней лаборатории

Как использовать Terraform для автоматического создания и управления виртуальными машинами и LXC-контейнерами в Proxmox VE: провайдер bpg/proxmox, cloud-init шаблоны, примеры VM и CT, типичные ошибки

Распределённые конфигурации: etcd, Consul, Vault и когда они действительно нужны
📦

Архитектура

Распределённые конфигурации: etcd, Consul, Vault и когда они действительно нужны

Когда конфигурация через env и файлы перестаёт работать, какие задачи решают etcd, Consul и Vault, чем они отличаются и как не усложнить систему раньше времени

Сквозной итоговый кейс: собираем рабочую систему лунной базы

Архитектура

Сквозной итоговый кейс: собираем рабочую систему лунной базы

Финальная статья архитектурно-аналитической серии: один сценарий лунной базы, пройденный целиком — от problem statement и требований через доменную модель, C4, взаимодействия и согласованность до эксплуатации, чтобы увидеть, как все решения складываются в одну систему

Эксплуатация в архитектуре: как инженеры возвращают схему в реальность

Архитектура

Эксплуатация в архитектуре: как инженеры возвращают схему в реальность

Статья архитектурно-аналитической серии на примере лунной базы: почему эксплуатация — не этап после архитектуры, а её часть, и как наблюдаемость, деградация и восстановление должны проектироваться вместе с системой

Согласованность данных: где нужна строгая, а где достаточно «в итоге»

Архитектура

Согласованность данных: где нужна строгая, а где достаточно «в итоге»

Статья архитектурно-аналитической серии на примере лунной базы: как выбирать уровень согласованности данных под реальные сценарии — строгая, eventual или пакетная — и почему «согласованность везде» ломает систему так же, как её отсутствие

Взаимодействия и интеграции: где ломается кажущаяся простота

Архитектура

Взаимодействия и интеграции: где ломается кажущаяся простота

Статья архитектурно-аналитической серии на примере лунной базы: как аналитика и архитектура по-разному смотрят на синхронные и асинхронные взаимодействия, REST, события, команды и очереди — и где простая на схеме интеграция оказывается дорогой

C4-модель для аналитика: не рисовать красиво, а думать точно

Архитектура

C4-модель для аналитика: не рисовать красиво, а думать точно

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

Как доменная модель ломает и спасает архитектуру

Архитектура

Как доменная модель ломает и спасает архитектуру

Статья архитектурно-аналитической серии на примере лунной базы: как ошибка в доменной модели превращается в ошибку архитектуры, а хорошая модель помогает точнее разделять контексты, взаимодействия и ответственность

Паттерны снижения трения при работе с AI-ассистентами: разбор статьи Rahul Garg

AI

Паттерны снижения трения при работе с AI-ассистентами: разбор статьи Rahul Garg

Разбор статьи с martinfowler.com о пяти паттернах эффективной работы с AI-ассистентами в разработке: Knowledge Priming, Design-First Collaboration, Context Anchoring, Encoding Team Standards и Feedback Flywheel — с микропримерами, личным опытом и критическим взглядом

Как настроить окружение для изучения языка программирования

Инструменты

Как настроить окружение для изучения языка программирования

Универсальный гайд по настройке рабочего окружения для изучения любого языка: установка runtime, выбор редактора, первый запуск, менеджер зависимостей и альтернативный путь через Docker

Java для backend и контейнеров: где она по-прежнему очень сильна

Java

Java для backend и контейнеров: где она по-прежнему очень сильна

Java в современном backend и контейнерной эксплуатации: где она особенно сильна, какие у неё реальные компромиссы, как выглядит контейнеризация на практике и почему образ языка как «тяжёлого энтерпрайза из прошлого» уже давно слишком упрощён

System Design без культа идеальных схем

Архитектура

System Design без культа идеальных схем

Системный дизайн без академизма и культа «идеальных схем»: с чего начинать проектирование, как думать про контекст и trade-offs, и почему хорошая архитектура почти никогда не выглядит как красивая универсальная диаграмма

OpenTelemetry Collector: зачем он нужен и как на него правильно смотреть

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

OpenTelemetry Collector: зачем он нужен и как на него правильно смотреть

Зачем нужен отдельный слой сбора телеметрии, как Collector устроен, сколько ресурсов потребляет, какие deployment-паттерны бывают, типичные ошибки и когда он действительно оправдан