Chào mừng bạn đến với Vimentor!

Hỏi đáp
Đăng ký

Tổng quan lộ trình học python cho kỹ sư backend

Đào Đăng Toàn
Đào Đăng Toàn
4 bài viết — 3 Người theo dõi |
1
0

I. Giới thiệu

 

Tôi đã đưa ra ý tưởng về một lộ trình học python cho kỹ sư backend và kỹ sư tích hợp hệ thống, trong một bài post ở group Python và rất nhiều người đã ủng hộ ý tưởng đó.  Nên tôi quyết định viết loạt bài này. Với mục tiêu là ghi lại được những kiến thức mà tôi đã có, những kinh nghiệm liên quan tới các dự án đã triển khai và quá trình thay đổi của bản thân theo sự thay đổi công nghệ, bởi vì nếu không có sự ghi chép thì có lẽ 2 năm sau nhìn lại tôi sẽ không nhớ trong quá khứ tôi đã làm những gì.

Việc triển khai những hệ thống backend lớn cho một website hay một ứng dụng đã không còn quá khó khăn với công nghệ hiện nay, Trước đây khi một doanh nghiệp muốn triển khai một hệ thống lớn thường phải nhờ các nhân lực từ nước ngoài hay các phần cứng chuyên biệt. Tuy nhiên hiện nay, tùy vào nhu cầu sử dụng mà những phần mềm cũng đã thay thế được khá lớn độ ảnh hưởng của các phần cứng chuyên biệt đó, và do vậy việc triển khai hệ thống đã giảm bớt được sự phức tạp.

 

II. Các vấn đề thường gặp khi thiết kế hệ thống nhiều người dùng

 

Sự phát triển của một ứng dụng luôn luôn đi theo sự phát triển của công ty.  Tôi may mắn đã được làm việc với các công ty khởi nghiệp từ khi mà họ mới bắt đầu xây dựng công ty và các ứng dụng của họ.

Ở các công ty khởi nghiệp thì điều quan trọng nhất là việc nên ý tưởng và biến các ý tưởng đó thành sản phẩm thật nhanh. Việc viết ra các ứng dụng có thể chạy được các tính năng cơ bản thì không quá khó, nhưng khi đã quyết định đưa sản phẩm của mình ra thị trường thì lại là một điều hoàn toàn khác, lúc này bài toán trở lên phức tạp hơn.

Tuy rằng đã có kinh nghiệm trong việc triển khai hệ thống production, nhưng việc triển khai hệ thống lớn phục vụ cho nhiều người dùng tới giờ vẫn là một thách thức thú vị với tôi, vì khi đã thành công trong việc thiết kế hệ thống phục vụ hàng nghìn người dùng  thì tôi lại mong muốn tìm cách để tăng năng lực của hệ thống lên hàng chục, trăm nghìn người dùng cùng lúc (CCU - concurrent users) .

Các câu hỏi tôi thường đặt ra khi thiết kế một hệ thống mới là:

 

1. Làm sao để thiết kế một hệ thống dễ mở rộng, khi lượng người dùng CCU tăng lên thì kiến trúc tổng thể của toàn hệ thống không bị thay đổi?

2. Thời gian mà hệ thống cần phản hồi lại cho người dùng là bao nhiêu?

3. Làm sao để hệ thống luôn luôn online?

4. Làm sao để khắc phục lỗi hệ thống một cách nhanh nhất?

5. Làm sao để backup và đành version những dữ liệu quan trọng?

6. Làm sao để thêm một thành phần vào hoặc xóa một thành phần ra khỏi hệ thống một cách dễ dàng?

7. Làm sao để khi cập nhật một phiên bản source code mới mà không gây ảnh hưởng tới người dùng và hệ thống?

8. Làm sao để thông tin gửi từ hệ thống chắc chắn đến được với người dùng?

 

Các câu hỏi trên chắc chắn là những bài toán mà những người xây dựng hệ thống cần phải giải quyết. Thời điểm ban đầu khi liệt kê ra những vấn đề này đã khiến tôi thực sự lo lắng, vì nghĩ rằng lượng công việc cho nhiệm vụ này rất lớn và khó. Tuy nhiên, những vấn đề kể trên không phải chỉ mình tôi gặp phải, mà nó đã tồn tại từ rất lâu, do vậy cũng đã có rất nhiều công ty, những người đi trước tìm cách đưa ra giải pháp chung cho nó.

