Mina vs Capistrano – cuộc so găng không cân sức

Tình huống

Auto deployment là một khái niệm mà mình chắc chắn là đã cứu rỗi link rồi của rất nhiều server developer, nó giúp bạn tiết kiệm cực kỳ nhiều thời gian và công sức.

Khi đọc bài viết này, mình cá là bạn đã từng (và đang) sử dụng capistrano làm công cụ auto deployment. Capistrano thì quá nổi tiếng rồi. Hơn 8k stars trên github. Được recommend bởi hầu hết các lập trình viên.

Tuy nhiên, đó chưa phải là tất cả, capistrano có 1 nhược điểm mà ta đáng phải cân nhắc: tốc độ thực thi.

Thực sự là mình rất mệt mỏi mỗi lần chờ deploy, với dự án mediums size mình đang làm, mình phải chờ từ 3-5 phút 😮

mina ra đời để đem lại một tương lai tươi sáng hơn.

Về cơ bản, chức năng của 2 thằng là tương đương nhau, nó đều phục vụ tốt mọi nhu cầu của ta hết. Tuy nhiêu có một vài điểm khác biệt về cấu hình thôi.

Để biết rõ hơn về capistranomina, mời bạn đọc 2 bài viết của mình:
Rails auto deployment với capistrano
Rails auto deployment với mina

So găng

Để thực hiện việc so sánh, mình sẽ tiến hành tạo 2 rails app rỗng, và deploy lên 2 con EC2 server (server có thể coi như tương đương).

Vòng 1: deploy lần đầu

Capistrano

Trình tự cấu hình
– Thêm 2 gem capistranocapistrano-rails vào Gemfile
– Chạy cap install
– Cấu hình ở config/deploy.rb, Capfileconfig/deploy/production.rb
– Chạy cap production deploy

Capistrano không có report tổng thời gian deploy (ngu gì mà nó làm, nó chạy chậm òm mà :D), nhưng mình đo thì mất khoảng 180s cho lần deploy đầu tiên.
OK, giờ xem thử Mina thế nào

Mina

Ngay trang chủ của mina họ nói Really fast deployer and server automation tool. Đọc là thấy sướng rồi đúng không 😛

Trình tự cấu hình
– Thêm gem mina vào Gemfile
– Chạy lệnh mina init
– Chỉnh sửa file config/deploy.rb
– Chạy lệnh mina setup
– Chạy lệnh mina deploy

Thằng này thì có report thời gian deploy, 85s, ấn tượng đấy chứ, giảm hơn 1 nửa so với cap.

OK, vậy những lần deploy sau thì thế nào.

Vòng 2: những lần deploy sau

Lần đầu với lần sau thì có gì khác?

Khác nhiều đấy.

Lần đầu deploy thì nó sẽ phải chạy bundle để tải các gem về, chạy assets:precompile để compile các file hỗ trợ, rồi thì migrate database.

Còn những lần sau, nó không phải chạy assets:precompile nữa (nếu mình không thêm file vào thư mục assets), bundler thì chỉ install những gem mới thôi, database thì cũng chỉ có những thay đổi nhỏ nhỏ, không đáng kể gì so với lần đầu.

Kết quả:
1

55 vs 9. Mina nhanh hơn hơn 6 lần, ấn tượng chứ?

Đó là thử nghiệm cho app nhỏ nhỏ, vậy còn app lớn, bạn có thể hình dung ra được sẽ tiết kiệm được bao nhiêu thời gian chứ?

Deploy app lớn

Mình tìm được 1 report về 1 dự án với mã nguồn nặng 107BM. Wow!!!

Và dây là kết quả:
Screen Shot 2016-06-16 at 23.15.37
Nhanh hơn khoảng 30 lần ở lần deploy thứ 2.

Vậy điều gì khiến mina nhanh đến chóng mặt như vậy?

Khi chạy 1 lệnh, capistrano sẽ mở 1 ssh session, việc này rất tốn thời gian cho mở kết nối, đóng kết nối, blah blah bleh.

Mina thì ngược lại, nó gom hết tất cả các lệnh đó vào một bash script, upload script đó lên và chạy, tức là chỉ dùng đúng 1 ssh session duy nhất 🙂

Ngoài vấn đề tốc độ ra, còn nhiều vấn đề khác ta cần đưa lên bàn cân.

Deloy với nhiều môi trường khác nhau

Cả 2 đều hỗ trợ deploy lên nhiều môi trường khác nhau hết, nhưng việc cấu hình và chạy lệnh thì có khác chút.

Capistrano

Native supported.
Bạn chỉ việc tạo các file tương ứng trong thư mục config/deploy/, sau đó chạy lệnh:

Việc này có nhược điểm là nếu chỉ cần deploy cho 1 môi trường, bạn cũng phải cấu hình ở 3 file: Capfile, deploy.rbproduction.rb

Mina

Mina thì deploy 1 môi trường lại đơn giản hơn, mặc định môi trường nó sẽ là production, bạn chỉ phải cấu hình mỗi 1 file deploy.rb là xong.

Nhưng nhiều môi trường thì sao?

Thì nó lộ ra nhược điểm, bạn sẽ phải tạo thêm các file cho các môi trường, sau đó chạy lệnh:

Hoặc là tạo 1 file config, sau đó load nó lên, và viết 1 custom script để cấu hình cho tất cả các môi trường trong deploy.rb, nói chung là nhiêu khê hơn Capistrano 1 tẹo 😛

Deploy lên nhiều server khác nhau

Capistrano

Một lần nữa, native supported.
Bạn chỉ việc khai báo nhiều server bằng cách gọi hàm server nhiều lần trong file config là xong.

Mina

Mina thì khổ hơn 1 chút, mình lại phải tạo nhiều file config, sau đó tạo task để chạy các config đó, đồng thời trong lúc deploy thì gọi task đó ra.

Cách đánh phiên bản cho các release

Capistrano

Đánh theo timestamp, mình thích điều này, vì nó sẽ giúp mình biết được thời gian deploy của các bản release đó.

Mina

Đánh theo số đếm: 1, 2, 3. Cách này được cái là đơn giản, và biết là mình deploy bao nhiêu lần tất cả rồi 😛

Rollback

2 thằng đều native supported hết.

Support ngôn ngữ khác

Cả 2 thằng đều có cả, ít nhất là với PHP.

Vậy chọn thằng nào?

Nếu bạn không quan tâm đến tốc độ deploy, việc phải cấu hình tới 3 file mới deploy được, bạn muốn một sự đảm bảo chắc chắn vì nhiều người tin dùng, hãy chọn capistrano như hầu hết số đông.

Nếu bạn muốn việc deploy được nhanh chóng mà vẫn đảm bảo sự ổn định, cấu hình để deploy 1 server với chỉ 1 file, chịu khó custom 1 chút để deploy đa server, đa môi trường thì mina là sự lựa chọn hợp lý.

Cá nhân mình, nhất cự ly, nhì tốc độ, cự ly thì như nhau rồi, nên mình thích mina hơn, và sẽ dùng mina từ nay trở đi. Còn bạn?

Nguồn hình ảnh và tư liệu bài viết

Lập trình và hơn thế nữa

Spread the love
  • 1
  •  
  •  
  •  
  •  
    1
    Share

Leave a Reply

Be the First to Comment!

avatar
  Subscribe  
Notify of