- Wave là công ty trị giá $1.7B (2,3 nghìn tỷ won) với 70 kỹ sư (cung cấp dịch vụ ngân hàng di động cho châu Phi)
- Sử dụng kiến trúc ứng dụng CRUD tiêu chuẩn: một Python monolith dựa trên Postgres
- Bắt đầu từ một kiến trúc đơn giản và giải quyết vấn đề trong khi giảm thiểu độ phức tạp, nhờ đó các kỹ sư có thể tập trung vào việc tạo ra giá trị cho người dùng
- Stackoverflow đã phát triển thành công bằng cách mở rộng một monolith đến mức được mua lại với giá 1,8 tỷ USD
Dù kiến trúc đơn giản hiệu quả, phần lớn truyền thông lại yêu thích kiến trúc phức tạp
- Ở các hội nghị công nghệ có rất nhiều bài nói về kiến trúc phức tạp dựa trên microservices, nhưng hầu như không có bài nào về monolith đơn giản
- Nhiều công ty dù chỉ có ứng dụng quy mô nhỏ vẫn bắt chước công nghệ phức tạp, rồi nhờ đó được chú ý tại các hội nghị và trên HN
- Kiến trúc chúng tôi dùng đơn giản đến mức thậm chí không cần phải vẽ sơ đồ kiến trúc
Cách duy trì sự đơn giản
- Wave dùng Python đồng bộ, nghĩa là tiến trình máy chủ sẽ bị chặn trong khi chờ I/O
- Họ từng thử các framework bất đồng bộ như Eventlet, nhưng có quá nhiều lỗi nên chi phí đó không đáng để đánh đổi lấy nỗi đau vận hành
- Thay vì tăng thêm độ phức tạp, các tác vụ cần thời gian chạy dài được tách ra xử lý qua hàng đợi
- Để tuân thủ quy định về lưu trú dữ liệu, ở một số quốc gia họ phải vận hành trung tâm dữ liệu on-premise
- Senegal/Côte d’Ivoire dùng cloud, nhưng Uganda và các quốc gia khác cần on-premise vì quy định
- Trong những trường hợp như vậy, kiến trúc đơn giản dễ xử lý hơn rất nhiều so với kiến trúc phức tạp
Tự xây thay vì mua
- Vì là đội ngũ ít người nên ban đầu họ ưu tiên mua phần mềm, nhưng khi không thể xử lý các lỗi nghiêm trọng thì họ phát triển công cụ riêng
- Tự xây công cụ là một dạng phức tạp mà họ không muốn gánh, nhưng ở một số nhóm sản phẩm, ngay cả sau khi khảo sát rất rộng họ vẫn không tìm được nhà cung cấp nào có sản phẩm phù hợp
- Đôi khi, ngoài năng lực cốt lõi, vẫn cần tự phát triển công cụ và duy trì chuyên môn nội bộ
Những lựa chọn đang được cân nhắc lại
- Họ đang cân nhắc lại các lựa chọn công nghệ như RabbitMQ, Celery, SQLAlchemy và Python, vì chúng làm tăng độ phức tạp hoặc gánh nặng bảo trì
- Nếu bắt đầu một codebase mới, họ sẽ cân nhắc cẩn thận các lựa chọn công nghệ này
Những lựa chọn họ hài lòng
- Họ hài lòng với các lựa chọn như GraphQL, giao thức truyền tải tùy chỉnh và Kubernetes
- GraphQL có các ưu điểm như tự tài liệu hóa, sinh mã và trình khám phá tương tác GraphiQL
- Họ cho rằng khi dùng GraphQL, ưu điểm lớn hơn nhược điểm
- Ưu điểm
- Tự tài liệu hóa cho kiểu dữ liệu trả về chính xác
- Nhờ sinh mã cho kiểu trả về chính xác, phía client an toàn hơn
- Tăng năng suất nhờ trình khám phá tương tác GraphiQL
- Nhiều ứng dụng khác nhau (ứng dụng người dùng, ứng dụng hỗ trợ, ứng dụng đại lý Wave, v.v.) có thể dùng chung phần lớn một API, giúp giảm độ phức tạp
- Với ngôn ngữ truy vấn có thể cấu hình, client có thể lấy đúng dữ liệu cần thiết chỉ trong một vòng packet round-trip mà không cần xây nhiều endpoint chuyên biệt
- Loại bỏ việc tranh luận vụn vặt về điều gì được xem là RESTful API
- Nhược điểm
- Các thư viện GraphQL không thực sự tốt vào thời điểm họ áp dụng GraphQL
- Cách mã hóa GQL mặc định bị lặp lại, và vì nhiều khách hàng dùng băng thông thấp nên họ rất quan tâm đến giới hạn kích thước
- Kubernetes được dùng để đáp ứng yêu cầu vận hành trung tâm dữ liệu theo từng quốc gia
Kết luận
- Bằng cách giữ kiến trúc ứng dụng đơn giản nhất có thể, họ có thể dành ngân sách cho độ phức tạp (và nhân lực) vào những nơi mà nó thực sự giúp ích cho doanh nghiệp
- Chính nhờ tư duy làm mọi thứ đơn giản nhất có thể trừ khi có lý do rất mạnh để tăng thêm độ phức tạp, họ đã xây dựng được một doanh nghiệp khá lớn với không nhiều kỹ sư, dù đang vận hành mảng tài chính châu Phi vốn thường được xem là một lĩnh vực khó
9 bình luận
Có vẻ như phải là "tự xây thay vì mua" chứ không phải "mua thay vì tự xây".
À, tôi định nhấn mạnh điều đó nhưng lại khiến tiêu đề trở nên kỳ quặc. Tôi đã sửa lại rồi. Cảm ơn bạn.
Có phải xu hướng thay đổi theo chu kỳ kinh tế không? Bất kể xu hướng ra sao, bắt đầu với monolith sẽ có lợi hơn về giảm chi phí cố định và bảo trì.
Kiến trúc dễ hiểu thì cũng dễ bảo trì hơn.
Theo quan điểm của tôi, với bất kỳ dịch vụ nào thì bắt đầu bằng kiến trúc nguyên khối vẫn có vẻ tốt hơn. Nếu ngay từ đầu đã chọn MSA rồi lao vào thì chỉ tổ lãng phí tiền thôi.
"Khi độ phức tạp tăng lên, chi phí (tiền bạc, con người, thời gian...) cũng tăng theo"
"Đừng cố giải quyết vấn đề có thể xử lý bằng kiến trúc đơn giản bằng một kiến trúc phức tạp."
Ý kiến trên Hacker News
Lời khuyên kỹ thuật về microservices
Các buổi nói chuyện về microservices
Thiên kiến nhận thức và sự đơn giản
Over-engineering và thiếu kinh nghiệm
Công ty coi trọng cân bằng công việc và cuộc sống
Trải nghiệm cá nhân với Dan Luu
Tầm quan trọng của kiến trúc đơn giản
Kiến trúc và cấu trúc xã hội của đội ngũ kỹ thuật
Sự ưu tiên cho kiến trúc đơn giản
Có thể cho tôi xin liên kết tới bài thuyết trình nói về các mẹo của David Schmitz về những thất bại của microservices được không.
Đây là https://www.youtube.com/watch?v=r8mtXJh3hzM