paint-brush
Phần cuối hiệu quả, hiệu suất vượt trội: Đi sâu vào tối ưu hóa dịch vụ webtừ tác giả@sergeidzeboev
930 lượt đọc
930 lượt đọc

Phần cuối hiệu quả, hiệu suất vượt trội: Đi sâu vào tối ưu hóa dịch vụ web

từ tác giả Sergei Dzeboev8m2023/11/21
Read on Terminal Reader

dài quá đọc không nổi

Việc tối ưu hóa phần phụ trợ của dịch vụ web không chỉ dừng lại ở việc cải thiện mã và thuật toán. Chìa khóa để nâng cao hiệu quả dịch vụ là tối ưu hóa các tương tác cơ sở dữ liệu. Điều này có thể đạt được thông qua việc tinh chỉnh các truy vấn ORM, sử dụng các lớp dữ liệu phẳng, phân loại chính xác dữ liệu là Nóng, Ấm hoặc Lạnh và sử dụng các chiến lược bộ nhớ đệm hiệu quả. Các bước này dẫn đến một dịch vụ web hiệu quả hơn, đáp ứng nhanh hơn và có hiệu suất cao hơn.
featured image - Phần cuối hiệu quả, hiệu suất vượt trội: Đi sâu vào tối ưu hóa dịch vụ web
Sergei Dzeboev HackerNoon profile picture
0-item


Tối ưu hóa phần phụ trợ của dịch vụ web luôn nhằm mục đích tăng hiệu suất của dịch vụ đó, khía cạnh quan trọng của dịch vụ này là tăng tốc độ xử lý dữ liệu. Quá trình này bao gồm nhiều cải tiến quan trọng nhằm mục đích sử dụng tài nguyên hiệu quả hơn và giảm thiểu thời gian phản hồi của hệ thống đối với các yêu cầu. Trong bài viết này, tôi sẽ chia sẻ một số kỹ thuật đã được chứng minh có thể tăng tốc đáng kể dịch vụ web của bạn.


Cần tập trung vào điều gì để cải thiện?

Nhiều lập trình viên, trong nỗ lực làm cho ứng dụng nhanh hơn, tập trung vào việc tối ưu hóa mã và thuật toán, chọn cấu trúc dữ liệu phù hợp và hoạt động tối ưu. Điều này thường dẫn đến hiệu suất được cải thiện, thường cải thiện tốc độ của mã được tối ưu hóa nhưng không đáng kể.


Mức tăng khiêm tốn này là do tốc độ hoạt động của bộ nhớ vốn có và không nên mong đợi những cải tiến đáng kể trừ khi mã gốc rất kém hiệu quả. Tuy nhiên, một số hoạt động tiêu tốn thời gian nhất định cần được ưu tiên tối ưu hóa, đặc biệt là các hoạt động đầu vào-đầu ra.


Dù làm việc với tệp hay tương tác với cơ sở dữ liệu, thời gian thực hiện các tác vụ này luôn cao hơn so với các hoạt động trong bộ nhớ. Bạn không thể tác động đáng kể đến quá trình đọc dữ liệu từ một tệp nhưng làm việc với cơ sở dữ liệu nằm dưới sự kiểm soát trực tiếp của bạn. Là nhà phát triển, bạn có tất cả các khả năng để cải thiện đáng kể sự tương tác này.


Hãy cùng khám phá các chiến lược sau để làm việc với cơ sở dữ liệu của bạn hiệu quả hơn, từ đó tăng cường đáng kể hiệu suất của dịch vụ phụ trợ của bạn


Tối ưu hóa truy vấn

Ngày nay, thật hiếm khi tìm thấy một dịch vụ web phụ trợ không sử dụng hệ thống Ánh xạ quan hệ đối tượng (ORM) cho các tương tác cơ sở dữ liệu. Nếu bạn đang hướng tới kết quả xuất sắc nhất, hãy xem xét tùy chỉnh ORM. Mặc dù ORM hiệu quả và không có lỗi nhưng chúng được thiết kế để sử dụng thông thường. Khả năng ứng dụng rộng rãi này thường phải trả giá bằng hiệu suất cao.