Trong thiết kế hệ thống các vấn đề nêu trên được chia vào 3 nhóm lớn:

1. Performance - Hiệu năng của hệ thống

Hiệu năng của hệ thống được thể hiện bằng thời gian hệ thống phản hồi lại các yêu cầu của một lượng người dùng đã được định nghĩa trước, hoặc thời gian mà hệ thống xử lý một lượng dữ liệu nhất định.

Như vậy thì khi có càng nhiều người dùng đến với hệ thống, hoặc lượng dữ liệu mà hệ thống cần phải xử lý lớn dần lên thì đến một lúc nào đó người dùng sẽ thấy hiệu năng của hệ thống bị giảm xuống.

 

2. Scalability - Khả năng mở rộng của hệ thống

 

Như tôi đã nói ở trên, hiệu năng của hệ thống sẽ bị giảm xuống khi mà lượng người dùng hay lượng dữ liệu mà hệ thống phải xử lý tăng lên.

Trong hầu hết các hệ thống, người ta mong muốn hiệu năng của hệ thống vẫn giữ nguyên cho dù lượng người dùng có tăng. Để thực hiện được việc đó người ta thường làm theo hai cách:

a. Vertical Scaling

Thêm tài nguyên phần cứng cho các server đang có (nâng RAM, nâng số lượng CPU, GPU, network card ...)

Ưu điểm: Sự triển khai hệ thống đơn giản hơn

Nhược điểm: Tốn kém và phần cứng chỉ có thể mở rộng tới một giới hạn nhất định.

b. Horizontal Scaling

Thêm các server vào hệ thống sẵn có

Ưu điểm: Tiết kiệm chi phí, việc mua 10 con server nhỏ (16 cores, 64 GB RAM) sẽ rẻ hơn mua một con server lớn (160 core, 640 GB RAM), và nếu không dùng hết 10 con server nhỏ  thì có thể dùng chúng cho những tác vụ khác khi cần.

Nhược điểm: Triển khai hệ thống phức tạp hơn nhiều.

 

3. Availability

 

Là khả năng phục vụ, khả năng dự phòng của hệ thống.

Để hệ thống luôn sống và phục vụ người dùng, người thiết kế hệ thống phải có các phương án dự phòng để khi có lỗi xảy ra thì hệ thống có thể tự khôi phục một cách nhanh chóng ( chỉ trong vài chục giây hoặc vài phút).

 

III Mục tiêu của lộ trình python backend

 

Trong lộ trình python backend tôi ghi chép lại các công cụ và phương pháp tôi đã sử dụng để giải quyết bài toán "thiết kế và triển khai hệ thống phục vụ nhiều người dùng", và cách giải quyết các câu hỏi mà tôi đã đặt ra ở phần II.

Cụ thể, về mặt ngôn ngữ tôi dùng Python để phát triển phần ứng dụng phía backend, framework dùng cho web service là FLask. Áp dụng kiến trúc của Celery làm kiến trúc chung của hệ thống, kiến trúc này sử dụng RabbitMQ để trao đổi các bản tin ( các yêu cầu từ người dùng và phản hồi từ hệ thống), Celery Worker để nhận các yêu cầu từ RabbitMQ và thực thi các yêu cầu đó, Redis như một database để lưu trữ kết quả sau khi Celery Worker hoàn thành công việc của nó.

Có thể nhiều người đọc tới đây sẽ lo ngại là lộ trình này không phù hợp với người mới bắt đầu, nhưng trên thực tế khi tôi bắt tay vào xây dựng các hệ thống trong các dự án của mình, tôi mới chỉ có một chút kiến thức về Python và cũng chưa hề biết cách sử dụng Flask, Celery, RabbitMQ, hay Redis. Tôi sẽ viết ra những gì liên quan tới những dự án mà tôi đã làm, nên phần kiến thức sẽ không quá rộng, do vậy lộ trình này vẫn hoàn toàn phù hợp với những người mới.

