RPG29
Đã tốn tiền
Thấy nhiều bác đang làm việc với Microservices và Cloud Native nên em lập topic này để chia sẻ kinh nghiệm và có chỗ cho mọi người chém.
Microservices và Cloud Native là chủ đề rất rộng nên em sẽ từ từ chia nhỏ nó ra thành từng mục cho mọi người dễ follow.
Những cái em chia sẻ hầu hết là kinh nghiệm cá nhân khi triển khai và những gì em nghiên cứu được nên sẽ có đúng có sai, các bác cứ gạch nhiệt tình.
Về ngôn ngữ lập trình thì trước giờ em từng làm việc với Java, Python, PHP và mới đây là Go cho nên em sẽ trả lời cụ thể nếu liên quan còn với những ngôn ngữ khác thì em chỉ có thể tư vấn giải pháp chung chung.

Giới thiệu sơ qua với các bác về kinh nghiệm làm việc với Microservices và sau này là Cloud Native của em.
Em bắt đầu nghiên cứu xây dựng hệ thống lớn và scalability từ khoảng cuối năm 2012, thời điểm đó ở VN vẫn chưa thấy có ai nhắc tới từ Microservices. Thời điểm đó các tài liệu về xây dựng hệ thống, vận hành, scale... không nhiều và hầu hết em đọc là từ http://highscalability.com. Thằng này nó đưa đẩy dẫn lối cho em từ lúc đó, đam mê nghiên cứu kiến trúc hệ thống.
Khoảng đầu 2013 thì em đi làm chính thức ở một dự án mà bây giờ là một cty thương mại điện tử top của VN. Lần đầu tiên mới được tiếp xúc với các quy trình phát triển, triển khai, vận hành, scale, system... trong thực tế. Sau đó thì em nhảy lóc cóc mấy công ty cho đến khi bắt đầu tham gia một dự án mà em là người trực tiếp thiết kế vận hành nó.
Khởi đầu thì hệ thống em triển khai nó viết bằng PHP 5.6, MySQL 5.6. Nó là một cục monolithic to bự viết bằng Symfony 2.x, chạy trên nền PHP-FPM, Nginx, CentOS 6.x từ khoảng giữa năm 2014.
Hồi mới start cũng chỉ mang tính chất prototype nên mọi thứ không được chú trọng thiết kế cho lắm, miễn sao release nhanh ra chạy lấy feedback là được rồi.
Hệ thống chạy được vài năm cho đến khoảng năm 2018 thì biz model tương đối ổn định. Biz model mở rộng và phát sinh một số nhu cầu đặc biệt kèm theo đó là code base 4 năm tuổi viết từ cái hồi còn prototype nên việc maintenance rất cực khổ nên anh em quyết định đập nhỏ và migrate dần từng phần sang kiến trúc mới.
1. Môi trường triển khai microservices
Hiện nay cứ nói đến triển khai microservices thì mọi người mặc định nghĩ đến Docker. Thực tế thì Docker chả liên quan gì microservices nhưng mà Docker là công cụ tốt nhất hiện nay giúp cho việc triển khai microservices được dễ dàng.
Trước kia khi làm việc với PHP thì chủ yếu em deploy bằng Capistrano - cái này giờ chắc ít người biết, mấy bác làm Ruby hồi xưa chắc biết thằng này, nó kiểu giống như Ansible hay Fabric.
Em làm việc với Docker từ khá sớm khoảng năm 2014, hồi đó hệ sinh thái Docker nói riêng và container nói chung rất ít công cụ. Chuyển sang sử dụng Docker là một trong những bước nhảy vọt lớn nhất trong quá trình làm việc cho đến lúc đó. Hồi đó triển khai Docker trên production thật sự khá là cực vì không có nhiều đồ chơi như bây giờ. Em cũng có dùng qua Rancher nhưng thấy không ổn nên thôi.
Từ lúc sử dụng Docker thì học thêm được các phương pháp triển khai ứng dụng hiện đại https://12factor.net/
Thực ra thì ngoài Docker cũng có một số thằng khác:
2. Công cụ quản lý container
Chỉ với Docker thì bạn vẫn có thể triển khai ở quy mô nhiều node nhưng khi số lượng node tăng lên hoặc cần tự động hóa thì phải cần thêm công cụ quản lý, những công cụ này gọi là Container Orchestrator.
Có nhiều công cụ như K8s, Nomad, Mesos... Phổ biến nhất hiện nay là K8s nhưng mình chọn Nomad của HashiCorp vì đơn giản, dễ dùng, triển khai trong vài bước cơ bản.
// TODO
Microservices và Cloud Native là chủ đề rất rộng nên em sẽ từ từ chia nhỏ nó ra thành từng mục cho mọi người dễ follow.
Những cái em chia sẻ hầu hết là kinh nghiệm cá nhân khi triển khai và những gì em nghiên cứu được nên sẽ có đúng có sai, các bác cứ gạch nhiệt tình.
Về ngôn ngữ lập trình thì trước giờ em từng làm việc với Java, Python, PHP và mới đây là Go cho nên em sẽ trả lời cụ thể nếu liên quan còn với những ngôn ngữ khác thì em chỉ có thể tư vấn giải pháp chung chung.