Hãy nhớ rằng ORM được tạo để tương thích với nhiều cơ sở dữ liệu khác nhau, điều này có thể có nghĩa là bỏ lỡ những lợi thế cụ thể của cơ sở dữ liệu mà bạn đã chọn cho dự án của mình. Ví dụ: như được minh họa ở đây, việc tận dụng các tính năng cơ sở dữ liệu độc đáo có thể nâng cao đáng kể tốc độ tương tác cơ sở dữ liệu lên tới 30 lần.


Thay vì chỉ phụ thuộc vào các truy vấn mặc định do ORM cung cấp, bạn nên tạo các truy vấn được tối ưu hóa của riêng mình. Truy vấn tùy chỉnh thường hoạt động tốt hơn, đặc biệt trong các tình huống liên quan đến nhiều kết nối.


Dưới đây là một ví dụ đơn giản trong Spring JPA về cách bạn có thể cải thiện hiệu suất bằng truy vấn nối:

 @Transactional @Lock(LockModeType.PESSIMISTIC_READ) @Query(value = """ SELECT e FROM EmployeeRecord e LEFT JOIN DepartmentRecord d ON e.departmentId = d.id WHERE e.departmentId = :departmentId; """) List<EmployeeRecord> findEmployeesByDepartmentId(Integer departmentId);


Sử dụng lớp phẳng

Việc sử dụng các lớp phức tạp với các đối tượng lồng nhau và hệ thống phân cấp sâu có thể dẫn đến tổn thất đáng kể về hiệu suất hệ thống. Thường không cần thiết phải truy vấn cơ sở dữ liệu về toàn bộ cấu trúc lồng nhau, đặc biệt khi không phải tất cả các lớp trong cấu trúc đều được sử dụng đầy đủ.


Mặc dù việc khởi tạo từng phần giúp giảm thiểu các truy vấn không cần thiết trên các đối tượng lồng nhau, nhưng các thách thức sẽ nảy sinh khi cần một đối tượng lồng nhau nhưng không phải tất cả dữ liệu của đối tượng đó đều được yêu cầu. Giải pháp cho vấn đề nan giải này là sử dụng các lớp dữ liệu phẳng.


Bạn nên tạo một lớp được thiết kế để chỉ thu thập dữ liệu trường cần thiết từ cơ sở dữ liệu. Sau đó, với truy vấn cơ sở dữ liệu tùy chỉnh kết hợp tất cả các kết nối cần thiết, chỉ chọn những trường thực sự cần thiết.


Cách tiếp cận này không chỉ nâng cao tốc độ truy vấn mà còn giảm lưu lượng dữ liệu từ cơ sở dữ liệu đến dịch vụ của bạn.


Ví dụ: sử dụng NamedParameterJdbcTemplate từ Spring JPA, có thể tạo một lớp phẳng với các trường cần thiết:

 public record EmployeeDepartment(Integer employeeId, String employeeName, String departmentName) { }


Tiếp theo, bằng cách sử dụng tập lệnh đơn giản, chỉ các trường cần thiết mới được thu thập từ bảng chính và bảng đã nối:

 public List<EmployeeDepartment> employeeDepartments() { return template.query(""" SELECT employees.employee_id, employees.employee_name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id; """, new MapSqlParameterSource(), employeeDepartmentMapper); }


Cách tiếp cận này sẽ giảm tải đáng kể và giúp làm việc với dữ liệu hiệu quả hơn nhiều.


Xác định dữ liệu nóng

Bước quan trọng tiếp theo khi làm việc với dữ liệu là xác định các kiểu dữ liệu, với kiểu chính là Hot Data.


Dữ liệu nóng là dữ liệu mà dịch vụ xử lý trong thời gian thực. Dữ liệu này không thể được lưu vào bộ nhớ đệm vì mức độ liên quan của phản hồi của dịch vụ web phụ thuộc vào khả năng phản hồi ngay lập tức của nó. Vì vậy, dữ liệu này phải luôn được cập nhật. Dịch vụ hoạt động ổn định với Hot Data, liên tục ghi lại các giá trị mới và trích xuất thông tin để cập nhật kịp thời.


