+56

Đừng vội chạy theo microservices: Bài học từ thành công của Stack Overflow

Chắc có lẽ anh em đã quá quen thuộc với Stack Overflow - một nền tảng tổng hợp lượng câu hỏi về công nghệ khổng lồ được thành lập từ năm 2008 và nhanh chóng trở thành một trong những cộng đồng trực tuyến lớn nhất và có ảnh hưởng nhất trong lĩnh vực công nghệ thông tin.

Mỗi tháng trung bình Stack Overflow xử lý khoảng 1.3 tỷ lượt truy cập, xử lý đến 260 triệu request mỗi tháng với đỗ trễ trung bình chỉ ở khoảng 18ms.

Stack Overflow chứa rất nhiều chủ đề, mỗi chủ đề là tập hợp vô số câu hỏi, câu trả lời và các thảo luận nối tiếp nhau tạo thành một mạng lưới thông tin dày đặc. Chính sự phong phú và đa dạng này đã biến Stack Overflow thành một ứng dụng cực kỳ đồ sộ và tiêu tốn nhiều tài nguyên.

Chắc hẳn anh em sẽ nghĩ rằng Stack Overflow là một hệ thống microservices với vô số instance trải khắp toàn cầu và sử dụng Kubernetes để triển khai trên quy mô lớn. Nhưng thật bất ngờ Stackoverflow vẫn là một hệ thống Monolith bất chấp xu hướng microservices đang thịnh hành

Cùng Sydexa.com tìm hiểu xem làm thế nào một hệ thống Monoliths có thể chịu tải cho hàng triệu người dùng như vậy nha

Bạn cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha. Và chúng mình có động lực ra những bài viết thú vị hơn nữa 😄😄😄


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


Tổng quan hệ thống của Stack Overflow:

image.png

Hệ thống của họ gồm các thành phần chính:

  • 9 máy chủ Web, phân bổ trên 3 trung tâm dữ liệu
  • 1 Máy chủ Service Tier với một máy chủ dự phòng
  • 1 máy chủ HAProxy với một máy chủ dự phòng
  • 1 máy chủ Redis với một máy chủ phụ (slave)
  • 1 cơ sở dữ liệu SQL với một máy chủ dự phòng
  • 3 máy chủ Elasticsearch

