<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Дима пишет | Дмитрий Смотров: заметки с тегом ОтказоустойчивоеПО</title>
<link>https://dimasmotrov.ru/tags/otkazoustoychivoepo/</link>
<description>backend python fastapi django rabbitmq kafka postgresql sqlalchemy</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>backend python fastapi django rabbitmq kafka postgresql sqlalchemy</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>12 факторов. Часть 4</title>
<guid isPermaLink="false">36</guid>
<link>https://dimasmotrov.ru/all/12-faktorov-chast-4/</link>
<pubDate>Sun, 14 Sep 2025 22:57:25 +0300</pubDate>
<author></author>
<comments>https://dimasmotrov.ru/all/12-faktorov-chast-4/</comments>
<description>
&lt;p&gt;10) &lt;b&gt;Паритет разработки/работы приложения. Держим среду разработки идентичной среде развертывания. &lt;/b&gt;Если на проде используется Postgres, то локально мы тоже используем Postgres, никаких SQLite/Oracle/MySQL, иначе вы очень рискуете стать тем самым «а у меня локально все работает» парнем. На моей практике различие версии одной зависимости между стейджем и продом привели к двухнедельному кранчу. Фактор обеспечивает способность непрерывного развертывания приложения за счет минимизации различий между средами разработки и исполнения.&lt;br /&gt;
11) &lt;b&gt;Журналирование. Логи как поток событий.&lt;/b&gt; Приложение отдает контроль за своими логами на аутсорс стороннему инструментарию(привет &lt;i&gt;ELK&lt;/i&gt;, а если точнее, то &lt;i&gt;logstash&lt;/i&gt;). Каждый процесс пишет логи в стандартный вывод, а там оно уже как-нибудь «само». Почему? Опять же: для простоты масштабирования. Еще важно подчеркнуть — логи рассматриваются как &lt;i&gt;поток событий&lt;/i&gt;(одна строка логов — одно событие системы), из которых формируется журнал. &lt;i&gt;Журнал&lt;/i&gt; — это поток агрегированных, упорядоченных по времени событий, собранных из потоков вывода всех запущенных процессов и вспомогательных сервисов. По сути это такой же текстовый файл, но его можно визуализировать для удобства(привет &lt;i&gt;Kibana&lt;/i&gt;).&lt;br /&gt;
12) &lt;b&gt;Администрирование&lt;/b&gt;. Выполняем администрирование в разовых процессах, причем среда выполнения таких процессов идентична среде выполнения всего приложения. К администрированию относится выполнение миграций, запуск разовых скриптов(например пользака с админскими правами создать), и тому подобное. Очень сильно перекликается с 10 пунктом и нужно по тем же причинам: если мы будем запускать приложение в одной среде, а администрировать приложение в другой, мы точно в конечном итоге нарвемся на рассогласование конфигураций. Хранить разовые скрипты рекомендуется рядом с основным кодом приложения.&lt;/p&gt;
</description>
</item>

<item>
<title>12 факторов. Часть 3</title>
<guid isPermaLink="false">35</guid>
<link>https://dimasmotrov.ru/all/12-faktorov-chast-3/</link>
<pubDate>Thu, 04 Sep 2025 16:42:49 +0300</pubDate>
<author></author>
<comments>https://dimasmotrov.ru/all/12-faktorov-chast-3/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://dimasmotrov.ru/pictures/image_2025-08-16_23-52-57.png" width="405" height="389" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;7) &lt;b&gt;Привязки портов.&lt;/b&gt; Сервисы экспортируются через бинд порта — то есть сервис тусит на порту и слушает запросы. Тут камень в огород способа развертывания приложения как дополнительного модуля к веб серверу, существовавшему ранее. Сейчас же будьте добры делать приложение самодостаточным, идущем в комплекте с собственным веб-сервером(который вы объявите в зависимостях), а не подсовывайте сервер извне.&lt;br /&gt;
8) &lt;b&gt;Параллельное выполнение команд.&lt;/b&gt; И для параллельного выполнения используются процессы. За основу взяли все хорошее из модели Unix процессов + разделение на типы процессов: если сервис будет обрабатывать HTTP-запросы и выполнять задачи в фоне, то сервис должен быть разделен на веб-процесс и процесс фоновых задач. Таким образом, если увеличивается нагрузка на веб-процесс, то мы докидываем дополнительный веб процесс. Аналогично для процесса фоновых задач. На картинке можно наглядно посмотреть. Вот тут &lt;a href="https://adam.herokuapp.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/"&gt;пост&lt;/a&gt; сооснователя heroku с предложением данной концепции.&lt;br /&gt;
9) &lt;b&gt;Утилизируемость&lt;/b&gt;. Приложение должно запускаться и останавливать свою работу в любой момент, когда это потребуется. В идеале мы минимизируем время запуска, а процесс завершения делаем безопасным — завершаем текущую сессию с БД, чтобы соединения не текли, завершаем все фоновые задачи, только после этого процесс умирает. Хорошо бы еще добавить &lt;i&gt;устойчивость к внезапной смерти оборудования&lt;/i&gt;, но подобное событие считается менее вероятным, чем простое завершение работы по SIGTERM. Весь этот фактор направлен на то, чтобы автомасштабирование работало по принципу «включил/выключил», как свет на кухне: нужно — добавили подов, ненужно — убрали.&lt;/p&gt;
</description>
</item>

