ERLANG
Иногда читаю про язык erlang и его виртуальную машину. И каждый раз нравится все больше.
Основная идея состоит в надежных распределенных вычислениях. Как это добивается:
1. Виртуальная машина предоставляет простой способ поднять кластер на разных нодах
2. Она сама распределяет нагруку и создает процессы на нодах
3. Есть специальный фреймворк для вычислений на кластере
4. Hot reload, можно без поростоя обновить код
5. Миграции, позволяет настраивать переход состояния процессов при hot reload
6. Автоматический перенос процессов между нодами
Все это позволяет делать высоко доступные производительные решения. Чаще всго применяется в телекоме, где необходимо давай высокий uptime без простоя)
Иногда читаю про язык erlang и его виртуальную машину. И каждый раз нравится все больше.
Основная идея состоит в надежных распределенных вычислениях. Как это добивается:
1. Виртуальная машина предоставляет простой способ поднять кластер на разных нодах
2. Она сама распределяет нагруку и создает процессы на нодах
3. Есть специальный фреймворк для вычислений на кластере
4. Hot reload, можно без поростоя обновить код
5. Миграции, позволяет настраивать переход состояния процессов при hot reload
6. Автоматический перенос процессов между нодами
Все это позволяет делать высоко доступные производительные решения. Чаще всго применяется в телекоме, где необходимо давай высокий uptime без простоя)
❤1✍1
MONO
Один из вариантов ведения разработки это монорепы.
Как пример - в репе несколько модулей одного проекта, плюс общие компоненты. Чаще всего все эти модули собираются в отдельные микросервисы, и при сборке сразу из репы тащаться общие компоненты.
Зачем так делать? Для кого то это проще. Если все модули имеют сильную связанность то куда легче вести все это вместе. Плюс, в какой то мере, это проще поддерживать и выкатывать.
Какой обычно флоу для CI/CD:
- При изменения файлов кокнретного модуля тригер на сборку этого модуля
- Тригер сборки модуля тригерит его деплой
- При изменения файлов общих компонентов пересобираются и деплоятся все компоненты
Один из вариантов ведения разработки это монорепы.
Как пример - в репе несколько модулей одного проекта, плюс общие компоненты. Чаще всего все эти модули собираются в отдельные микросервисы, и при сборке сразу из репы тащаться общие компоненты.
Зачем так делать? Для кого то это проще. Если все модули имеют сильную связанность то куда легче вести все это вместе. Плюс, в какой то мере, это проще поддерживать и выкатывать.
Какой обычно флоу для CI/CD:
- При изменения файлов кокнретного модуля тригер на сборку этого модуля
- Тригер сборки модуля тригерит его деплой
- При изменения файлов общих компонентов пересобираются и деплоятся все компоненты
👍2
TOOLS
Про зоопарк инструментов.
Периодически втречаю проекты где есть какое то количество инструментов которые делают одно и тоже, но их схлопывают.
Например репозиторий в гитлабе, а пайпланы запускаются в jenkins. Казалось бы, почему не сделать сразу все в гитлабе? Ну или не переделать сейчас.
Чаще это бывает легаси которое сложно выпилить. Например когда то дженкинс закрывал что то чего нет в гитлабе. Но со временем база пайлпайнов сильно разрастается, и уже сложно просто взять и переписать все на гитлаб. Так и продолжается, все новые пайпланы по привычке заводятся на jenkins.
Что тут можно сделать? Ну если команду все устраивает то ничего делать не нужно.
А так, изначально не стоит заводить зоопарк инструментов, это сильно увеличивает сложность поддержки и необходимую экспертизу.
Если же это уже случилось то можно просто остановится и оставить этот кусок как легаси, все новое уже заводить как нужно. А легаси можно уже потихоньку разгребать)
Про зоопарк инструментов.
Периодически втречаю проекты где есть какое то количество инструментов которые делают одно и тоже, но их схлопывают.
Например репозиторий в гитлабе, а пайпланы запускаются в jenkins. Казалось бы, почему не сделать сразу все в гитлабе? Ну или не переделать сейчас.
Чаще это бывает легаси которое сложно выпилить. Например когда то дженкинс закрывал что то чего нет в гитлабе. Но со временем база пайлпайнов сильно разрастается, и уже сложно просто взять и переписать все на гитлаб. Так и продолжается, все новые пайпланы по привычке заводятся на jenkins.
Что тут можно сделать? Ну если команду все устраивает то ничего делать не нужно.
А так, изначально не стоит заводить зоопарк инструментов, это сильно увеличивает сложность поддержки и необходимую экспертизу.
Если же это уже случилось то можно просто остановится и оставить этот кусок как легаси, все новое уже заводить как нужно. А легаси можно уже потихоньку разгребать)
👍1
Очень классное выступление манискин, как обычно Итальянцы делают очень жарко)
https://www.youtube.com/watch?v=_kOzW0HPLT0
https://www.youtube.com/watch?v=_kOzW0HPLT0
YouTube
Måneskin - Beggin' | Live at Rock in Rio 2022 [4K]
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
TRIVY
Как сделать сканирование образов без доступа в интернет? Это важно в закрытых контурах.
Проблема в том что нам нужна база данных известных CVE, и в любом случае придется выкачивать их из интернета.
Но это можно сделать на этапе сборки самого трайви, а не при сканировании. Это даст нам гарантию что мы просканирую наши образы только у себя и это никуда не сольется.
Делается это так:
При сборке образа с трайвии делаем:
При сканировании добавляем два параметра:
Все. Мы сможем сканить оффлайн)
Главное это периодически пересобирать образ, что бы держать базу CVE актуальной.
Как сделать сканирование образов без доступа в интернет? Это важно в закрытых контурах.
Проблема в том что нам нужна база данных известных CVE, и в любом случае придется выкачивать их из интернета.
Но это можно сделать на этапе сборки самого трайви, а не при сканировании. Это даст нам гарантию что мы просканирую наши образы только у себя и это никуда не сольется.
Делается это так:
При сборке образа с трайвии делаем:
RUN trivy image --download-db-onlyПри сканировании добавляем два параметра:
--skip-db-update --offline-scanВсе. Мы сможем сканить оффлайн)
Главное это периодически пересобирать образ, что бы держать базу CVE актуальной.
👍1
CACHE
Как работает докер кеш на уровне регистри.
Наш образ состоит из слоев, которые определяются докерфайлом. Имя каждого слоя по сути хеш того что было исполненно в кокретном шаге сборки и состояния файловой системы.
И вот мы можем пушить каждый этот слой в отдельную blob регистри, и именовать их как раз хешем. Таким образом при следующей сборке считать хеш и тянуть нужный слой из регистри.
Это может сильно ускорить например на шагах сборки зависимостей, или там где есть долгая компиляция чего то.
Но важно ставить ретеншен на этот blob, что бы не возникало случаев когда мы внесли изменение которое не попало в хеш слоя и мы получили старую его версию.
Как работает докер кеш на уровне регистри.
Наш образ состоит из слоев, которые определяются докерфайлом. Имя каждого слоя по сути хеш того что было исполненно в кокретном шаге сборки и состояния файловой системы.
И вот мы можем пушить каждый этот слой в отдельную blob регистри, и именовать их как раз хешем. Таким образом при следующей сборке считать хеш и тянуть нужный слой из регистри.
Это может сильно ускорить например на шагах сборки зависимостей, или там где есть долгая компиляция чего то.
Но важно ставить ретеншен на этот blob, что бы не возникало случаев когда мы внесли изменение которое не попало в хеш слоя и мы получили старую его версию.
👍1
HARDWARE
Про тяжелые вычисления.
Например обучение AI моделей требует обработки большого количества данных. Основной батлнек - пропускная способность памяти. Даже если у нас стоит очень мощный чип, но мы не можем обеспечить его данными то он будет простаивать в IO большую часть времени.
Тут влияет даже проектирование платформы данных и обучение, что бы нужные для обучения данные были на тех нодах где будет происходить.
Плюс скорость самой памяти, тут очен зависит скорость RAM и большой обьем кешей чипа. Ну и скорость диска, конечно же.
Поэтому сейчас очень важно смотреть на подсистему памяти, а не только на мозность чипа, иначе дорогой чип ничем не будет выигрывать более дешевому)
Про тяжелые вычисления.
Например обучение AI моделей требует обработки большого количества данных. Основной батлнек - пропускная способность памяти. Даже если у нас стоит очень мощный чип, но мы не можем обеспечить его данными то он будет простаивать в IO большую часть времени.
Тут влияет даже проектирование платформы данных и обучение, что бы нужные для обучения данные были на тех нодах где будет происходить.
Плюс скорость самой памяти, тут очен зависит скорость RAM и большой обьем кешей чипа. Ну и скорость диска, конечно же.
Поэтому сейчас очень важно смотреть на подсистему памяти, а не только на мозность чипа, иначе дорогой чип ничем не будет выигрывать более дешевому)
👍1
CI/CD
Про разные CI/CD системы.
По своей логике они все одинаковые, просто предоставляют разные фичи.
Например сейчас смотрю один проект который работает на bitbucket. Я ни разу с ним не работал, но с опытом гитлаба тут все понятно, просто чуть другой синтаксис.
Тут, как по мне, нужно понимать логику и основные примитивы CI/CD процесса, а с синтаксисом могут помочь нейросети.
Из различий. По тому что я вижу в битбакете любят использовать шаблонные пайплайны которые предоставляет сам битбакет. Как я понял разные вендоры инфры типа aws и яндекс клауда могут предоставлять свои публичные пайплайны под их инфру. В гитлабе такого особо не встречал, все пишут шаблоны сами.
Ну и по ощущениям гитлаб куда более гибкий.
Про разные CI/CD системы.
По своей логике они все одинаковые, просто предоставляют разные фичи.
Например сейчас смотрю один проект который работает на bitbucket. Я ни разу с ним не работал, но с опытом гитлаба тут все понятно, просто чуть другой синтаксис.
Тут, как по мне, нужно понимать логику и основные примитивы CI/CD процесса, а с синтаксисом могут помочь нейросети.
Из различий. По тому что я вижу в битбакете любят использовать шаблонные пайплайны которые предоставляет сам битбакет. Как я понял разные вендоры инфры типа aws и яндекс клауда могут предоставлять свои публичные пайплайны под их инфру. В гитлабе такого особо не встречал, все пишут шаблоны сами.
Ну и по ощущениям гитлаб куда более гибкий.
👍1
И последнее на сегодня)
"Колаба" бостонов и ролинг стонс)
https://www.youtube.com/watch?v=XnZH4izf_rI
"Колаба" бостонов и ролинг стонс)
https://www.youtube.com/watch?v=XnZH4izf_rI
YouTube
“Spot Me Up” | The Rolling Stones & Boston Dynamics
‘Start Me Up’ taken from Tattoo You 2021: https://the-rolling-stones.lnk.to/TattooYou2021So
Video in collaboration with Mercury Studios, Polydor Records & The Rolling Stones
https://www.youtube.com/c/mercurystudios
https://www.polydor.co.uk/
https://rollingstones.com/…
Video in collaboration with Mercury Studios, Polydor Records & The Rolling Stones
https://www.youtube.com/c/mercurystudios
https://www.polydor.co.uk/
https://rollingstones.com/…
PROXY
Как пробрасывать определенный трафик из контейнера через прокси? Разберем на примере апи openai.
Допустим наше приложение расологается в России, но нам нужно делать запросы к моделькам.
Для начала поднимаем иностранный сервер и ставим туда пакет nginx-full, он включает в себя модуль проксирования tcp трафика.
В nginx conf добавляем такой блок:
Он будет слушать на 443 порту и весь трафик который пришел на него пробрасывать на api.openai.com.
Далее, при старте контейнера указываем ему переписывание hosts для этого домена:
Где $YOUR_PROXY_IP это адрес сервера с nginx.
Все, теперь если приложение в контейнере будет обращаться на api.openai.com то все запросы будут идти через прокси.
Как пробрасывать определенный трафик из контейнера через прокси? Разберем на примере апи openai.
Допустим наше приложение расологается в России, но нам нужно делать запросы к моделькам.
Для начала поднимаем иностранный сервер и ставим туда пакет nginx-full, он включает в себя модуль проксирования tcp трафика.
В nginx conf добавляем такой блок:
stream {
upstream backend {
server api.openai.com:443;
}
server {
listen 443;
proxy_pass backend;
proxy_ssl_server_name on;
ssl_preread on;
}
}
Он будет слушать на 443 порту и весь трафик который пришел на него пробрасывать на api.openai.com.
Далее, при старте контейнера указываем ему переписывание hosts для этого домена:
--add-host=api.openai.com=$YOUR_PROXY_IP
Где $YOUR_PROXY_IP это адрес сервера с nginx.
Все, теперь если приложение в контейнере будет обращаться на api.openai.com то все запросы будут идти через прокси.
👍1
CLOUD
Снова про гиперскейлеры.
Мне до сих пор сильно не нравится усложнение ролевой системой. Часто есть миллион способов авторизоваться для каждого ресурса клауда. Например для авторизации в регистри и кубере будет использовать сильно разные способы создавать токены дотупы.
Я понимаю зачем это сделанно, это гибкая и сложная система доступа которая позволяет настроить все очень тонко. Но проблема в том что это сильное усложнение когда нужно сделать что то простое.
В неоклаудах часто можно создать ресурс, нажать одну кнопку и сразу получить доступ, что куда проще и быстрее. Что менее безопасно, но дает возможность быстро начать работу.
И да, усложнение не всегда хорошо. Если система сильно усложняет процесс безопасности то часто начинает ее обход, например использование одного токена или пользака вообще везде. Поэтому упрощение не всегда плохо)
Снова про гиперскейлеры.
Мне до сих пор сильно не нравится усложнение ролевой системой. Часто есть миллион способов авторизоваться для каждого ресурса клауда. Например для авторизации в регистри и кубере будет использовать сильно разные способы создавать токены дотупы.
Я понимаю зачем это сделанно, это гибкая и сложная система доступа которая позволяет настроить все очень тонко. Но проблема в том что это сильное усложнение когда нужно сделать что то простое.
В неоклаудах часто можно создать ресурс, нажать одну кнопку и сразу получить доступ, что куда проще и быстрее. Что менее безопасно, но дает возможность быстро начать работу.
И да, усложнение не всегда хорошо. Если система сильно усложняет процесс безопасности то часто начинает ее обход, например использование одного токена или пользака вообще везде. Поэтому упрощение не всегда плохо)
👍1
HELM
Есть шаблонные хельм чарты которые предоставляют сами вендоры софта.
Например bitnami предоставляет свой регистри с чартами, с свое реализацией софта. Сегодня ставил рабит и редис оттуда.
Когда использовать такие чарты? Когда это небольшой проект где не нужно что то кастомное.
Для таких проектов хватит готовых чартов, которые и так очень хорошо настроены, лучше чем сделают многие на коленке)
Как использовать такие чарты:
- Добавляем репу helm repo add bitnami
- Обновляем кеш helm repo update
- Скачиваем чарт helm pull bitnami/memcached --version 8.0.4
- Делаем install скачанного чарты
Чаще всего все заведется с первого раза, можно сразу начинать пользоваться)
Есть шаблонные хельм чарты которые предоставляют сами вендоры софта.
Например bitnami предоставляет свой регистри с чартами, с свое реализацией софта. Сегодня ставил рабит и редис оттуда.
Когда использовать такие чарты? Когда это небольшой проект где не нужно что то кастомное.
Для таких проектов хватит готовых чартов, которые и так очень хорошо настроены, лучше чем сделают многие на коленке)
Как использовать такие чарты:
- Добавляем репу helm repo add bitnami
- Обновляем кеш helm repo update
- Скачиваем чарт helm pull bitnami/memcached --version 8.0.4
- Делаем install скачанного чарты
Чаще всего все заведется с первого раза, можно сразу начинать пользоваться)
👍1
QUESTION
Пара моих любимых вопросов которые задают на собесах.
1. При канареечном релизе мы постепенно переключаем трафик на новую версию. На что ориентироваться при повышение процента трафика? На какие метрики?
2. Есть релизы в которых мы держим новую и старую версию одновременно. Но новая версия может накатить миграцию в БД которуа сломает старую версию. Что делать?
3. Есть сервер с постгрей. В нормальном режиме диск потребляется на 30%. Но начались волны потребления, пару раз в день диск забивается до 100 процентов и возвращается к 30. В чем может быть проблема и что делать?
Понятно, я спрашиваю и более точечные технические вопросы. Но такие вопросы больше показывают на сколько кандидат может погрузится вглубь. Тут нет одного верного ответа, главное посмотреть как человек действует и на что смотрит)
Пара моих любимых вопросов которые задают на собесах.
1. При канареечном релизе мы постепенно переключаем трафик на новую версию. На что ориентироваться при повышение процента трафика? На какие метрики?
2. Есть релизы в которых мы держим новую и старую версию одновременно. Но новая версия может накатить миграцию в БД которуа сломает старую версию. Что делать?
3. Есть сервер с постгрей. В нормальном режиме диск потребляется на 30%. Но начались волны потребления, пару раз в день диск забивается до 100 процентов и возвращается к 30. В чем может быть проблема и что делать?
Понятно, я спрашиваю и более точечные технические вопросы. Но такие вопросы больше показывают на сколько кандидат может погрузится вглубь. Тут нет одного верного ответа, главное посмотреть как человек действует и на что смотрит)
👍1
MIGRATE
Несколько вариантов запуска миграций при релизах, от простых к сложным:
1. Запускать при старте приложения, либо как часть запуска либо отдельной командой.
2. Контейнер с миграциями. Собираем их в образ и стартуем как обычное приложение.
3. Из CI/CD процесса, просто отдельная job которая подрубается к бд и катит туда миграции.
4. K8s job. Кубовый обьект который запускает образ с миграциями перед релизом.
На самом деле эти способы самые основные, и на практике они встречаются все. Их можно докручивать и кастомизировать, но концептуально это всегда просто исполнение sql кода с помощью специальных подсистем)
Выбирать стоит по необходимости. Например первый способ не подойдет для приложений с большим количеством реплик, а последний только при зрелых девопс практиках.
Несколько вариантов запуска миграций при релизах, от простых к сложным:
1. Запускать при старте приложения, либо как часть запуска либо отдельной командой.
2. Контейнер с миграциями. Собираем их в образ и стартуем как обычное приложение.
3. Из CI/CD процесса, просто отдельная job которая подрубается к бд и катит туда миграции.
4. K8s job. Кубовый обьект который запускает образ с миграциями перед релизом.
На самом деле эти способы самые основные, и на практике они встречаются все. Их можно докручивать и кастомизировать, но концептуально это всегда просто исполнение sql кода с помощью специальных подсистем)
Выбирать стоит по необходимости. Например первый способ не подойдет для приложений с большим количеством реплик, а последний только при зрелых девопс практиках.
NET BALANCER
Для чего используются сетевые балансировщики? Чаще всего что бы скрыть внутреннию инфру и распределять нагрузку.
Как пример - ингрес на куб кластере. По дефолту мы можем просто открыть в интернет все ноды и прописать их в днс, все будет работать. Но таким образом мы откроем наш кубер наружу.
А если поставить один сетевой балансер и распределять трафик по нодам то для всех внешних чуваков это будет просто ip адрес куда идет трафик, без понимания что находится за ним.
Под сетевым балансером чаще подразумевается балансировка tcp трафика, на апстримах система должна уметь сама принимать его и работать как нужно. То есть в случае куба трафик будет приходить как есть на nginx ingress и он уже будет работать с ним по своим правидам.
Для чего используются сетевые балансировщики? Чаще всего что бы скрыть внутреннию инфру и распределять нагрузку.
Как пример - ингрес на куб кластере. По дефолту мы можем просто открыть в интернет все ноды и прописать их в днс, все будет работать. Но таким образом мы откроем наш кубер наружу.
А если поставить один сетевой балансер и распределять трафик по нодам то для всех внешних чуваков это будет просто ip адрес куда идет трафик, без понимания что находится за ним.
Под сетевым балансером чаще подразумевается балансировка tcp трафика, на апстримах система должна уметь сама принимать его и работать как нужно. То есть в случае куба трафик будет приходить как есть на nginx ingress и он уже будет работать с ним по своим правидам.
👍2
VIBE
Про вайб код в девопсе.
Сейчас я больше рассматриваю его как помощника в написании разных автоматизаций. Это позволяет сохранить кучу времени.
Пример из сегодня: мне нужно скачать на линукс сервер кучу файлов из гугл диска. В тупую через wget это не работает, да и пришлось бы скармливать ссылку до каждого файла отдельно.
Это задача решается скриптом, которому на вход подаешь ссылку на диск и он сам проходит по всем файлам и скачивает их. Под капотом у него специальная утилита для работы с гугл диска.
Понятное дело, я мог изучить эту утилиту и пойти сам писать скрипт. Но стоит ли тратить на это свое время? Учитвая что это разовая задача которая, скорее всего, возникнет еще очень не скоро. Поэтому логично отдать написание скрипта курсору и не тратить на это свое время.
И для меня это просто про экономию времени, что бы потратить его на что то полезное, а не про то что мне лень изучать что то)
Про вайб код в девопсе.
Сейчас я больше рассматриваю его как помощника в написании разных автоматизаций. Это позволяет сохранить кучу времени.
Пример из сегодня: мне нужно скачать на линукс сервер кучу файлов из гугл диска. В тупую через wget это не работает, да и пришлось бы скармливать ссылку до каждого файла отдельно.
Это задача решается скриптом, которому на вход подаешь ссылку на диск и он сам проходит по всем файлам и скачивает их. Под капотом у него специальная утилита для работы с гугл диска.
Понятное дело, я мог изучить эту утилиту и пойти сам писать скрипт. Но стоит ли тратить на это свое время? Учитвая что это разовая задача которая, скорее всего, возникнет еще очень не скоро. Поэтому логично отдать написание скрипта курсору и не тратить на это свое время.
И для меня это просто про экономию времени, что бы потратить его на что то полезное, а не про то что мне лень изучать что то)
👍1
HTTP BALANCER
Когда стоит выбрать http балансер а не просто сетевой?
Для начала - он в любом случае будет менее производетелен чем обычный сетевой балансер, так как лезет в пакеты а не просто пересылает их.
Так вот, его стоит выбрать когда нужно настроить строгие правила маршрутизации не на приложении. Например роутить одни эндпоинты на один сервер а другие на другой. Обычный сетевой балансер не сможет так, так как он не видит конкретные эндпоинты из http запроса, для него это просто tcp пакеты.
Так же http прокси дает возможность поиграться с производительностью и защитой. На нем можно тонко настроить правила кеширования и rate лимитинг.
Ну и в зависимости от реализации на него можно переложить работу с клиентскими tls сертами.
По реализации, чаще всего, это просто машина с nginx и публичным ip. На него приходят клиентские запросы и он уже роутит их по приложениям внутри сети)
Когда стоит выбрать http балансер а не просто сетевой?
Для начала - он в любом случае будет менее производетелен чем обычный сетевой балансер, так как лезет в пакеты а не просто пересылает их.
Так вот, его стоит выбрать когда нужно настроить строгие правила маршрутизации не на приложении. Например роутить одни эндпоинты на один сервер а другие на другой. Обычный сетевой балансер не сможет так, так как он не видит конкретные эндпоинты из http запроса, для него это просто tcp пакеты.
Так же http прокси дает возможность поиграться с производительностью и защитой. На нем можно тонко настроить правила кеширования и rate лимитинг.
Ну и в зависимости от реализации на него можно переложить работу с клиентскими tls сертами.
По реализации, чаще всего, это просто машина с nginx и публичным ip. На него приходят клиентские запросы и он уже роутит их по приложениям внутри сети)
👍1
MACOS
Немного оффтопная тема)
На той неделе обновился на новый мак, сейчас тут стоит sequoia и думаю обновится до tahoe.
Так вот, мне не не очень нравится что современная макось все больше становится похожа на мобильную систему. Все больше элементов и схожести с IOS.
Запутанные настройки, неудобный finder, не самый интуитивный интерфейс и все прочее.
При том что я очень люблю эту систему, и все еще считаю ее самой удобной. Но это движение в сторону обьединения всех операционок apple мне явно не нравится.
Просто сравните скрины из snow leopard и tahoe, поймете в чем прикол)
Немного оффтопная тема)
На той неделе обновился на новый мак, сейчас тут стоит sequoia и думаю обновится до tahoe.
Так вот, мне не не очень нравится что современная макось все больше становится похожа на мобильную систему. Все больше элементов и схожести с IOS.
Запутанные настройки, неудобный finder, не самый интуитивный интерфейс и все прочее.
При том что я очень люблю эту систему, и все еще считаю ее самой удобной. Но это движение в сторону обьединения всех операционок apple мне явно не нравится.
Просто сравните скрины из snow leopard и tahoe, поймете в чем прикол)
👍1
MIGRATE
Про обратную поддержку миграций в бд.
Да, мы конечно можем сразу выкатить большое обновление которое сломает прошлую версию приложения, и сразу же поднять новую версию.
Но если мы хотим играться, допустим, с канареечным релизом то это не прокатит. Если мы выкатим ломающию миграцию то нормально работать будет только новая версия, а часть пользаков которые остались на старой отвалятся. Поэтому тут миграции нужно писать таким образом что бы как минимум прошлая версия приложения работала с ней без проблем.
Чаще это будет куда быстрее чем держать несколько паралельных баз или ее версий для канарейки. Но требует зрелой культуры разработки и тестирования.
Про обратную поддержку миграций в бд.
Да, мы конечно можем сразу выкатить большое обновление которое сломает прошлую версию приложения, и сразу же поднять новую версию.
Но если мы хотим играться, допустим, с канареечным релизом то это не прокатит. Если мы выкатим ломающию миграцию то нормально работать будет только новая версия, а часть пользаков которые остались на старой отвалятся. Поэтому тут миграции нужно писать таким образом что бы как минимум прошлая версия приложения работала с ней без проблем.
Чаще это будет куда быстрее чем держать несколько паралельных баз или ее версий для канарейки. Но требует зрелой культуры разработки и тестирования.
👍1