Toàn bộ công nghệ mà Stack Overflow sử dụng bao gồm:

  • Ngôn ngữ: C#
  • Framework: ASP.NET MVC
  • ORM: Dapper
  • Bộ nhớ đệm: StackExchange Redis
  • Profiling: MiniProfiler
  • Xử lý JSON: Jil JSON Deserializer
  • Ghi log: Exceptional logger for SQL
  • Tối ưu hóa CIL: Sigil (khi C# không đủ nhanh)
  • Máy chủ WebSocket: NetGain
  • Giám sát:
    • Opserver (tổng hợp dữ liệu từ Orion, Bosun, hoặc WMI)
    • Bosun (giám sát backend, viết bằng Go)

1. Đường đến Stack Overflow

Để giúp người dùng có thể nhanh chóng tìm thấy ip và truy cập Stack Overflow, Stackoverflow sử dụng DNS của CloudFlare để tối ưu hóa thời gian phân giải tên miền, do CloudFlare có máy chủ ở khắp nơi trên thế giới.

Stack Overflow cũng xây dựng các máy chủ DNS của riêng họ được giữ ở chế độ dự phòng, không được bật lên thường xuyên. Chúng chỉ được kích hoạt trong trường hợp xảy ra sự cố với dịch vụ DNS (CloudFlare) giúp đảm vào hệ thống vẫn ổn khi DNS bên ngoài có sự cố

image.png

Request của người dùng sẽ đi qua một trong bốn nhà cung cấp dịch vụ internet (ISP) mà Stack Overflow sử dụng (Level 3, Zayo, Cogent, and Lightower in New York). Sau đó, request được chuyển đến một trong bốn bộ định tuyến (router) đặc biệt có nhiệm vụ điều phối lưu lượng truy cập. Các bộ định tuyến này hoạt động theo cặp, mỗi cặp đảm bảo dự phòng cho nhau để phòng trường hợp một bộ định tuyến gặp sự cố.

Stack Overflow sử dụng VLAN để tách biệt lưu lượng truy cập, tăng cường bảo mật và hiệu quả xử lý. Sau đó, các yêu cầu được chuyển đến bộ cân bằng tải - nơi phân phối request đến các máy chủ xử lý.

2. Load Balancing sử dụng HAProxy

HAProxy"nhân viên điều phối giao thông" của Stack Overflow, đảm nhận nhiệm vụ quan trọng trong việc cân bằng tải giữa các máy chủ.

Với HAProxy, lưu lượng truy cập khổng lồ đổ về Stack Overflow được phân phối đều đặn và hiệu quả, giúp đảm bảo trải nghiệm mượt mà cho người dùng.

image.png

Khi một máy chủ gặp sự cố, HAProxy sẽ nhanh chóng phát hiện và chuyển hướng lưu lượng truy cập sang các máy chủ khác, đảm bảo tính liên tục của dịch vụ.

HAProxy là một phần không thể thiếu trong kiến trúc hệ thống của Stack Overflow, giúp nền tảng này luôn hoạt động ổn định và đáng tin cậy.

3. Web servers

Stack Overflow đảm bảo tính khả dụng cao bằng cách phân phối 9 máy chủ của mình trên 3 trung tâm dữ liệu khác nhau. Điều này giúp giảm thiểu thời gian chết do lỗi phần cứng và tối ưu hóa độ trễ cho người dùng.

Với chỉ 9 máy chủ IIS, mỗi chiếc trang bị 64GB RAM và chạy .NET, Stack Overflow xử lý đỉnh điểm 450 request/s trên mỗi máy chủ, mà chỉ sử dụng 12% CPU.

image.png

Bí quyết của Stack Overflow nằm ở việc tối ưu hóa code, cố gắng tránh tạo ra các đối tượng (Objects) không cần thiết, để giảm thiểu đối tượng rác cần thu gom ( garbage object). Điều này giúp giảm áp lực lên bộ nhớ của các máy chủ web, đảm bảo hệ thống luôn hoạt động trơn tru và không bị gián đoạn bởi quá trình thu gom rác (garbage collections)

4. Service Tier

Tầng dịch vụ (Service Tier) là "hậu phương" vững chắc của Stack Overflow, nó hỗ trợ các hoạt động của tầng Web server trên bằng việc xử lý các tác vụ nặng và quan trọng như:

  • Stack Server: Công cụ gắn thẻ chịu trách nhiệm xử lý và phân loại các thẻ trên Stack Overflow, giúp người dùng dễ dàng tìm kiếm thông tin liên quan.
  • Providence API: Dịch vụ dựa trên IIS, cung cấp các API cho các ứng dụng khác truy xuất dữ liệu từ Stack Overflow.

image.png

Không chỉ dừng lại ở đó, tầng dịch vụ còn đảm nhiệm các tác vụ nặng nhọc khác như tải dữ liệu bài đăng và thẻ từ cơ sở dữ liệu, lập chỉ mục đàn hồi (Elastic Indexing), v.v. Nhờ sự hỗ trợ của tầng dịch vụ, Stack Overflow có thể hoạt động mượt mà, hiệu quả và đáng tin cậy, mang đến trải nghiệm tốt nhất cho người dùng.

5. Cơ sở dữ liệu:

Stack Overflow sử dụng SQL Server làm cơ sở dữ liệu chính duy nhất. Tất cả dữ liệu trong Elastic và Redis đều được lấy từ SQL Server. Hệ thống cơ sở dữ liệu của họ gồm 2 cụm SQL Server với tính năng AlwaysOn Availability Groups.

Mỗi cụm này có 1 máy chủ chính (master) gánh gần như toàn bộ tải và 1 bản sao (replica) ở New York. Ngoài ra, còn có 1 bản sao ở Colorado (trung tâm dữ liệu dự phòng). Tất cả các bản sao đều hoạt động bất đồng bộ.

image.png

Thiết kế này giúp Stack Overflow đảm bảo rằng dữ liệu của họ luôn an toàn, đáng tin cậy và sẵn sàng phục vụ người dùng, ngay cả trong trường hợp xảy ra sự cố phần cứng hoặc lỗi hệ thống.

Stack Overflow còn sử dụng Dapper, một Micro-ORM mã nguồn mở, cho việc phát triển mới, và hạn chế tối đa các stored procedure trong cơ sở dữ liệu.

6. Bộ nhớ đệm với Redis

Tại Stack Overflow, Redis đóng vai trò là một bộ nhớ đệm giúp cung cấp dữ liệu nhanh chóng tránh việc phải truy cập trực tiếp vào cơ sở dữ liệu. Redis được sử dụng để lưu trữ các câu hỏi, câu trả lời, các câu hỏi liên quan (được gắn thẻ bởi công cụ tag), và những thông tin tương tự.

Redis tại Stack Overflow gồm một máy chủ chính (main server) với dung lượng RAM 256GBmột bản sao (replica) để đảm bảo tính dự phòng. Máy chủ chính có khả năng xử lý lên đến 60.000 tác vụ mỗi giây (ops/sec) chỉ với mức sử dụng CPU 2%.

image.png

Trong trường hợp máy chủ chính gặp sự cố, bản sao (replica) sẽ tự động tiếp quản và đảm nhận vai trò của máy chủ chính, giúp hệ thống đảm bảo tính liên tục

7. ElasticSearch Engine - công cụ tìm kiếm hiệu quả

Elasticsearch là "trợ thủ đắc lực" của Stack Overflow trong việc tìm kiếm và phân tích dữ liệu. Với khả năng mở rộng, linh hoạt và tốc độ xử lý vượt trội, Elasticsearch giúp Stack Overflow mang đến trải nghiệm tìm kiếm nhanh chóng và chính xác cho người dùng.

Một cụm Elasticsearch bao gồm 3 nút (node). Mỗi nút là một máy chủ độc lập chứa một phần dữ liệu của cụm. Mỗi nút trong cụm Elasticsearch của Stack Overflow được trang bị ổ cứng SSD, 192GB RAM và kết nối mạng kép 10Gbps, mạnh mẽ hơn so với cấu hình thông thường.

Cấu hình này đảm bảo tính sẵn sàng cao và khả năng chịu lỗi tốt. Nếu một nút gặp sự cố, hai nút còn lại vẫn có thể tiếp tục hoạt động.

image.png

Stack Overflow chọn Elasticsearch thay vì SQL full-text search vì khả năng mở rộng tốt hơn và chi phí thấp hơn. So với Solr, Elasticsearch cho phép tìm kiếm trên nhiều chỉ mục (index) cùng lúc, một tính năng cần thiết cho Stack Overflow

Qua câu chuyện của Stack Overflow, ta có thể thấy rằng microservices không phải là yếu tố bắt buộc để có thể phục vụ hàng triệu người dùng, mà chìa khóa nằm ở việc quy hoạch và tối ưu hóa hệ thống một cách bài bản: thiết kế đơn giản nhưng hiệu quả, phân bổ tài nguyên dư thừa, chọn công nghệ phù hợp và tối ưu mã nguồn. Điều này chứng minh rằng hệ thống monolith vẫn có thể phục vụ hàng triệu người dùng trên toàn thế giới. (Công nghệ không phế, chúng ta phế 😂😂😂)

Nếu thấy bài viết này hay thì cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo 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


Bạn có thể đọc thêm:

Chia sẻ từ nhân viên Stack Overflow: https://nickcraver.com/blog/2016/02/17/stack-overflow-the-architecture-2016-edition/

Chia sẻ từ giám đốc Stack Overflow: https://www.datacenterdynamics.com/en/news/stack-overflow-still-on-prem-runs-qa-platform-off-just-nine-servers/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí