30/09/2018, 17:04

Hỏi về khả năng mở rộng(scalability) trong lập trình

Mình muốn tìm hiểu về việc lập trình cho hệ thống lớn phục vụ cho hàng triệu người dùng thì khác gì so với hệ thống chỉ vài trăm người dùng. Mình nghe nói là nếu không có kĩ thuật thì hệ thống sẽ dễ bị crash khi phục vụ số lượng lớn người dùng. Cao thủ nào có tài liệu nào về phần này thì chỉ giáo với

Lập Trình Sư viết 19:07 ngày 30/09/2018

Mình muốn tìm hiểu về việc lập trình cho hệ thống lớn phục vụ cho hàng triệu người dùng thì khác gì so với hệ thống chỉ vài trăm người dùng. Mình nghe nói là nếu không có kĩ thuật thì hệ thống sẽ dễ bị crash khi phục vụ số lượng lớn người dùng. Cao thủ nào có tài liệu nào về phần này thì chỉ giáo với

Phụ thuộc vào:

  1. Trình độ, kĩ thuật lập trình.
  2. Hiểu biết sâu rộng về các nền tảng và lĩnh vực liên quan.

Kĩ thuật nào? Tài liệu nào?

Chả có, chỉ có hiểu biết và kinh nghiệm được sử dụng như thế nào để giải quyết vấn đề.

Khanh Ng viết 19:17 ngày 30/09/2018

@laptrinhio ơi vậy làm sao có được phần hiểu biết sâu về lĩnh vực đó vậy. Chẳng lẽ cứ vừa làm vừa đọc thêm hả. Tại vì mình thấy ebook hiện nay không tập trung về vấn đề đó @@

Nguyễn Trung Tín viết 19:17 ngày 30/09/2018

Mình cũng đang quan tâm vấn đề này. Khả năng phục vụ số lượng cực lớn người dùng và cập nhật không đồng bộ không cần khởi động lại hệ thống.

Lập Trình Sư viết 19:16 ngày 30/09/2018

@laptrinhio ơi vậy làm sao có được phần hiểu biết sâu về lĩnh vực đó vậy. Chẳng lẽ cứ vừa làm vừa đọc thêm hả. Tại vì mình thấy ebook hiện nay không tập trung về vấn đề đó @@

Nếu là lập trình viên, thì chỉ chú tâm vào lập trình một vài mảng là quan trọng nhất. Lập trình viên không phải là người đưa ra giải pháp. OK?

Trong công nghệ thông tin, có nhóm chuyên gia về giải pháp (Solution Architect - SA), đặc thù của họ là nghiên cứu và có hiểu biết rộng về rất nhiều nền tảng công nghệ, và có thể đưa ra giải pháp cho nhiều lĩnh vực. Họ nắm bắt tin tức nhanh, tính bằng giờ, có gì mới là phải biết, đi tìm hiểu các ứng dụng, các hệ điều hành, phương pháp thiết kế, cách thức vận hành, … Nói chung là tất tần tật. Những ông này thường là các lão làng Expert trong lĩnh vực IT, ít nhất cũng 10+ năm; hay các MVP. Ghi chú là: Solution Architect có thể code không giỏi, nhưng họ biết cách sử dụng và điều hướng cho các lập trình viên làm cho đúng.
Cái SA này dựa trên hiểu biết, trình độ và kinh nghiệm. Không đâu có thể dạy được. Hàng trăm, hàng nghìn thứ mới ra từng giờ, phải tự nắm bắt, chứ ko có chỗ nào gọi là dạy dỗ đâu.

Tom Nguyen viết 19:10 ngày 30/09/2018

Một trang blog đơn thuần để chịu tải 1 triệu người đọc thường xuyên cũng không khó lắm . Nhưng vấn đề ở đây là chức năng có gì? Chả “triệu view” nào vào chỉ để xem vài bài blog cả, những hệ thống mà có nhiều người view thường xuyên thì có data lớn, nhiều chức năng lúc đó mới cần nhiều đến các thiết kế có tính scalability.

Để từ không biết gì về kiến trúc đến có thể tạo ra một hệ thống lớn thì còn vừa học vừa làm dài dài 5-10 năm
Thực ra các hệ thống lớn đều sửa dụng các thiết kế enterprise. Bạn chỉ cần search và tìm hiểu về enterprise architecture là được.

Cơ mà đều hiểu được nó và làm thì phải quay lại học kiến thức cơ bản như UML, design pattern, design …

Coulson viết 19:10 ngày 30/09/2018

Mình cũng chỉ mới tìm hiểu sơ về vấn đề này để xây dựng kiến trúc cho server.

Hệ thống lớn thì cần quan tâm tới một số vấn đề:

  1. Khả năng mở rộng Database
    Khi xây dựng 1 hệ thống lớn thì thường phải lưu trữ một lượng dữ liệu lớn trong database.
    Vấn đề là làm sao để có thể lưu trữ và quản lý một lượng data lớn một cách hiệu quả.
    Bạn có thể tham khảo bài viết về quá trình scale database của pinterest (Tiếng anh)
    pinterest scaling database

  2. Khả năng chịu tải của server

  • Server sẽ nhận rất nhiều request từ web, mobile … Vấn đề làm sao để cùng lúc server có thể xử lý nhiều request như vậy mà không bị block.
  • Thông thường các website nhỏ dùng các framework synchronous nghĩa là khi một request gửi lên server nó sẽ phải xử lý xong request đó rồi mới nhận request tiếp theo. Có thể dùng nhiều thread để xử lý request nhưng lượng thread tạo ra bị giới hạn và rất tốn resource.

Nếu dùng python, bạn có thể thử django, flask.

  • Server asynchronous, tùy theo công nghệ sử dụng, nó đấy request cho một thằng nào đó xử lý rồi nó tiếp tục nhận request khác mà không phải đợi cho request trước phải thực hiện xong, sau khi request được xử lý xong, kết quả sẽ được trả về ( có thể là hàm callback, tùy kỹ thuật).
    Như vậy thì cùng 1 lúc server asynchronous có thể nhận được nhiều request hơn so với server synchronous.

Trên Python bạn có thể dùng Tornado, Twist, Gevent

  • Cách thứ 3 là kết hợp cả synchronous và asynchronous cho server. (cái này mình chưa tìm hiểu kỹ)
  1. Performance
    Cái quan trọng cuối cùng là hiệu suất của toàn bộ hệ thông. Thời gian để xử lý và đáp ứng 1 request từ client phải nhanh, nó quyết định chất lượng của dịch vụ.
    Để tối ưu được tốc độ xử lý có nhiều chỗ cần phải xử lý như truy xuất database lớn, phân bố tải giữa các server(load balancing), phân server xử lý theo khu vực địa lý …


Nói chung là cứ học và làm thì sẽ biết mình cần biết cái gì rồi lên google tìm tài liệu thôi bạn.
Mình cũng mới đang tìm hiểu. có gì sai thì mọi người góp ý.

Bài liên quan
0