Chúng tôi có rất nhiều ứng dụng và dịch vụ web (một số sản phẩm phải đối mặt công khai, một số nội bộ và một phần của "phụ trợ" riêng) phụ thuộc lẫn nhau. Mỗi một trong các thành phần này có 4 môi trường (cụm máy chủ / nút phục vụ các mục đích cụ thể):
- Phi sản xuất
DEV
- Môi trường phát triển tích hợp nơi CI xây dựng các thay đổi đẩy; hữu ích cho các kỹ sư để khắc phục các lỗi khó tìm mà không thể tái tạo cục bộQA
- Môi trường thử nghiệm / QA bị cô lậpDEMO
- Môi trường UAT ổn định cho các bên liên quan kinh doanh
- Sản xuất
LIVE
- Môi trường sống / sản xuất của chúng tôi
Mã khuyến mãi đi: LOCAL
(máy của nhà phát triển) => DEV
=> QA
=> DEMO
=> LIVE
.
Giả sử chúng ta có một ứng dụng được gọi myapp
là được hỗ trợ bởi một dịch vụ web RESTful được gọi myws
, chính nó được hỗ trợ bởi một DB được gọi mydb
.
Hiện tại, chúng tôi có những gì tôi sẽ gọi là quảng cáo "được phối hợp " trong số các phụ thuộc này: các myapp-dev
điểm myws-dev
sử dụng mydb-dev
. Tương tự, myapp-qa
điểm myws-qa
mà sử dụng mydb-qa
. Tương tự cho DEMO
và LIVE
.
Vấn đề với điều này là bất cứ lúc nào tôi thực hiện một thay đổi, chẳng hạn, myapp
, điều này đòi hỏi tôi phải thay đổi myws
và mydb
là tốt. Nhưng vì mỗi DEV
môi trường đều chỉ ra các DEV
môi trường phụ thuộc của nó, điều đó có nghĩa là tôi phải lên lịch và triển khai tất cả các thay đổi này cùng một lúc. Hơn nữa, nếu một bản dựng trở nên không ổn định / bị hỏng, nó thường đưa xuống các thành phần ngược dòng khác; chẳng hạn, nếu một nhà phát triển phá vỡ một cái gì đó khi thay đổi mydb-dev
, các cụm myws-dev
và myapp-dev
thường cũng trở nên không ổn định.
Để giải quyết vấn đề này, tôi đưa ra một đề xuất cho chiến lược quảng cáo " im lặng ": tất cả các phụ thuộc giữa các thành phần đều tuân theo hướng dẫn này:
- Phụ thuộc thượng nguồn phụ thuộc vào
DEMO
môi trường phụ thuộc hạ của họ, cho tất cả các môi trường phi sản xuất của họ (DEV
,QA
vàDEMO
); và - Phụ thuộc vào thượng nguồn phụ thuộc vào
LIVE
môi trường cho các phụ thuộc hạ nguồn của họ cho môi trường sản xuất của họ
Sử dụng quy ước này, myapp-dev
sẽ chấp hành điểm myws-demo
, sẽ sử dụng mydb-demo
. Tương tự, myapp-qa
cũng sẽ chỉ đến myws-demo
và mydb-demo
.
Lợi thế ở đây mà tôi có thể tìm thấy là ổn định xây dựng : ít có khả năng DEMO
môi trường cho một thành phần cụ thể sẽ trở nên không ổn định, bởi vì mã không thể thực hiện được DEMO
nếu không kiểm tra nghiêm ngặt cả trên DEV
và QA
.
Nhược điểm duy nhất tôi có thể tìm thấy đối với phương pháp này là, nếu DEMO
phá vỡ một thành phần cụ thể, tất cả các môi trường phi sản xuất cho tất cả các phụ thuộc ngược dòng sẽ đột nhiên bị phá vỡ. Nhưng tôi sẽ phản bác rằng điều này sẽ hiếm khi xảy ra do thử nghiệm được thực hiện trên DEV
và QA
.
Điều này đã nhận được là một vấn đề mà nhiều nhà phát triển (thông minh hơn nhiều và có kinh nghiệm hơn so với bản thân mình) đã được giải quyết, và tôi sẽ không ngạc nhiên nếu vấn đề này và các giải pháp của nó đã có tên họ (ngoài những gì tôi đang kêu gọi dàn / bị bưng bít). Vì vậy, tôi hỏi: Liệu những ưu điểm của một chiến lược xúc tiến ngớ ngẩn có lớn hơn bất kỳ nhược điểm nào không, và những nhược điểm mà tôi có thể đang nhìn thấy ở đây là gì?