<item>
<title>12 факторов. Часть 2</title>
<guid isPermaLink="false">34</guid>
<link>https://dimasmotrov.ru/all/12-faktorov-chast-2/</link>
<pubDate>Wed, 06 Aug 2025 09:49:43 +0300</pubDate>
<author></author>
<comments>https://dimasmotrov.ru/all/12-faktorov-chast-2/</comments>
<description>
&lt;p&gt;Прошлый &lt;a href="https://dimasmotrov.ru/all/12-faktorov-chast-1/"&gt;пост&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;4) &lt;b&gt;Сторонние службы&lt;/b&gt;. Это службы, доступные приложению по сети. База данных, очереди сообщений, кеши — все это сторонние службы и они должны быть *подключаемыми ресурсами*, доступными по URL-адресу, который в свою очередь заносится через параметры конфигурации. В случае, если сервер сторонней службы начинает барахлить, служба переносится на другой сервер и приложению дают URL с новым сервером.&lt;br /&gt;
5) &lt;b&gt;Сборка, релиз и выполнение&lt;/b&gt;. Жесткое разделение этапов развертывания приложения на сборку(берем код и «компилируем» его: ставим зависимости в окружение; реально компилируем, если ЯП проекта компилируемый), релиз(к «собранной» программе докидываются конфиги) и выполнение(непосредственно запуск программы) позволяет контролировать то, какой код был развернут на сервере с помощью систем контроля релиза(например Jenkins), которые в случае чего позволят откатить релиз и проанализировать проблемный релиз на предмет ошибок.&lt;br /&gt;
6) &lt;b&gt;Процессы&lt;/b&gt;. Приложение запускается как один, либо как несколько процессов, без сохранения внутреннего состояния(сервис без состояния — *stateless*). Так же между процессами не должно быть разделяемых данных. Это нужно для упрощения горизонтального масштабирования — просто добавь ~~воды~~ еще один процесс. В случае, если у сервиса есть состояние(допустим, он кеш хранит в глобальном словаре), то нужно это состояние распространить и держать согласованным между всеми инстансами приложения. Состояние, если оно у вас есть, должно быть вынесено во внешнюю службу(для нашего примера для кеша использовать Redis/Memcached).&lt;/p&gt;
</description>
</item>

<item>
<title>12 факторов. Часть 1</title>
<guid isPermaLink="false">33</guid>
<link>https://dimasmotrov.ru/all/12-faktorov-chast-1/</link>
<pubDate>Sun, 03 Aug 2025 21:25:44 +0300</pubDate>
<author></author>
<comments>https://dimasmotrov.ru/all/12-faktorov-chast-1/</comments>
<description>
&lt;p&gt;Был период, когда стандартов развертывания веб приложениях особых не было, каждый разворачивался как хотел, масштабировался как мог.  Появились докер, кубер и стали корпоративным стандартом:  заворачивай приложение в контейнер, настраивай деплой и автоматическое масштабирование и поехали.&lt;/p&gt;
&lt;p&gt;Так как появились стандартизированные инструменты, появились и рекомендации для разработки приложений с той целью, чтобы минимизировать проблемы с деплоем с помощью этих инструментов. Рекомендации эти обозвали «12 факторные приложения» или же «12 шагов к куберу».&lt;/p&gt;
&lt;p&gt;Кратко концепцию можно сформулировать так: если приложение не может запуститься одной командой на вашей рабочей тачке — вы не заскейлитесь в нужный момент, либо скейл будет сопровождаться танцем с бубном и шаманским горловым пением.&lt;/p&gt;
&lt;p&gt;Предлагаю рассмотреть часть пунктов и разберемся чем они полезны.&lt;/p&gt;
&lt;p&gt;1) &lt;b&gt;Кодовая база.&lt;/b&gt; Одна кодовая база — одно приложение. Кодовая база ведется с помощью системы контроля версий, любой, на ваш вкус. Каждый разработчик в команде работает с одним и тем же кодом(изменения, внесенные разработчиком во время работы не противоречат этому пункту), на серверах запускается этот же код. Представьте, что у вас есть N друзей близняшек, одевающихся почти одинаково. Отличать их друг от друга смогут разве что родители(а смогут ли?).&lt;br /&gt;
2) &lt;b&gt;Зависимости.&lt;/b&gt; Приложения явно указывает пакеты, которые нужны ему для работы через манифесты декларации зависимостей и  менеджер зависимостей. Таким образом мы избегаем ситуаций, когда в одной среде приложение работает корректно, а при запуске на другом компьютере приложение падает из-за отсутствия нужной библиотеки.&lt;br /&gt;
3) &lt;b&gt;Конфигурация&lt;/b&gt;. Должна подкидываться приложению из переменных окружения. Если вы прибьете гвоздями креды для подключения к БД в коде, а потом поменяете пароль на сервере базы или же переместите базу на другой хост, то без патча в исходном коде приложения вы банально не заведетесь.&lt;/p&gt;
&lt;p&gt;В последующих постах пройдемся и по остальным 9 пунктам :)&lt;/p&gt;
</description>
</item>


</channel>
</rss>