Để làm việc với Dữ liệu nóng hiệu quả nhất có thể, điều quan trọng là phải đảm bảo rằng bảng lưu trữ dữ liệu đó càng nhỏ gọn càng tốt.


  • Giữ càng ít cột càng tốt

    Bảng của bạn chỉ nên chứa các trường được sử dụng tích cực và lưu trữ tất cả dữ liệu khác trong một bảng riêng biệt, chỉ giữ lại ID của hàng có liên quan. Cách tiếp cận này cho phép bạn truy cập tất cả các trường không sử dụng khi cần, chẳng hạn như cho mục đích báo cáo mà không làm bảng chính bị quá tải với dữ liệu này.


  • Giữ càng ít hàng càng tốt

    Đừng lưu trữ các dòng bạn không còn cần nữa. Thay vào đó, hãy di chuyển chúng vào bảng lưu trữ. Cách tiếp cận này cho phép truy vấn của bạn tìm thấy các hàng được yêu cầu nhanh hơn trong khi vẫn bảo toàn tất cả dữ liệu lịch sử trong kho lưu trữ. Tự động hóa quy trình này bằng một công việc đơn giản sẽ giảm thiểu sự tham gia của bạn vào việc lưu trữ dữ liệu.


  • Luôn cập nhật các chỉ mục

    Hãy nhớ xây dựng các chỉ mục. Các chỉ mục rất quan trọng để tìm kiếm dữ liệu nhanh chóng và thường bị các lập trình viên bỏ qua. Lập chỉ mục thích hợp có thể giảm đáng kể thời gian tìm kiếm và mức tiêu thụ bộ nhớ của cơ sở dữ liệu của bạn. Đảm bảo xây dựng chỉ mục cho cả điều kiện và cột liên quan đến các phép nối, bao gồm cả chỉ mục tổng hợp.


  • Từ bỏ việc sử dụng khóa ngoại

    Việc sử dụng khóa ngoại sẽ tạo thêm tải cho cơ sở dữ liệu để đảm bảo rằng khóa tồn tại trong bảng được liên kết, điều này làm chậm hoạt động dữ liệu, đặc biệt là khi ghi dữ liệu. Đừng hiểu lầm tôi; việc lưu trữ khóa ngoại trong một bảng như vậy là có thể và đôi khi thậm chí là cần thiết, nhưng tốt hơn hết là lưu trữ khóa đơn giản dưới dạng giá trị đơn giản.


Những phương pháp đơn giản này sẽ cho phép bạn tối đa hóa hiệu quả và tiện ích của bàn.


Xác định dữ liệu ấm

Dữ liệu ấm là dữ liệu được sử dụng để chuẩn bị phản hồi, mặc dù mức độ liên quan của nó không có tác động nghiêm trọng. Ví dụ bao gồm mô tả sản phẩm hoặc danh sách các phụ kiện có sẵn. Trong khi lưu trữ những dữ liệu đó, việc giám sát chặt chẽ kích thước của bảng không còn cần thiết nữa. Tuy nhiên, điều quan trọng là không bỏ qua việc tạo chỉ mục trên các bảng này vì chúng thường được sử dụng để nối.


  • Bộ nhớ đệm dữ liệu ấm

    Ưu điểm chính của Warm Data là khả năng lưu vào bộ nhớ đệm. Sau khi yêu cầu được thực hiện, bạn có thể lưu trữ dữ liệu vào bộ nhớ, giảm số lượng lệnh gọi cơ sở dữ liệu và tăng tốc độ tính toán. Tuy nhiên, hãy nhớ rằng bộ đệm cần được cập nhật thường xuyên.


  • Đặt TTL (Time To Live) hợp lý

    Đặt Thời gian tồn tại (TTL) chính xác để hoạt động bình thường. Thông thường, TTL khoảng 90 giây là đủ, phù hợp với thời gian trung bình mà người dùng cần để đưa ra quyết định và đặt hàng trên một trang web. Luôn điều chỉnh TTL dựa trên yêu cầu dịch vụ của bạn.


  • Sử dụng các lớp nhỏ hơn để lưu trữ Warm Data

    Để lưu vào bộ nhớ đệm, hãy sử dụng các lớp nhỏ gọn. Ngay cả khi các truy vấn đầy đủ được thực hiện và tất cả dữ liệu từ các bảng được thu thập, hãy tránh lưu trữ mọi thứ trong bộ đệm. Chỉ lưu trữ những dữ liệu cần thiết. Cách tiếp cận này làm giảm đáng kể mức tiêu thụ bộ nhớ của dịch vụ phụ trợ của bạn.