Phần outline của toàn bộ lộ trình tôi đã viết ở một bài khác và có thể tìm thấy tại: Lộ trình học python cho kỹ sư backend và kỹ sư tích hợp hệ thống

 

IV. Bài toán cụ thể

 

Các bài viết trong lộ trình có liên quan tới hầu hết các dự án mà tôi đã làm. Nhưng tôi sẽ chọn nhiều nội dung liên quan tới một dự án startup mà đã được triển khai online và có lượng người dùng lớn là House3D, Những dự án khác mà tôi đã triển khai cũng có lượng người dùng rất lớn nhưng lại chỉ dùng cho nội bộ công ty đối tác, công ty này có hàng chục nghìn nhân viên trên toàn cầu và họ không cho phép người ngoài truy cập vào dịch vụ nội bộ.

Vì những chính sách bảo mật nên tôi sẽ không cung cấp bản thiết kế hệ thống của các dự án mà chỉ dừng lại ở mức mô phỏng một phần hoạt động của dự án House3D.

Công nghệ mà House3D luôn tự hào là công nghệ render ảnh. Các công cụ truyền thống render ảnh có thể mất từ 5 tới 7 tiếng tùy bản vẽ, thì với H3D họ chỉ mất từ 3 tới 30 phút để render một ảnh tương tự.

Tôi sẽ mô phỏng lại chức năng render ảnh ở trên bằng một bài toán phân chia công việc cho các worker như sau:

 

Hình 1. Sơ đồ luồng hoạt động của backend app

 

1. Đầu vào của hệ thống là một ảnh màu (người dùng upload ảnh lên hệ thống qua 1 API). 2. Khi hệ thống nhận được yêu cầu và ảnh từ người dùng sẽ có một service (s1) cắt ảnh đó ra thành N phần bằng nhau. Sau khi hoàn thành việc cắt ảnh, service trên sẽ gửi yêu cầu tới các worker.

3. Khi các worker nhận được yêu cầu chúng sẽ chuyển đổi ảnh màu sang ảnh đen trắng. Sau đó các worker sẽ gửi kết quả tới một service (s2) khác.

4. Khi service s2 nhận được kết quả từ toàn bộ các worker, nó sẽ thực hiện việc ghép các ảnh nhỏ (ảnh đã được chuyển đổi từ ảnh màu sang ảnh đen trắng bởi các worker) thành một ảnh lớn.

5. Service s2 lưu kết quả gồm trạng thái của yêu cầu và đường dẫn tới ảnh cuối vào database redis

6. Service s2 gửi lại phản hồi tới client qua websocket/API.  

 

V. Triển khai hệ thống

 

Cách triển khai hệ thống như thế nào phụ thuộc vào rất nhiều yếu tố.

Hệ thống mà tôi triển khai trong lộ trình học python cho kỹ sư backend và kỹ sư tích hợp hệ thống sẽ tập trung vào các yếu tố mà tôi đã gặp phải, và các vấn đề chung của hầu hết các hệ thống.

Về mặt tổng quan, toàn bộ hệ thống sẽ như sau:

Hình 2. Kiến trúc tổng thể của hệ thống trong lộ trình python backend

 

Với cách thiết kế hệ thống như trên tôi mong muốn chia sẻ:

1. Cách phát triển một ứng dụng python phù hợp với hệ thống đã được thiết kế.

2. Cách hoạt động và chức năng của mỗi thành phần trong hệ thống.

3. Các cách triển khai hệ thống

4. Cách kiểm tra hoạt động và hiệu năng của hệ thống.

 

VI. Kết luận

 

Qua bài viết này tôi muốn giới thiệu tổng quan nội dung và ý đồ của toàn bộ lộ trình học python cho kỹ sư backend và kỹ sư tích hợp hệ thống.

Tôi sẽ cập nhật các bài viết hàng tuần hoặc 2 lần một tuần. Nội dung của toàn bộ lộ trình đã được liệt kê trong outline này. Tuy nhiên tôi vẫn sẽ tiếp nhận sự đóng góp của bạn đọc  tại các bình luận hoặc trong group Python Backend Learning Path, và sẽ thay đổi nội dung nếu điều đó là cần thiết.

Các bài viết sẽ được cập nhật tai link sau: Lộ trình học python cho kỹ sư backend.

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải