MỤC LỤC
● Khả năng mở rộng (Scalability): Để đáp ứng sự tăng trưởng về số lượng người dùng, hệ thống cần đảm bảo rằng các vấn đề như lưu trữ dữ liệu, băng thông yêu cầu cho việc xem dữ liệu đồng thời, và số lượng yêu cầu từ người dùng đồng thời không gây ra sự kẹt trệ (bottleneck) trong ứng dụng hoặc máy chủ web của chúng ta. Điều này khác biệt so với các ứng dụng đơn giản hơn không liên quan đến tính toán song song, trong đó chương trình thực hiện các lệnh theo thứ tự được định nghĩa bởi chuỗi lệnh trong mã nguồn, thường tuân theo một luồng tuần tự tuyến tính.
Tính nhất quán (Consistency) là một thuộc tính quan trọng trong hệ thống phân tán, đảm bảo rằng tất cả các máy chủ (server) trong cụm (cluster) luôn duy trì cùng một trạng thái và dữ liệu vào một thời điểm cố định, bất kể client nào đã thực hiện cập nhật dữ liệu. Lỗi Byzantine (Byzantine fault), hay còn gọi là Vấn đề các vị tướng Byzantine, là một tình trạng của một hệ thống, đặc biệt là hệ thống phân tán, trong đó các component có thể bị lỗi và không có thông tin chính xác về việc liệu component đó có bị lỗi hay không.
Khi sử dụng ORM, các câu lệnh truy vấn được thực hiện thông qua các đối tượng và phương thức trong ngôn ngữ lập trình của bạn, và thư viện ORM sẽ tự động chuyển đổi các câu lệnh này thành các câu lệnh SQL tương ứng. Entity Framework Core (EF Core) là một phiên bản nhẹ, mở rộng, mã nguồn mở và đa nền tảng của công nghệ truy cập dữ liệu Entity Framework, một ORM (Object-Relational Mapping) phổ biến trong cộng đồng phát triển .NET.
Tuy nhiên, sự trừu tượng này cũng có thể làm cho EF Core trở thành một "hộp đen" đối với lập trỡnh viờn, và hiểu rừ về cỏch nú tạo cõu lệnh SQL là quan trọng để tránh lãng phí tài nguyên. Trong OOP, đây chính là Object cùng với các method và properties tuân thủ nguyên tắc Encapsulation - chỉ bên trong Object mới có thể thay đổi trạng thái (State) của chính nó.
❖ Bằng cách tích hợp những chiến lược và công nghệ này, hệ thống E-commerce có thể đáp ứng được yêu cầu ngày càng cao của người dùng và doanh nghiệp. Để đáp ứng các yêu cầu và thách thức này, trong việc thiết kế hệ thống ta phải áp dụng các kỹ thuật và công nghệ như khả năng horizontal scaling, cân load balancing, caching, version control, vv.
● Cân bằng tải nội bộ (Local load balancing): việc cân bằng tải được thực hiện trong một trung tâm dữ liệu. Loại cân bằng tải này tập trung vào việc cải thiện hiệu suất và tận dụng tài nguyên tốt hơn của các máy chủ lưu trữ trong trung tâm dữ liệu. a) Cân bằng tải máy chủ toàn cục. Dịch vụ GSLB có thể được cài đặt tại cơ sở hoặc được thuê qua Dịch vụ Cân bằng Tải (Load Balancing as a Service - LBaaS). GSLB có thể chuyển tiếp các yêu cầu đến ba trung tâm dữ liệu khác nhau. Mỗi lớp cân bằng tải cục bộ bên trong một trung tâm dữ liệu sẽ duy trì một kết nối mặt trống với GSLB, cung cấp thông tin về tình trạng của Cân bằng tải và trạng thái máy chủ. GSLB sử dụng thông tin này để đưa ra quyết định về lưu lượng và chuyển tiếp tải lưu. lượng dựa trờn cấu hỡnh và thụng tin được theo dừi của mỗi khu vực. b) Cân bằng tải cục bộ.
Lúc này, các server còn lại sẽ không có cách nào để biết liệu coordinator đã quyết định commit hay rollback - cho dù chúng có thể giao tiếp và biết được quyết định của nhau thì cũng không có cách nào để biết quyết định của các server đã ngưng hoạt động cùng coordinator. Vấn đề của giao thức 2PC có thể được giải quyết bằng cách chia giai đoạn đầu tiên (giai đoạn bỏ phiếu) thành 2 giai đoạn con, trong đó người điều phối trước tiên thông báo kết quả phiếu bầu cho các nút, chờ sự xác nhận, và sau đó tiến hành với thông điệp cam kết hoặc hủy bỏ.
Distributed caching mở rộng ý tưởng của local cache bằng cách phân phối dữ liệu tạm thời trên nhiều máy chủ, tạo thành một môi trường caching phân tán. Mô hình này kết hợp giữa reverse proxy caching và sidecar caching, tức là một reverse proxy hoạt động như một sidecar container cho từng ứng dụng.
Tuy nhiên, thay vì lười biếng (lazy) tải dữ liệu vào cache sau khi truy cập lần đầu, chúng ta đẩy dữ liệu một cách chủ động vào cache khi viết (write) dữ liệu. Với mô hình Write-around, dữ liệu được ghi trực tiếp từ application vào database và đọc dữ liệu theo một trong hai mô hình: read-aside hoặc read-through.
❖ Tạo Cụm Chuyên Nghiệp (Build Around Business Capabilities): Microservices nên được thiết kế xung quanh khả năng kinh doanh cụ thể, đảm bảo rằng mỗi dịch vụ thực hiện một nhiệm vụ liên quan trực tiếp đến mục tiêu kinh doanh. ❖ Giao Tiếp Xuyên Dự Án (Cross-Team Communication): Tổ chức nên thúc đẩy giao tiếp giữa các đội làm việc trên các microservices để đảm bảo rằng mọi người hiểu rừ về cỏc dịch vụ và cỏch chỳng tương tỏc.
❖ Độc Lập Cơ Sở Dữ Liệu (Independent Database): Mỗi microservice nên có cơ sở dữ liệu của chính mình, tránh sự phụ thuộc vào cơ sở dữ liệu chung. ❖ Theo Dừi Liờn Tục (Continuous Monitoring): Việc theo dừi và thu thập dữ liệu liờn tục giúp đảm bảo hiệu suất, khả năng mở rộng và sẵn sàng của các microservices.
❖ Yêu cầu nhân lực nhiều hơn: Triển khai một hệ thống microservices đòi hỏi một đội ngũ DevOps lớn để làm việc cùng nhau, từ quá trình phát triển đến triển khai sản phẩm. Mặc dù có những thách thức này, nếu thiết kế và triển khai đúng cách, microservices có thể mang lại nhiều lợi ích như khả năng mở rộng linh hoạt, sẵn có cao và khả năng phát triển nhanh chóng.
● Giới hạn tốc độ: API Gateway có thể giới hạn số lượng yêu cầu từ một client trong một khoảng thời gian nhất định để ngăn chặn các cuộc tấn công từ chối dịch vụ (DoS) hoặc giảm thiểu các request bất thường. ● Decouple giao diện: Giao diện không dính với các service phía sau nên ta có thể thay đổi thiết kế của hệ thống, chỉ cần đảm bảo api gateway vẫn cung cấp thông tin đúng format là UI vẫn chạy.
Đây là một vấn đề phổ biến khi các nút trong một hệ thống phân tán cần bầu chọn một nút từ trong số họ để hoạt động như người điều phối (leader) và điều phối hoạt động của toàn bộ hệ thống. Bởi vì tất cả các nút thực tế đều đồng ý về một giá trị duy nhất, danh tính của leader, vấn đề này có thể dễ dàng được mô hình hóa như một vấn đề thống nhất.
Bất kỳ người điều phối từ các nhiệm kỳ trước đây sẽ không thể sao chép các mục nhật ký (log entries) mới đến các nhóm vì những người bỏ phiếu cho người điều phối mới sẽ từ chối các yêu cầu của người điều phối cũ, và cuối cùng nó sẽ phát hiện mình đã bị thay thế. Nói cách khác, nhiệm kỳ của entry cuối trong log của candidate phải lớn hơn nhiệm kỳ của entry cuối trong log của follower - nếu nhiệm kỳ của 2 entry này bằng nhau thì index của entry của candidate phải lớn hơn; thỏa mãn được điều kiện này thì candidate sẽ có được phiếu bầu của follower.
● Vòng đời phát triển nhanh và hiệu quả: Docker giúp rút ngắn thời gian phát triển bằng cách cho phép các lập trình viên làm việc trong các môi trường giống nhau sử dụng các local container cung cấp các ứng dụng và dependency cần thiết. Việc monitor các thành phần của hệ thống quan trọng, nhất là khi có vấn đề xảy ra, thay vì phải manually đi tìm ra nguồn gốc của lỗi thì ta deploy một hệ thống để lấy các thông số của hệ thống rồi tổng hợp nó lại.
Chúng em đã áp dụng các công nghệ phức tạp để xây dựng một hệ thống quản lý nhân sự tại trường học, đem lại cho chúng em cơ hội thực hành và hiểu sâu hơn về các khái niệm và thực hành thiết kế hệ thống. Chúng em sẽ tiếp tục nỗ lực để không chỉ nắm vững những nguyên tắc cơ bản mà còn có thể đối mặt và giải quyết các thách thức trong quá trình triển khai hệ thống phức tạp.