Hành Trình Xây Hệ Thống Đạt Độ Chịu Tải Cho 10 Triệu Người Dùng Trên AWS
Trong bài viết này Sydexa sẽ mô tả cách mở rộng ứng dụng đến độ chịu tải hàng triệu người dùng trên Cloud. Hãy chia sẻ bài viết này với những bạn bè đang muốn học về thiết kế hệ thống chịu tải cao bạn nha 😍
Chúng mình có tạo Group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha 😄😄😄
Các bạn tham gia để gây dựng cộng đồng System Design Việt Nam thật lớn mạnh nhé 😍😍😍
Cộng Đồng System Design Việt Nam: https://www.facebook.com/groups/sydexa
Kênh TikTok: https://www.tiktok.com/@sydexa.com
Ngày xửa ngày xưa, có 2 kỹ sư phần mềm tên là Nam và Đức.
Họ làm việc cho một công ty công nghệ có tên là F.
Mặc dù hai anh chàng này đều là những kỹ sư sáng tạo, nhưng họ chưa bao giờ được thăng chức.
Vì vậy, họ cảm thấy buồn bã và nản lòng.
Cho đến một ngày, họ có một ý tưởng tuyệt vời để xây dựng một startup có tên là Sydexa.
Tốc độ phát triển của họ là điều khiến ai cũng kinh ngạc.
Tuy nhiên, cả hai đều muốn giữ nó đơn giản. Vì vậy, họ triển khai ứng dụng trên AWS (Amazon Web Services).
Hành trình mở rộng ứng dụng của Nam và Đức:
Dưới đây là hành trình về khả năng mở rộng từ 0 đến 10 triệu người dùng của hai anh chàng này:
1. Trước khi sản phẩm ra mắt
Phiên bản MVP (Minimum Viable Product) của họ chưa sẵn sàng cho môi trường Product.
MVP là một phiên bản mà chỉ có những chức năng tối thiểu nhất cần có của sản phẩm
Vì vậy, họ tạo ra một trang web (launch page) gồm các trang tĩnh để giảm thiểu các chi phí tính toán trên AWS Amplify hosting
Launch Page trên Hosting tĩnh
Họ cũng thêm một backend đơn giản dùng dịch vụ AWS Lambda.
AWS Lambda là một nền tảng không có máy chủ. Nó cho phép họ chạy mã mà không cần quản lý máy chủ
2. Ra mắt thị trường
Họ phát hành phiên bản MVP ra thị trường
Nhưng họ chỉ có một số người dùng vô cùng ít ỏi 😄
Vì vậy, họ chỉ sử dụng một EC2 instance (một máy chủ ảo từ AWS) duy nhất để chạy toàn các thành phần của trang web: cơ sở dữ liệu và backend.
Amazon Elastic Compute Cloud (EC2) là một máy chủ ảo.
Họ dùng DNS của Amazon Route 53 và trỏ một Elastic IP đến máy chủ
Một elastic IP là một IP tĩnh, có tính chất vĩnh viễn giúp cho có thể duy trì một địa chỉ IP không thay đổi cho máy chủ ảo của mình, giúp dễ dàng quản lý và duy trì liên kết với các dịch vụ khác trong hạ tầng AWS.
Hệ thống với chỉ một instance Ec2 cho tất cả các thành phần
Tuy nhiên, bỗng một ngày người dùng càng ngày càng đông đến mức tài nguyên tính toán thì không còn đủ nữa, server không còn bộ nhớ để lưu thêm người dùng mới.
Vì vậy, Lúc này, cách đơn giản mà họ làm là đổi sang một máy chủ khác mạnh hơn, nhiều RAM và CPU hơn bằng cách chọn cách tăng kích thước của Instance Ec2. Cách này người ta gọi là mở rộng theo chiều dọc (Vertical Scaling).
Vertical Scaling: Việc tăng kích thước của một máy chủ duy nhất để cải thiện hiệu suất
Một loại kích cỡ máy chủ ảo được gọi là Instance Type. Ví dụ, các loại instance như nano và micro cung cấp các thông số khác nhau về CPU, bộ nhớ và lưu trữ. Với AWS, đội ngũ phát triển sản phẩm có thể dễ dàng nâng cấp máy chủ, bẳng cách trả nhiều tiền hơn để sử dụng các máy chủ khỏe hơn.
Tuy nhiên, có rủi ro và cũng là yếu điểm của việc mở rộng theo chiều dọc (Vertical Scaling) đó là nó chỉ có thể mở rộng đến một giới hạn nhất định (do độ lớn của 1 instance sẽ chỉ có giới hạn)
3. 100 người dùng đầu
Bỗng một ngày, Instance trên Ec2 của họ đã bị bộ nhớ đầy.
Vì vậy Nam đề xuất việc chuyển Backend và Database của họ vào hai Ec2 Instance riêng biệt.
Và sẽ sử dụng một Instance lớn hơn cho Database
Họ đã chọn sử dụng một SQL Database để có thể sẵn sàng cho 10 triệu người dùng trong tương lai. Cũng như việc tận dụng sự hỗ trợ mạnh mẽ từ cộng đồng và các công cụ quản trị cơ sở dữ liệu hữu ích 🤝
Và sản phẩm của họ lại trở lại ổn định hơn 😘
4. Số lượng người dùng đã lên vài nghìn 🤓
Cho đến một ngày đẹp trời, họ nhận được một cuộc điện thoại
Có một đợt mất điện đã xảy ra ở nơi mà máy chủ của họ được đặt
Vì vậy, họ đã tạo thêm một máy chủ ở một khu vực khác để phòng tránh những tình huống như vậy
Và Đức đã đề xuất sử dụng mô hình database có dạng leader-follower bao gồm hai database được đặt ở hai nơi khác nhau.
Hai database sẽ được sử dụng với hai mục đích khác nhau, database leader sẽ xử lý các nhiệm vụ ghi dữ liệu, còn database follower sẽ xử lý các nhiệm vụ đọc dữ liệu ra.
Họ cũng cài đặt cơ chế Automatic Failover để cả hai server ở hai nơi đều có thể thực hiện được cả 2 tác vụ phòng tránh việc một server có sự cố xảy ra
5. 10 nghìn người
Và đến một ngày,
Số lượng người dùng tăng cao, họ lại không đủ bộ nhớ nữa, khiến cho cả hệ thống bị quá tải.
Họ muốn scale hệ thống lớn lên để đáp ứng được lượng người dùng lớn hơn.
Và cả hai đã quyết định triển khai Backend stateless, với cách này Backend sẽ không lưu trữ dữ liệu session, thay vào đó tất cả sẽ được lưu hết tại ElasticCache
Việc đọc thông tin từ database ngày càng trở thành một nơi tắc nghẽn khi với số lượng dữ liệu lớn đang có
Họ đã lưu trữ những dữ liệu được đọc ra thường xuyên trong ElasticCache và không cần phải truy xuất lại database mỗi request
ElasticCache là một dịch vụ quản lý Memcached hoặc Redis
Họ cũng đã quyết định chuyển các nội dung tĩnh như các file css, các ảnh, các file javascript sang Amazon S3 và CloudFront để giảm tải cho máy chủ
"Amazon S3 là một hệ thống lưu trữ phù hợp lưu trữ các file. Trong khi đó, CloudFront là một Mạng Phân Phối Nội Dung (CDN)."
Ở trên là mô hình mà họ đã sử dụng
Nói thêm về CDN, nó sẽ phân phối dữ liệu ở nhiều nơi ở nhiều vị trí địa lý khác nhau trên các máy chủ CDN, do đó khi với một request gửi đến, nội dung trang web được gửi đến từ các máy chủ CDN gần nhất với vị trí của người dùng theo khu vực địa lý để quá trình chuyển đến máy tính của họ được nhanh hơn nhiều
Họ cũng quyết định việc mở rộng theo chiều ngang (Horizontal Scale) với việc sử dụng nhiều server hơn và nhiều database follower hơn.
Nhưng vấn đề họ nhận ra là trong những ngày lễ tết,
Số lượng request gửi đến server đạt đỉnh và cao hơn nhiều trung bình những ngày còn lại
Vậy nếu như họ dùng nhiều server để đáp ứng những ngày nhiều người dùng, thì lại lãng phí tài nguyên cho những ngày mà ít người dùng hệ thống
Họ nhờ một anh Tuấn - một kỹ sư ở Shopee tư vấn và đã quyết định chọn CloudWatch để có thể theo dõi và dùng số liệu để sử dụng Autoscaling giúp tự tăng giảm số lượng server tự động tùy thuộc vào sự quá tải của hệ thống
CloudWatch là dịch vụ giám sát và quản lý của Amazon. Nó có thể theo dõi các thông số của mỗi server
6. Nửa triệu người dùng
Với sự tăng trưởng của mình, họ được tập đoàn Viettel đầu tư và rót vốn,
Họ muốn dùng tiền đầu tư để nâng cao chất lượng hệ thống và muốn hệ thống có tính sẵn có đạt 99,99% (99.99% availability)
Nói cách khác, một năm họ không được để thời gian hệ thống chết quá 52 phút
Vì vậy họ nhân bản các máy chủ qua nhiều khu vực địa lý khác nhau, và chuyển việc lưu trữ dữ liệu session qua DynamoDB
DynamoDB là một hệ quản trị cơ sở dữ liệu NoSQL
- Họ bắt đầu việc sử dụng kiến trúc microservices để có thể cho các service, tính năng được sử dụng nhiều được scale lớn hơn và độc lập so với các service khác
- Nam đã tìm tư vấn và quyết định thêm các bộ cân bằng tải (load balancer) giữa từng tầng để mở rộng dễ dàng hơn
- Họ sử dụng AWS CloudFormation để tạo một cái nhìn tổng quát về các tầng trong hệ thống. Điều này sẽ giúp việc vận hành trở lên rõ ràng và nhanh chóng hơn.
CloudFormation là một dịch vụ triển khai cơ sở hạ tầng dưới dạng mã.
Và hệ thống lại ổn định và sẵn sàng cho lượng người dùng lớn hơn.
7. 10 triệu người dùng
Một ngày họ thuê các chuyên gia về database tư vấn,
Và biết được việc ghi trong cơ sở dữ liệu đang bị chậm do xung đột dữ liệu,
Và họ được tư vấn giải pháp: Họ tổng hợp, liên kết cơ sở dữ liệu lại và tạo ra các phân đoạn của nó
Việc chia một cơ sở dữ liệu thành nhiều cơ sở dữ liệu dựa trên lĩnh vực kinh doanh được gọi là Federation. Ví dụ, lưu trữ thông tin về sản phẩm và người dùng trong các cơ sở dữ liệu riêng biệt. Federation cho phép hệ thống mở rộng dễ dàng.
- Tuy nhiên, việc truy vấn dữ liệu chức năng chéo trở nên khó khăn do có quá nhiều cơ sở dữ liệu. \
Việc chia một bộ dữ liệu đơn thành nhiều máy chủ được gọi là Sharding.
Họ sử dụng Sharding để mở rộng theo chiều ngang.
Nhưng điều này làm cho tầng ứng dụng trở nên phức tạp hơn vì dữ liệu cần được kết hợp (join) ở mức ứng dụng (trong xử lý code).
Họ cũng di chuyển dữ liệu không cần kết hợp phức tạp đến một cơ sở dữ liệu dạng NoSQL
- Cuối cùng, họ mở rộng hệ thống qua nhiều khu vực AWS. bởi nó có thể mang lại tính sẵn có cao cho hệ thống và có thể mở rộng hơn nữa dễ dàng về sau Và họ đã rất hạnh phúc khi có một hệ thống phục vụ cho hàng triệu người dùng trên toàn thế giới
Và đó là hành trình mà Sydexa đã kể lại cho các bạn nghe. Hãy theo hành trình này để xây dựng một hệ thống web thật ổn định và chinh phục hàng triệu người dùng nha 😘😘😘😘
Sydexa.com xin hẹn gặp lại các bạn ở các bài viết thú vị hơn nha
Lời nhắn
Chúng mình có tạo Group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha 😄😄😄
Các bạn tham gia để gây dựng cộng đồng System Design Việt Nam thật lớn mạnh nhé 😍😍😍
Cộng Đồng System Design Việt Nam: https://www.facebook.com/groups/sydexa
Kênh TikTok: https://www.tiktok.com/@sydexa.com
All rights reserved