The Twelve-Factor App

X. Sự tương đồng giữa quá trình phát triển và vận hành thực tế

Đảm bảo sự tương đồng giữa môi trường phát triển, kiểm thử và thực tế

Trước đây, có sự khác biệt nhất định giữa quá trình phát triển (lập trình viên có thể tạo ra các bản chỉnh sửa triển khai cục bộ của ứng dụng) và vận hành thực tế (phiên bản được triển khai thực tế và truy cập bởi khách hàng). Khác biệt này được thể hiện ở ba lĩnh vực:

Ứng dụng áp dụng mười hai hệ số được thiết kế để triển khai liên tục bằng việc giảm thiểu khác biệt giữa quá trình triển khai và vận hành thực tế. Chúng ta cùng xem lại các sự khác biệt ở trên:

Tổng kết vấn đề trên thông qua bảng sau:

Ứng dụng truyền thống Ứng dụng sử dụng mười hai hệ số
Thời gian giữa các lần triển khai Hàng tuần Hàng giờ
Tác giả và người triển khai mã nguồn Khác nhau Cùng một người
Môi trường phát triển và thực tế Không đồng nhất Tương đồng

Dịch vụ hỗ trợ, như là cơ sở dữ liệu của ứng dụng, hệ thống hàng đợi hoặc bộ đệm, là nơi mà thường có sự khác biệt giữa môi trường phát triển và vận hành. Rất nhiều ngôn ngữ cung cấp các thư viện, bao gồm nhiều mô phỏng của các loại dịch vụ khác nhau được cung cấp để làm đơn giản hoá việc truy cập các dịch vụ hỗ trợ. Một vài ví dụ ở bảng sau:

Loại Ngôn ngữ Thư viện Mô phỏng
Cơ sở dữ liệu Ruby/Rails ActiveRecord MySQL, PostgreSQL, SQLite
Hàng đợi Python/Django Celery RabbitMQ, Beanstalkd, Redis
Bộ đệm Ruby/Rails ActiveSupport::Cache Memory, filesystem, Memcached

Lập trình viên thường thích sử dụng các dịch vụ hỗ trợ đơn giản trên môi trường cục bộ của họ, trong khi nhiều dịch vụ hỗ trợ mạnh mẽ và an toàn hơn được sử dụng trong môi trường vận hành thực tế. Ví dụ, sử dụng SQLite ở cục bộ và Postgresql trong vận hành, hoặc sử dụng trực tiếp bộ nhớ cho bộ đệm trong phát triển và Memcached trong vận hành.

Ứng dụng sử dụng mười hai hệ số không cho phép sử dụng dịch vụ hỗ trợ khác nhau giữa môi trường phát triển và vận hành, mặc dù các bộ mô phỏng có thể trừu tượng hoá bất kỳ sự khác biệt của dịch vụ hỗ trợ. Sự khác biệt giữa dịch vụ hỗ trợ có nghĩa là dù bất kỳ sự không đồng bộ nhỏ nào cũng có thể mở rộng, là nguyên nhân cho việc mã nguồn có thể hoạt động tốt ở môi trường phát triển hoặc kiểm thử nhưng không hoạt động trong môi trường thực tế. Các kiểu lỗi này làm cản trở quá trình triển khai liên tục. Chi phí cho các cản trở và làm giảm ảnh hưởng cho chúng thường rất tốn kém trong suốt quá trình phát triển của một ứng dụng.

Các dịch vụ đơn giản ở cục bộ không được ưu tiên như các dịch vụ tương tự. Các dịch vụ hỗ trợ hiện đại như Memcached, PostgreSQL, và RabbitMQ không quá khó để cài đặt thông qua các dịch vụ đóng gói như là Homebrewapt-get. Ngoài ra, các công cụ cung cấp khai báo ChefPuppet kết hợp với các môi trường ảo hoá đơn giản Vagrant cho phép lập trình viên có thể vận hành ở cục bộ một môi trường khá giống với môi trường vận hành thực tế. Chi phí cho việc cài đặt và sử dụng nhỏ hơn rất nhiều so với chi phí của triển khai liên tục và sự khác biệt giữa môi trường phát triển và vận hành.

Bộ mô phỏng đối với các dịch vụ hỗ trợ vẫn có ích, vì chúng làm giảm ảnh hưởng của việc chuyển đổi sang dịch vụ hỗ trợ mới. Nhưng tất cả các bước triển khai của ứng dụng (môi trường của lập trình viên, kiểm thử, vân hành thực tế) nên sử dụng cùng một loại và phiên bản của các kiểu dịch vụ hỗ trợ.