Thiết lập Warm Data sẽ không tốn nhiều thời gian và cuối cùng bạn sẽ đạt được kết quả rõ ràng.


Xác định dữ liệu lạnh

Dữ liệu nguội đề cập đến dữ liệu hiếm khi thay đổi nhưng vẫn cần thiết để phản hồi. Ví dụ về dữ liệu đó bao gồm tên hoặc địa chỉ của cửa hàng. Dữ liệu này rất hiếm khi thay đổi và có tác động tối thiểu đến mức độ liên quan của phản hồi.


  • Cache dữ liệu lạnh hoặc lưu trữ nó trong một tập tin

    Loại dữ liệu này phải luôn được lưu trữ. Nếu việc đưa dữ liệu đó vào bộ nhớ là không khả thi do kích thước lớn của nó, hãy cân nhắc việc dỡ dữ liệu đó khỏi cơ sở dữ liệu và lưu trữ nó trong các tệp ở định dạng sẵn sàng sử dụng. Chia nó thành các danh mục và chỉ chọn những danh mục được sử dụng thường xuyên nhất sẽ giúp giảm mức sử dụng bộ nhớ. Ngoài ra, phương pháp này cải thiện đáng kể tốc độ so với việc tìm nạp dữ liệu từ cơ sở dữ liệu vì nó loại bỏ nhu cầu làm việc qua mạng.


  • Cập nhật bộ đệm khi kích hoạt

    Thời gian tồn tại (TTL) cho bộ đệm như vậy thường được đặt là 24 giờ. Để luôn cập nhật bộ đệm, bạn nên lên lịch tác vụ hoặc tạo trình kích hoạt theo dõi các thay đổi đối với dữ liệu này và bắt đầu cập nhật bộ đệm. Ví dụ: nếu điểm cuối được gọi để đăng hoặc cập nhật Dữ liệu nguội, thì trình kích hoạt sẽ được kích hoạt để cập nhật bộ đệm.


Quản lý hiệu quả Cold Data cũng là một phần quan trọng trong việc tối ưu hóa hiệu quả phản hồi, từ đó nâng cao hiệu suất tổng thể của hệ thống.


Phần kết luận

Tóm lại, việc tối ưu hóa phần phụ trợ của dịch vụ web không chỉ xoay quanh việc tối ưu hóa mã và thuật toán. Tăng cường tương tác cơ sở dữ liệu sẽ dẫn đến hiệu quả cao hơn và hiệu suất tổng thể của dịch vụ. Việc triển khai các kỹ thuật như tinh chỉnh các truy vấn ORM (Ánh xạ quan hệ đối tượng), sử dụng các lớp dữ liệu phẳng, xác định chính xác các loại dữ liệu và áp dụng chiến lược bộ đệm có thể tăng đáng kể hiệu suất dịch vụ. Thông qua các biện pháp này, dịch vụ web cuối cùng sẽ đạt được hiệu quả, khả năng phản hồi nhanh hơn và chức năng tổng thể được nâng cao.


Các bước chính :

  1. Tối ưu hóa các truy vấn cơ sở dữ liệu và tránh chỉ dựa vào việc triển khai ORM.
  2. Sử dụng các lớp phẳng để giảm mức sử dụng bộ nhớ và tăng tốc độ phản hồi.
  3. Xác định loại dữ liệu bằng cách phân loại chúng là Nóng, Ấm hoặc Lạnh.
  4. Sử dụng các chiến lược cụ thể phù hợp với từng loại dữ liệu được xác định.