Kiểm tra tải và kiểm tra sức chịu đựng: Sự khác biệt, số liệu và ví dụ về k6
Một chứng minh hệ thống của bạn xử lý lưu lượng truy cập mà bạn mong đợi. Người còn lại tìm ra nơi nó bị hỏng và cách nó phục hồi. Tìm hiểu khi nào nên chạy từng cái, những con số nào đáng tin cậy và cách lên kế hoạch cho một bài kiểm tra đưa ra câu trả lời thực sự.
- Kiểm tra tải kiểm tra xem hệ thống có đáp ứng được mục tiêu trong lưu lượng truy cập dự kiến hay không.
- Kiểm tra sức chịu đựng đẩy công suất vượt quá để tìm ra điểm đột phá và nghiên cứu khả năng phục hồi.
- Các công cụ thường giống nhau. Điều khác biệt là mục tiêu và mô hình lưu lượng truy cập.
- Đánh giá kết quả bằng các phần trăm như p95 và p99, vì mức trung bình có thể che giấu các vấn đề nghiêm trọng.
Ứng dụng của bạn hoạt động hoàn hảo với mười người dùng. Điều gì xảy ra vào ngày bán hàng với mười nghìn? Thử nghiệm tải và kiểm tra căng thẳng mô tả hai cách khác nhau để trả lời câu hỏi đó và việc trộn lẫn chúng sẽ dẫn đến các thử nghiệm không chứng minh được những gì bạn nghĩ.
Hướng dẫn này giải thích nội dung của từng loại, các loại xét nghiệm liên quan và cách đọc kết quả. Chúng tôi đã chạy phép tính phần trăm nhỏ bên dưới trên Python 3.13, với các số được mô phỏng. Các tập lệnh k6 là các ví dụ minh họa mà chúng tôi không thực thi và số lượng người dùng cũng như mục tiêu được phát minh ra, vì vậy hãy thay thế chúng bằng tập lệnh của riêng bạn. Chỉ chạy các thử nghiệm này đối với các hệ thống mà bạn sở hữu hoặc có quyền kiểm tra, vì lưu lượng truy cập lớn có thể giống như một cuộc tấn công và gây ra tình trạng ngừng hoạt động thực sự.
Câu trả lời ngắn gọn
Thử nghiệm tải hỏi: liệu chúng tôi có thể xử lý lưu lượng truy cập mà chúng tôi mong đợi và đạt được mục tiêu khi thực hiện việc đó không? Bài kiểm tra căng thẳng hỏi: chúng ta có thể mất bao nhiêu trước khi thất bại, chúng ta thất bại như thế nào và chúng ta phục hồi nhanh như thế nào?
Hãy nghĩ về một cây cầu. Kiểm tra tải trọng cho số lượng xe tải dự kiến đi qua và xác nhận rằng nó ổn. Bài kiểm tra căng thẳng tiếp tục tăng thêm sức nặng để tìm hiểu giới hạn của nó và liệu nó có đưa ra cảnh báo trước hay không. May mắn thay, việc phá vỡ phần mềm lại rẻ hơn so với việc phá một cây cầu.
Kiểm tra tải và kiểm tra căng thẳng cạnh nhau
| Khía cạnh | Kiểm tra tải | Kiểm tra căng thẳng |
|---|---|---|
| Câu hỏi chính | Chúng ta có đạt được mục tiêu ở mức tải dự kiến không? | Chúng ta phá vỡ ở đâu và như thế nào? |
| Mức độ giao thông | Bình thường đến mức cao nhất dự kiến | Vượt đỉnh dự kiến |
| mẫu | Tăng tốc, giữ vững | Tiếp tục tăng cho đến khi thất bại |
| Thất bại | Một thử nghiệm thất bại | Kết quả mong đợi |
| Số liệu chính | Thời gian đáp ứng, thông lượng, lỗi | Điểm dừng, chế độ lỗi, thời gian phục hồi |
| Thời gian điển hình | Trước mỗi lần phát hành hoặc sự kiện lớn | Sau khi hệ thống ổn định dưới tải |
| kết quả | Vượt qua hoặc thất bại trước các mục tiêu | Giới hạn dung lượng và danh sách điểm yếu |
Kiểm tra tải là gì?
Kiểm tra tải mô phỏng lưu lượng truy cập thực tế mà bạn mong đợi và đo lường cách hệ thống hoạt động. Nó cần một mục tiêu để kiểm tra, ví dụ: “với 500 người dùng đồng thời, 95% yêu cầu thanh toán kết thúc trong vòng 800 mili giây, với dưới 1% lỗi”.
Đây là cách nó có thể trông giống như một tập lệnh k6. Các bài kiểm tra k6 được viết bằng JavaScript và thresholds biến mục tiêu của bạn thành kết quả đạt hoặc không đạt:
import http from "k6/http";
import { sleep } from "k6";
export const options = {
stages: [
{ duration: "5m", target: 500 }, // ramp up
{ duration: "20m", target: 500 }, // hold at expected peak
{ duration: "2m", target: 0 }, // ramp down
],
thresholds: {
http_req_duration: ["p(95)<800"],
http_req_failed: ["rate<0.01"],
},
};
export default function () {
http.get("https://staging.example.com/products");
sleep(1); // think time, as real users pause
}
sleep quan trọng. Không cần thời gian suy nghĩ, mỗi người dùng ảo sẽ truy cập máy chủ liên tục, tạo ra lưu lượng truy cập nhiều hơn so với cùng số lượng người thật.
Kiểm tra căng thẳng là gì?
Kiểm tra căng thẳng có chủ ý vượt quá mức mong đợi. Bạn không cố gắng vượt qua. Bạn muốn có câu trả lời cho những câu hỏi như:
- Hiệu suất bắt đầu suy giảm ở mức độ nào?
- Thành phần nào bị lỗi đầu tiên: cơ sở dữ liệu, máy chủ ứng dụng hoặc lệnh gọi của bên thứ ba?
- Nó có bị lỗi với các lỗi rõ ràng hay bị treo và mất dữ liệu?
- Nó có tự phục hồi khi lưu lượng truy cập giảm không?
export const options = {
stages: [
{ duration: "5m", target: 500 }, // expected peak
{ duration: "5m", target: 1000 }, // beyond it
{ duration: "5m", target: 2000 }, // further
{ duration: "5m", target: 4000 }, // likely to break
{ duration: "10m", target: 0 }, // recovery: does it come back?
],
};
Giai đoạn phục hồi cuối cùng đó thường bị lãng quên và có thể là giai đoạn có giá trị nhất. Một hệ thống xử lý lỗi tốt nhưng không bao giờ phục hồi nếu không khởi động lại thủ công vẫn đồng nghĩa với việc mất điện để ai đó khắc phục vào lúc nửa đêm. Lý tưởng nhất là dưới mức tải cực lớn, hệ thống sẽ loại bỏ công việc một cách có kiểm soát, trả về 503 phản hồi rõ ràng thay vì hết thời gian chờ.
Spike, ngâm và các loại khác
Kiểm tra tải và căng thẳng thuộc nhóm kiểm tra hiệu suất rộng hơn:
| Loại | mẫu | Những gì nó tìm thấy |
|---|---|---|
| Khói (hiệu suất) | Một vài người dùng, một thời gian ngắn | Liệu kịch bản và hệ thống có hoạt động hay không |
| Tải | Đỉnh dự kiến, được tổ chức | Liệu mục tiêu có được đáp ứng hay không |
| căng thẳng | Tăng công suất quá khứ | Giới hạn và chế độ thất bại |
| gai | Nhảy đột ngột rồi rơi xuống | Tự động chia tỷ lệ và hành vi xếp hàng |
| Ngâm (sức chịu đựng) | Tải bình thường trong nhiều giờ | Rò rỉ bộ nhớ, hết kết nối |
| công suất | tăng dần | Tải tối đa trong mục tiêu của bạn |
Các bài kiểm tra Ngâm nắm bắt được các vấn đề mà các bài kiểm tra ngắn không bao giờ nhìn thấy. Một rò rỉ bộ nhớ nhỏ có thể trông vô hại trong 20 phút và chỉ khiến dịch vụ ngừng hoạt động sau hai ngày. Thử nghiệm tăng đột biến phù hợp với các sự kiện như bán hàng chớp nhoáng, nơi lưu lượng truy cập không tăng dần.
Số liệu quan trọng
| Số liệu | Ý nghĩa | Theo dõi |
|---|---|---|
| Thời gian phản hồi (phần trăm) | Yêu cầu mất bao lâu | p95 và p99 đang tăng |
| Thông lượng | Yêu cầu được xử lý mỗi giây | Làm phẳng khi người dùng tăng lên |
| Tỷ lệ lỗi | Tỷ lệ yêu cầu không thành công | Bất kỳ sự gia tăng đột ngột |
| CPU và bộ nhớ | Sử dụng tài nguyên máy chủ | Bão hòa hoặc tăng trưởng ổn định |
| Cơ sở dữ liệu | Truy vấn chậm, sử dụng nhóm kết nối | Bể bơi cạn kiệt, khóa chờ |
| Độ sâu hàng đợi | Công việc đang chờ xử lý | Tăng trưởng không bao giờ cạn kiệt |
Tại sao mức trung bình đánh lừa
Mức trung bình che giấu những yêu cầu chậm mà người thật phàn nàn. Để hiển thị điều này, chúng tôi đã tạo 100 thời gian phản hồi mô phỏng, trong đó 95 thời gian phản hồi nhanh (80 đến 200 mili giây) và 5 thời gian phản hồi rất chậm (2,5 đến 4 giây), sau đó tính toán số liệu thống kê chung:
import math, random, statistics
random.seed(3)
times = [random.randint(80, 200) for _ in range(95)] \
+ [random.randint(2500, 4000) for _ in range(5)]
def pct(values, p):
values = sorted(values)
return values[math.ceil(p / 100 * len(values)) - 1]
print("avg", round(statistics.mean(times)), "p50", pct(times, 50),
"p95", pct(times, 95), "p99", pct(times, 99), "max", max(times))
# avg 302 p50 150 p95 199 p99 3740 max 3896
Hãy nhìn kỹ vào những con số đó. Trung bình 302 ms không mô tả được ai. Các yêu cầu thông thường mất khoảng 150 mili giây, trong khi các yêu cầu chậm mất hơn 3 giây. Ngay cả p95 trông vẫn ổn ở tốc độ 199 ms và chỉ p99 mới bộc lộ vấn đề. Một con số như p95 có nghĩa là 95% yêu cầu nhanh hoặc nhanh hơn.
Và một phần trăm yêu cầu không phải là một sự kiện hiếm gặp. Nếu một trang thực hiện 50 yêu cầu, tốc độ p99 chậm sẽ ảnh hưởng đến phần lớn lượt xem trang. Đặt mục tiêu theo phần trăm quan trọng đối với bạn và xem xét nhiều mục tiêu cùng nhau.
Mẹo: Hãy tìm “đầu gối” trong biểu đồ của bạn. Khi tải tăng, thời gian phản hồi không thay đổi trong một thời gian, sau đó đột ngột tăng lên, trong khi thông lượng ngừng tăng. Điểm đó chính là năng lực thực tế của bạn, và nó thường diễn ra tốt đẹp trước khi mọi thứ thực sự sụp đổ.
Công cụ
| Công cụ | Viết kịch bản | Được biết đến với |
|---|---|---|
| k6 | JavaScript | Thân thiện với nhà phát triển, ngưỡng phù hợp với CI |
| JMeter | GUI và XML | Trưởng thành, hỗ trợ nhiều giao thức |
| Gatling | Scala, Java, Kotlin và những thứ khác | Dựa trên mã, hiệu quả |
| châu chấu | Python | Hành vi người dùng đơn giản, dựa trên Python |
Bất kỳ trong số này có thể chạy cả kiểm tra tải và căng thẳng. Chọn một thứ phù hợp với kỹ năng của nhóm bạn thay vì chạy theo danh sách tính năng. Để sử dụng một trong quy trình của bạn, hãy xem CI/CD là gì.
Cách lập kế hoạch kiểm tra
- Đặt mục tiêu. Sử dụng số liệu phân tích thực tế để tìm lưu lượng truy cập cao nhất của bạn và xác định mục tiêu.
- Chọn hành trình. Lập mô hình hành vi thực tế của người dùng, chẳng hạn như duyệt qua, tìm kiếm và thanh toán, theo tỷ lệ thực tế. Chỉ nhấn vào trang chủ chứng tỏ ít.
- Sử dụng môi trường thực tế. Một máy chủ chạy thử nhỏ không thể dự đoán quá trình sản xuất. Lưu ý bất kỳ sự khác biệt.
- Chuẩn bị dữ liệu. Sử dụng khối lượng thực tế vì một truy vấn nhanh trên 100 hàng có thể thu thập dữ liệu trên 10 triệu.
- Cảnh báo mọi người. Hãy thông báo cho nhóm vận hành của bạn và bất kỳ bên thứ ba nào và đừng vô tình kiểm tra nhà cung cấp dịch vụ thanh toán. Mô phỏng các dịch vụ bên ngoài khi thích hợp.
- Bắt đầu từ quy mô nhỏ. Trước tiên hãy chạy thử nghiệm khói nhỏ để xác nhận rằng tập lệnh của bạn hoạt động.
- Giám sát mọi thứ. Nếu không có số liệu máy chủ, bạn sẽ thấy rằng tốc độ chậm lại chứ không phải tại sao.
- Lặp lại. Chạy lại sau mỗi lần sửa và giữ đường cơ sở để so sánh.
Đọc kết quả
| Triệu chứng | Nguyên nhân có thể |
|---|---|
| Phản hồi chậm nhưng CPU thấp | Đang chờ trên cơ sở dữ liệu, khóa hoặc dịch vụ bên ngoài |
| CPU cơ sở dữ liệu cao | Thiếu chỉ mục hoặc truy vấn không hiệu quả |
| Lỗi kết nối đột ngột | Đã đạt đến giới hạn nhóm kết nối hoặc tệp |
| Trí nhớ tăng dần | Rò rỉ hoặc bộ nhớ đệm không giới hạn |
| CPU máy phát tải ở mức cao | Công cụ kiểm tra là nút thắt cổ chai, không phải hệ thống của bạn |
Cơ sở dữ liệu là một nút thắt cổ chai phổ biến, vì vậy nếu truy vấn là vấn đề, hãy đọc hướng dẫn của chúng tôi về Tối ưu hóa truy vấn SQL. Hàng cuối cùng của bảng là một cái bẫy quan trọng: luôn kiểm tra tình trạng của máy tạo ra tải.
Những lỗi thường gặp
- Gây nhầm lẫn cho người dùng với các yêu cầu. Hãy làm rõ liệu mục tiêu có nghĩa là người dùng đồng thời hay yêu cầu mỗi giây.
- Bỏ qua thời gian suy nghĩ. Điều này làm tăng lưu lượng truy cập và đưa ra kết quả sai lệch.
- Thử nghiệm quá muộn. Một tuần trước khi ra mắt sẽ không có thời gian để khắc phục các vấn đề về kiến trúc.
- Sử dụng một điểm cuối duy nhất. Lưu lượng truy cập thực kết hợp giữa đọc, ghi và tìm kiếm.
- Bộ nhớ đệm ẩn mọi thứ. Các yêu cầu lặp lại giống hệt nhau chỉ có thể kiểm tra bộ nhớ đệm của bạn, vì vậy hãy thay đổi dữ liệu.
- Thử nghiệm một lần. Hiệu suất thay đổi theo mỗi lần phát hành, vì vậy hãy chạy thử nghiệm thường xuyên.
Lời kết
Chạy thử nghiệm tải để xác nhận rằng bạn có thể xử lý lưu lượng truy cập mà bạn mong đợi và chạy thử nghiệm căng thẳng để tìm hiểu điều gì sẽ xảy ra khi bạn không thể. Bắt đầu từ việc nhỏ: chọn hành trình người dùng quan trọng nhất của bạn, đặt một mục tiêu rõ ràng và chạy thử nghiệm ngắn theo giai đoạn có bật tính năng giám sát. Lần chạy đầu tiên đó thường dạy cho bạn điều gì đó và bạn có thể xây dựng từ đó.
Câu hỏi thường gặp
Sự khác biệt chính giữa kiểm tra tải và căng thẳng là gì?
Kiểm tra tải sẽ kiểm tra hành vi theo lưu lượng truy cập dự kiến so với các mục tiêu đã đặt. Kiểm tra căng thẳng vượt quá khả năng tìm ra điểm đột phá và cách hệ thống phục hồi.
Tôi nên chạy thử nghiệm tải hay thử nghiệm căng thẳng trước?
Tải thử nghiệm đầu tiên. Sau khi hệ thống đáp ứng được mục tiêu về lưu lượng truy cập dự kiến, hãy chạy các bài kiểm tra căng thẳng để khám phá các giới hạn của nó. Kết quả căng thẳng có ý nghĩa rất nhỏ đối với một hệ thống không ổn định.
Sự khác biệt giữa bài kiểm tra căng thẳng và bài kiểm tra tăng đột biến là gì?
Stress test thường tăng tải từng bước cho đến khi thất bại. Thử nghiệm đột biến đột ngột nhảy lên mức cao để xem hệ thống đối phó với sự thay đổi đột ngột như thế nào.
Thời gian phản hồi p95 là gì?
Điều đó có nghĩa là 95% yêu cầu đã hoàn thành vào hoặc thấp hơn thời điểm đó. Nó mô tả trải nghiệm của hầu hết người dùng tốt hơn mức trung bình.
Tôi có thể chạy thử tải trên sản phẩm không?
Bạn có thể, nhưng cẩn thận, với sự cho phép, giám sát và cách ngăn chặn nhanh chóng. Hầu hết các nhóm đều bắt đầu với môi trường dàn dựng giống như môi trường sản xuất để giảm thiểu rủi ro cho người dùng thực.
Tiếp tục học hỏi
Cần trợ giúp về kiểm tra, WordPress hoặc SEO?
Chúng tôi giúp các nhóm phát triển phần mềm tốt hơn và phát triển trang web của họ. Hãy cho chúng tôi biết bạn đang làm gì và chúng tôi sẽ đề xuất bước tiếp theo rõ ràng.
Thêm hướng dẫn về thử nghiệm, AI và phát triển hiện đại
Bạn thích bài viết này? Chọn một chủ đề và chuyển ngay sang phần hướng dẫn mới nhất của chúng tôi.
Giải thích về ảo giác AI: Tại sao các mô hình ngôn ngữ lại tạo nên mọi thứ và cách giảm thiểu nó
Ảo giác AI đã giải thích: chúng là gì, tại sao mô hình ngôn ngữ tạo ra chúng, các loại phổ biến, cách giảm thiểu chúng bằng cách căn cứ và nhắc nhở …
Đọc bài viết →DevOpsGiải thích về các biến môi trường: Tệp .env, bí mật và cấu hình được thực hiện đúng
Các biến môi trường được giải thích bằng các ví dụ Python mà chúng tôi đã chạy: đọc và thiết lập chúng, tại sao mọi giá trị đều là một chuỗi, tệp .e…
Đọc bài viết →Phát triển phần mềmGiải thích về giới hạn tỷ lệ API: Thuật toán, tiêu đề và xử lý lỗi 429
Giới hạn tốc độ API được giải thích bằng mô phỏng mà chúng tôi đã chạy: nhóm mã thông báo, cửa sổ cố định, cửa sổ trượt, 429 phản hồi, tiêu đề giới …
Đọc bài viết →Tự động hóa kiểm thửChế giễu bằng Python: unittest.mock, patch và những sai lầm khiến bài kiểm tra nói dối
Mô phỏng bằng Python với unittest.mock, đã được thử nghiệm: Mock và return_value, side_effect, vá lỗi nơi sử dụng tên, thông số kỹ thuật và thông số…
Đọc bài viết →Kiểm thử phần mềmGiải thích về phạm vi bảo hiểm của mã: Phạm vi tuyến so với chi nhánh và ý nghĩa thực sự 100%
Phạm vi bảo hiểm mã được giải thích bằng cách chạy phạm vi bảo hiểm thực tế: phạm vi bảo hiểm dòng, chi nhánh và điều kiện, đọc báo cáo, lý do tại s…
Đọc bài viết →Cơ sở dữ liệu & SQLDELETE vs TRUNCATE vs DROP trong SQL: Sự khác biệt, khôi phục và thời điểm sử dụng mỗi loại
DELETE vs TRUNCATE vs DROP được giải thích bằng SQL đã được thử nghiệm: mỗi loại loại bỏ, khôi phục, kích hoạt, đặt lại danh tính, tốc độ và Postgre…
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích về Chế độ xem SQL: Tạo, sử dụng và tránh những cạm bẫy, kèm theo ví dụ
Chế độ xem SQL được giải thích bằng các truy vấn chúng tôi đã chạy: tạo chế độ xem, kết quả trực tiếp, ẩn cột, hiệu suất, chế độ xem có thể cập nhật…
Đọc bài viết →Phát triển phần mềmGiao diện TypeScript so với loại: Sự khác biệt thực sự, được thử nghiệm bằng trình biên dịch
Giao diện TypeScript so với loại, được kiểm tra bằng trình biên dịch thực: cả hai có thể làm gì, chỉ một người có thể làm gì, hợp nhất khai báo, mở …
Đọc bài viết →Phát triển phần mềmGiải thích về Python *args và **kwargs: Hàm linh hoạt với ví dụ rõ ràng
Python *args và **kwargs được giải thích bằng mã chúng tôi đã chạy: đóng gói và giải nén, thứ tự tham số, đối số chỉ từ khóa và chỉ vị trí, trình tr…
Đọc bài viết →Phát triển phần mềmHàm Lambda của Python: Cú pháp, cách sử dụng thực tế và khi nào không nên sử dụng chúng
Các hàm lambda của Python được giải thích bằng mã chúng tôi đã chạy: cú pháp, sắp xếp bằng khóa, bản đồ và bộ lọc, các phần đóng, bẫy liên kết muộn …
Đọc bài viết →Trí tuệ nhân tạoĐại lý AI là gì? Cách chúng hoạt động, với vòng lặp tác nhân đơn giản, bạn có thể chạy
Tác nhân AI là gì? Hướng dẫn đơn giản về vòng lặp tác nhân, công cụ, bộ nhớ và lan can, với một vòng lặp Python nhỏ mà chúng tôi đã chạy, những rủi …
Đọc bài viết →DevOpsGiám sát và Khả năng quan sát: Sự khác biệt thực sự, với nhật ký, số liệu và dấu vết
Giải thích về giám sát và khả năng quan sát: lỗi đã biết và chưa biết, nhật ký, số liệu và dấu vết, hướng dẫn về sự cố thanh toán, tín hiệu vàng, Op…
Đọc bài viết →DevOpsDocker Volumes vs Bind Mounts: Duy trì dữ liệu vùng chứa đúng cách
Giải thích về khối lượng Docker và liên kết gắn kết: tại sao dữ liệu vùng chứa biến mất, khối lượng được đặt tên, liên kết gắn kết, tmpfs, ví dụ về …
Đọc bài viết →Tự động hóa kiểm thửTDD vs BDD: Key Differences, One Feature Built Both Ways and When to Use Each
TDD và BDD được giải thích bằng một tính năng giảm giá được xây dựng theo cả hai cách: tái cấu trúc màu đỏ-xanh với mã chúng tôi đã chạy, kịch bản C…
Đọc bài viết →Kiểm thử phần mềmKiểm tra chấp nhận của người dùng (UAT): Quy trình, danh sách kiểm tra và ví dụ thực tế
Giải thích về thử nghiệm chấp nhận của người dùng: ai chạy nó, nó khác với QA như thế nào, quy trình bảy bước, mẫu trường hợp thử nghiệm UAT, danh s…
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích về các giá trị NULL của SQL: IS NULL, COALESCE, NULLIF và những cái bẫy cần tránh
Các giá trị SQL NULL được giải thích bằng các truy vấn chúng tôi đã chạy: logic ba giá trị, IS NULL, COALESCE, NULLIF, cách tổng hợp, kết hợp và sắp…
Đọc bài viết →Cơ sở dữ liệu & SQLCâu lệnh SQL CASE WHEN: Cú pháp, ví dụ thực tế và các lỗi thường gặp
TRƯỜNG HỢP SQL KHI được giải thích bằng các truy vấn mà chúng tôi đã chạy: các biểu mẫu đơn giản và được tìm kiếm, thứ tự điều kiện, các thủ thuật S…
Đọc bài viết →Phát triển phần mềmJWT là gì? Mã thông báo Web JSON được giải thích bằng một ví dụ hoạt động
JWT là gì? Mã thông báo Web JSON đã giải thích: ba phần, mã thông báo được xây dựng và giả mạo trong mã chúng tôi đã chạy, JWT so với phiên, lưu trữ…
Đọc bài viết →Phát triển phần mềmGiải thích về vòng lặp sự kiện JavaScript: Ngăn xếp cuộc gọi, Microtask và bộ hẹn giờ kèm ví dụ
Vòng lặp sự kiện JavaScript được giải thích bằng mã chúng tôi đã chạy: ngăn xếp cuộc gọi, hàng đợi tác vụ và vi nhiệm, tại sao setTimeout 0 không di…
Đọc bài viết →Phát triển phần mềmGiải thích về trình tạo và năng suất của Python: Tiết kiệm bộ nhớ bằng các ví dụ thực tế
Trình tạo và lợi nhuận Python được giải thích bằng mã chúng tôi đã chạy: cách chúng tạm dừng và tiếp tục, đo mức tiết kiệm bộ nhớ, quy trình, chuỗi …
Đọc bài viết →Trí tuệ nhân tạoNhúng là gì? Giải thích sự tương đồng về vectơ và Cosine một cách đơn giản
nhúng là gì? Hướng dẫn bằng ngôn ngữ đơn giản về vectơ, độ tương tự cosine và tìm kiếm ngữ nghĩa, với một ví dụ nhỏ mà chúng tôi đã chạy, các cách s…
Đọc bài viết →DevOpsTriển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn
Giải thích về triển khai Blue-green và Canary: cách hoạt động của từng loại, chi phí, rủi ro và khôi phục, nhóm người dùng ổn định mà chúng tôi đã t…
Đọc bài viết →Tự động hóa kiểm thửKiểm tra không ổn định: Nguyên nhân gây ra chúng và cách khắc phục chúng vĩnh viễn
Các thử nghiệm không ổn định được giải thích bằng các bản demo mà chúng tôi đã chạy: nguyên nhân chính, cách xác nhận và chẩn đoán nguyên nhân, cách…
Đọc bài viết →Kiểm thử phần mềmKiểm tra tải và kiểm tra căng thẳng: Sự khác biệt, số liệu và ví dụ về k6
Giải thích về thử nghiệm tải và thử nghiệm căng thẳng: mỗi thử nghiệm chứng minh điều gì, thử nghiệm tăng đột biến và ngâm, số liệu quan trọng, lý d…
Đọc bài viết →Kiểm thử phần mềmTrường hợp thử nghiệm và kịch bản thử nghiệm: Sự khác biệt chính, ví dụ và thời điểm sử dụng từng trường hợp
Giải thích trường hợp kiểm thử và kịch bản kiểm thử: định nghĩa rõ ràng, bảng cạnh nhau, một tính năng đặt lại mật khẩu được lấy từ các tình huống n…
Đọc bài viết →Cơ sở dữ liệu & SQLTối ưu hóa truy vấn SQL: Đọc kế hoạch thực thi và sửa các truy vấn chậm, có tính thời gian
Đã thử nghiệm tối ưu hóa truy vấn SQL trên một triệu hàng: đọc kế hoạch thực hiện, thêm chỉ mục phù hợp, sửa các bộ lọc không thể mở rộng, sử dụng c…
Đọc bài viết →Cơ sở dữ liệu & SQLSQL UNION và UNION ALL: Sự khác biệt, ví dụ và hiệu suất đã được kiểm tra
SQL UNION và UNION ALL được giải thích bằng các truy vấn chúng tôi đã chạy: trùng lặp, cả hai quy tắc đều tuân theo, lỗi dữ liệu thực, hiệu suất đượ…
Đọc bài viết →Phát triển phần mềmHướng dẫn API tìm nạp JavaScript: GET, POST, Xử lý lỗi và hết thời gian chờ
Hướng dẫn API tìm nạp JavaScript đã được thử nghiệm trên máy chủ cục bộ: GET và POST, tại sao 404 không gửi, trình trợ giúp có thể sử dụng lại, chuỗ…
Đọc bài viết →Phát triển phần mềmXử lý tệp Python: Đọc, ghi, CSV, JSON và pathlib kèm ví dụ
Việc xử lý tệp Python được giải thích bằng mã chúng tôi đã chạy: chế độ mở, với, đọc tệp lớn, CSV, JSON, pathlib, tệp nhị phân, ghi an toàn, xử lý l…
Đọc bài viết →Phát triển phần mềmGit merge vs rebase: khác biệt, ví dụ và khi nào dùng cái nào
Git merge vs rebase được giải thích bằng đầu ra log thực tế, bảng so sánh, quy tắc vàng của rebase và quy trình làm việc nhóm an toàn.
Đọc bài viết →Phát triển phần mềmList comprehension trong Python: cú pháp, ví dụ và khi nào nên tránh
List comprehension trong Python: cú pháp, lọc dữ liệu, if-else, vòng lặp lồng nhau, thời gian đo thực tế và khi nào vòng lặp for thông thường tốt hơn.
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích SQL JOIN kèm ví dụ (Inner, Left, Right, Full)
Hiểu SQL JOIN từng bước với bảng và truy vấn mẫu: INNER, LEFT, RIGHT, FULL, CROSS và SELF, cùng lỗi thường gặp và mẹo hiệu năng.
Đọc bài viết →