У нас есть много приложений и веб-сервисов (некоторые общедоступные продукты, некоторые внутренние и часть частного «бэкэнда»), которые взаимозависимы друг от друга. Каждый из этих компонентов имеет 4 среды (кластеры серверов / узлов, обслуживающих определенные цели):
- Непроизводственные
DEV
- Интегрированная среда разработки, в которой CI создает push-изменения; полезно для инженеров для устранения трудно обнаруживаемых ошибок, которые не воспроизводятся локальноQA
- Изолированная QA / Среда тестированияDEMO
- Стабильная среда UAT для заинтересованных сторон
- производство
LIVE
- Наша живая / производственная среда
Продвижение кода идет: LOCAL
(машина разработчика) => DEV
=> QA
=> DEMO
=> LIVE
.
Скажем, у нас есть приложение с myapp
поддержкой веб-службы RESTful myws
, которое само поддерживается базой данных mydb
.
В настоящее время у нас есть то, что я бы назвал « организованным » продвижением среди этих зависимостей: myapp-dev
точки, myws-dev
которые используются mydb-dev
. Точно так же myapp-qa
указывает на то, myws-qa
что использует mydb-qa
. То же самое для DEMO
и LIVE
.
Проблема с этим состоит в том , что в любое время я внести изменения, скажем, myapp
это требует от меня , чтобы внести изменения в myws
и mydb
а. Но поскольку каждая DEV
среда указывает на среды своих зависимостей DEV
, это означает, что я должен планировать и развертывать эти изменения одновременно. Кроме того, если одна сборка становится нестабильной / сломанной, она часто приводит к отключению других вышестоящих компонентов; например , если перерывы разработчик что - то при изменении mydb-dev
, то myws-dev
и myapp-dev
кластеры обычно также становятся нестабильными.
Чтобы решить эту проблему, я собираю предложения для того, что я бы назвал « разрозненной » стратегию продвижения: все межкомпонентными зависимости следовать этим рекомендациям:
- Восходящие зависимости зависят от
DEMO
среды для своих последующих зависимостей, для всех их непроизводственных сред (DEV
,QA
иDEMO
); а также - Восходящие зависимости зависят от
LIVE
среды для их нижестоящих зависимостей для их производственной среды
Используя это соглашение, на myapp-dev
самом деле будет указывать myws-demo
, что будет использовать mydb-demo
. Точно так же myapp-qa
будет также указывать myws-demo
и mydb-demo
.
Преимущество, которое я могу найти, заключается в стабилизации сборки : гораздо менее вероятно, что DEMO
среда для определенного компонента станет нестабильной, потому что код не сможет этого сделать DEMO
без тщательного тестирования как на, так DEV
и на QA
.
Единственный недостаток, который я могу найти в этом методе, заключается в том, что, если он DEMO
не работает для определенного компонента, все непроизводственные среды для всех зависимых компонентов будут внезапно нарушены. Но я бы возразил, что это должно происходить крайне редко из-за проведенного тестирования DEV
и QA
.
Это меня проблема , что многие разработчики (гораздо умнее , и опытные , чем я сам) решили, и я не удивлюсь , если эта проблема и ее решение уже имеют название на них (кроме того , что я называю спланированным / разрозненным). Поэтому я спрашиваю: перевешивают ли преимущества стратегии продвинутого продвижения какие-либо недостатки, и какие недостатки я могу пропустить здесь?
Ответы:
Если я правильно читаю ваш пост, похоже, что это предложение фактически не решает ни одну из предполагаемых проблем.
Кажется, что «стратегия постепенного продвижения» только усугубит это. Если myapp v2, myws v2 и mydb v2 работают только на DEV, а myapp v2 полагается на mydb v2, чтобы не аварийно завершить работу, то при попытке запустить myapp v2 на DEV я получаю mydb v1 DEMO, и он вылетает. По сути, вам придется либо постоянно перезаписывать хранилища, либо развертывать mydb v2 вплоть до prod, прежде чем вы сможете начать работать над myapp v2. Что еще более важно, вы никогда не будете тестировать mydb v2 на DEV, поэтому, если он сломан, вы даже не узнаете, пока он не сломался на DEMO, и тогда вы вернетесь на круги своя.
В некоторой степени описанная вами проблема неизбежна независимо от того, как настроен ваш рабочий процесс, но ее можно минимизировать. Хитрость заключается в том, чтобы гарантировать, что интерфейс между mydb и myws (и интерфейс между myws и myapp) строго определен и требует , чтобы все обновления этого интерфейса были полностью обратно совместимы . На моей работе у нас есть XML-схема, определяющая интерфейс между нашими приложениями и сервисами, и многие из наших внутренних инструментов просто не позволят нам делать несовместимые обновления этих схем.
Это звучит для меня как серьезная проблема, но не проблема развертывания. Разбитая база данных, безусловно, помешает нормальной работе службы и приложения, но они не должны становиться «нестабильными». Они должны возвращать сообщения об ошибках какого-то рода, чтобы любой, кто запускает myapp на dev, видел «Извините, у нашей базы данных сегодня проблемы», а не просто вылетал.
Если проблема заключается в том, что неисправная база данных вообще вызывает эти проблемы, тогда вы можете настроить некую «временную систему», которая позволит вам сказать: «mydb DEV сейчас не работает, пожалуйста, направьте все запросы myws DEV в mydb DEMO для время ". Но это должно быть способом выполнения временных исправлений, пока mydb DEV снова не заработает нормально. Если по умолчанию все «запутано», то вы вернулись к проблемам, которые я описал выше, потому что никто не работает с mydb DEV вообще.
Я чувствую, что, возможно, я каким-то образом неправильно понимаю ваше предложение, но, надеюсь, этот ответ, по крайней мере, прояснит, что было неправильно понято и как лучше перефразировать его.
источник