Giới thiệu sơ qua với các bác về kinh nghiệm làm việc với Microservices và sau này là Cloud Native của em.
Em bắt đầu nghiên cứu xây dựng hệ thống lớn và scalability từ khoảng cuối năm 2012, thời điểm đó ở VN vẫn chưa thấy có ai nhắc tới từ Microservices. Thời điểm đó các tài liệu về xây dựng hệ thống, vận hành, scale... không nhiều và hầu hết em đọc là từ http://highscalability.com. Thằng này nó đưa đẩy dẫn lối cho em từ lúc đó, đam mê nghiên cứu kiến trúc hệ thống.

Khoảng đầu 2013 thì em đi làm chính thức ở một dự án mà bây giờ là một cty thương mại điện tử top của VN. Lần đầu tiên mới được tiếp xúc với các quy trình phát triển, triển khai, vận hành, scale, system... trong thực tế. Sau đó thì em nhảy lóc cóc mấy công ty cho đến khi bắt đầu tham gia một dự án mà em là người trực tiếp thiết kế vận hành nó.
Khởi đầu thì hệ thống em triển khai nó viết bằng PHP 5.6, MySQL 5.6. Nó là một cục monolithic to bự viết bằng Symfony 2.x, chạy trên nền PHP-FPM, Nginx, CentOS 6.x từ khoảng giữa năm 2014.
Hồi mới start cũng chỉ mang tính chất prototype nên mọi thứ không được chú trọng thiết kế cho lắm, miễn sao release nhanh ra chạy lấy feedback là được rồi.
Hệ thống chạy được vài năm cho đến khoảng năm 2018 thì biz model tương đối ổn định. Biz model mở rộng và phát sinh một số nhu cầu đặc biệt kèm theo đó là code base 4 năm tuổi viết từ cái hồi còn prototype nên việc maintenance rất cực khổ nên anh em quyết định đập nhỏ và migrate dần từng phần sang kiến trúc mới.
1. Môi trường triển khai microservices
Hiện nay cứ nói đến triển khai microservices thì mọi người mặc định nghĩ đến Docker. Thực tế thì Docker chả liên quan gì microservices nhưng mà Docker là công cụ tốt nhất hiện nay giúp cho việc triển khai microservices được dễ dàng.
Trước kia khi làm việc với PHP thì chủ yếu em deploy bằng Capistrano - cái này giờ chắc ít người biết, mấy bác làm Ruby hồi xưa chắc biết thằng này, nó kiểu giống như Ansible hay Fabric.
Em làm việc với Docker từ khá sớm khoảng năm 2014, hồi đó hệ sinh thái Docker nói riêng và container nói chung rất ít công cụ. Chuyển sang sử dụng Docker là một trong những bước nhảy vọt lớn nhất trong quá trình làm việc cho đến lúc đó. Hồi đó triển khai Docker trên production thật sự khá là cực vì không có nhiều đồ chơi như bây giờ. Em cũng có dùng qua Rancher nhưng thấy không ổn nên thôi.
Từ lúc sử dụng Docker thì học thêm được các phương pháp triển khai ứng dụng hiện đại https://12factor.net/
Thực ra thì ngoài Docker cũng có một số thằng khác:
- Rkt: thằng này của CoreOS mà chết rồi, không cần quan tâm.
- Podman/Buildah: thằng này mới nổi, có nhiều ưu điểm hơn Docker và đang được Redhat chống lưng nên khá có tiềm năng.
2. Công cụ quản lý container
Chỉ với Docker thì bạn vẫn có thể triển khai ở quy mô nhiều node nhưng khi số lượng node tăng lên hoặc cần tự động hóa thì phải cần thêm công cụ quản lý, những công cụ này gọi là Container Orchestrator.
Có nhiều công cụ như K8s, Nomad, Mesos... Phổ biến nhất hiện nay là K8s nhưng mình chọn Nomad của HashiCorp vì đơn giản, dễ dùng, triển khai trong vài bước cơ bản.
// TODO
Last edited: