Triển khai Blue-Green và Canary: Sự khác biệt, sự đánh đổi và cách lựa chọn
Cả hai chiến lược đều cho phép bạn phát hành mà không làm sập trang web, nhưng chúng quản lý rủi ro theo những cách trái ngược nhau. Tìm hiểu cách thức hoạt động của từng cái, chi phí thực sự của nó, cách xử lý cơ sở dữ liệu và cái nào phù hợp với nhóm của bạn.
- Xanh lam giữ hai môi trường đầy đủ và chuyển đổi tất cả lưu lượng truy cập cùng một lúc.
- Canary trước tiên gửi phiên bản mới tới một bộ phận nhỏ người dùng, sau đó mở rộng dần dần.
- Màu xanh lam cung cấp khả năng khôi phục rất nhanh. Canary giới hạn số lượng người dùng mà một bản phát hành kém có thể ảnh hưởng.
- Cả hai đều phụ thuộc vào những thay đổi cơ sở dữ liệu tương thích ngược và khả năng giám sát tốt.
Việc phát hành phần mềm thường có nghĩa là một cửa sổ bảo trì và các ngón tay chéo. Các nhóm hiện đại sử dụng các chiến lược giúp phát hành thường xuyên và lựa chọn xanh lam và triển khai hoàng yến là một trong những lựa chọn đầu tiên bạn sẽ phải đối mặt. Cả hai đều giảm thiểu rủi ro, nhưng chúng làm như vậy theo những cách trái ngược nhau: một bên chuẩn bị thay thế hoàn toàn, trong khi bên kia thử nghiệm từng chút một với người dùng thực.
Hướng dẫn này giải thích cách thức hoạt động của từng loại và chi phí trong thực tế. Chúng tôi đã chạy các ví dụ khôi phục và định tuyến người dùng nhỏ trong Python 3.13 và kết quả đầu ra là từ lần chạy đó. Các mẫu Kubernetes chỉ mang tính minh họa và chúng tôi không chạy những mẫu đó. Hãy coi tỷ lệ phần trăm và ngưỡng làm ví dụ bắt đầu để thích ứng.
Câu trả lời ngắn gọn
Với triển khai xanh lam, bạn chạy hai môi trường sản xuất giống hệt nhau. Một cái phục vụ người dùng trong khi bạn triển khai và thử nghiệm phiên bản mới trên cái kia, sau đó bạn chuyển đổi tất cả lưu lượng truy cập chỉ trong một lần di chuyển.
Với triển khai canary, phiên bản mới sẽ chạy bên cạnh phiên bản cũ. Bạn gửi cho nó một tỷ lệ nhỏ lưu lượng truy cập thực, so sánh kết quả và tăng dần lượt chia sẻ cho đến khi nó phục vụ được tất cả mọi người. Cái tên này xuất phát từ những người thợ mỏ chim hoàng yến từng được sử dụng như một cảnh báo sớm về mối nguy hiểm.
Xanh lam và hoàng yến cạnh nhau
| Khía cạnh | Xanh lam | chim hoàng yến |
|---|---|---|
| Chuyển đổi giao thông | Tất cả cùng một lúc | dần dần |
| Người dùng gặp phải bản phát hành xấu | Tất cả, cho đến khi bạn chuyển trở lại | Chỉ có chim hoàng yến chia sẻ |
| Khôi phục | Chuyển lưu lượng truy cập trở lại | Đặt chia sẻ canary về 0 |
| Tốc độ phát hành | Chuyển đổi nhanh | Chậm hơn, theo từng giai đoạn |
| Chi phí cơ sở hạ tầng | Tăng gấp đôi trong thời gian phát hành | Một chia sẻ thêm nhỏ |
| Cần định tuyến lưu lượng | Một công tắc đơn giản | Định tuyến dựa trên tỷ lệ phần trăm |
| Cần theo dõi | Tốt | Tuyệt vời, với số liệu trên mỗi phiên bản |
| Các phiên bản sống cùng nhau | Tóm lại, nếu có | Đối với toàn bộ quá trình triển khai |
| Phản hồi của người dùng thực trước khi phát hành đầy đủ | Không | Có |
Cách triển khai xanh lam hoạt động
- Blue đang hoạt động và phục vụ mọi lưu lượng truy cập.
- Triển khai phiên bản mới lên green, phiên bản này không nhận được lưu lượng truy cập của người dùng.
- Kiểm tra màu xanh lá cây một cách kỹ lưỡng, trong môi trường sản xuất thực tế, sử dụng thử nghiệm khói và người dùng nội bộ.
- Chuyển bộ định tuyến, bộ cân bằng tải hoặc DNS để gửi lưu lượng truy cập sang màu xanh lục.
- Hãy quan sát kỹ, màu xanh vẫn đang chạy và sẵn sàng.
- Nếu có gì sai sót thì hãy quay lại. Nếu mọi việc đều ổn, màu xanh lam sẽ trở thành môi trường nhàn rỗi tiếp theo.
Trong Kubernetes, bạn có thể thực hiện chuyển đổi bằng cách thay đổi bộ chọn của Dịch vụ để lưu lượng truy cập chuyển sang các Nhóm được gắn nhãn khác nhau:
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
version: green # was: blue
ports:
- port: 80
targetPort: 8000
Điểm mạnh: Về mặt khái niệm, nó đơn giản, bạn có thể kiểm tra thiết lập sản xuất chính xác trước khi người dùng nhìn thấy và quá trình khôi phục gần như ngay lập tức. Điểm yếu: Cơ sở hạ tầng trùng lặp có thể tốn kém, một lỗi lọt qua quá trình kiểm tra của bạn sẽ đến với mọi người cùng một lúc và các phiên mở cũng như công việc trên chuyến bay cần được lưu ý trong quá trình chuyển đổi. Nếu bạn sử dụng DNS cho bộ chuyển đổi, các bản ghi được lưu trong bộ nhớ đệm có thể làm chậm quá trình chuyển đổi. Mới đối với các khái niệm? Xem Hướng dẫn Kubernetes dành cho người mới bắt đầu của chúng tôi.
Cách triển khai canary hoạt động
- Triển khai phiên bản mới cùng với phiên bản ổn định.
- Định tuyến một phần nhỏ lưu lượng truy cập, chẳng hạn như 5%, tới canary.
- So sánh tỷ lệ lỗi, độ trễ và số liệu kinh doanh với phiên bản ổn định.
- Nếu khỏe mạnh thì tăng lên 25%, rồi 50%, rồi 100%.
- Nếu có bất cứ điều gì xuống cấp, hãy gửi tất cả lưu lượng truy cập trở lại phiên bản ổn định.
Nhiều nhóm bắt đầu với đội ngũ nhân viên nội bộ, sau đó là khu vực có rủi ro thấp và chỉ sau đó là công chúng rộng rãi hơn.
Điểm mạnh: Một bản phát hành kém chỉ ảnh hưởng đến một nhóm nhỏ và bạn học được từ lưu lượng truy cập thực mà không môi trường thử nghiệm nào có thể tái tạo đầy đủ. Điểm yếu: Bạn cần các chỉ số định tuyến và mỗi phiên bản dựa trên tỷ lệ phần trăm, quá trình triển khai mất nhiều thời gian hơn và hai phiên bản chạy cùng nhau trong một thời gian. Một con chim hoàng yến nhỏ cũng có thể quá yên tĩnh để đưa ra tín hiệu có ý nghĩa, đặc biệt là vào những thời điểm có ít phương tiện giao thông.
Định tuyến người dùng ổn định
Việc chọn ngẫu nhiên một phiên bản theo mọi yêu cầu sẽ mang lại cho người dùng trải nghiệm khó hiểu vì họ có thể chuyển đổi giữa phiên bản cũ và phiên bản mới. Một giải pháp phổ biến là băm ID người dùng ổn định vào một nhóm để mỗi người dùng luôn nhận được cùng một câu trả lời:
import hashlib
def bucket(user_id):
digest = hashlib.sha256(user_id.encode()).hexdigest()
return int(digest, 16) % 100
def version_for(user_id, canary_percent):
return "v2" if bucket(user_id) < canary_percent else "v1"
users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
print(percent, round(share * 100, 1))
# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0
Cổ phiếu thực tế bám sát mục tiêu. Phương pháp này có thêm hai thuộc tính hữu ích và lần chạy của chúng tôi đã xác nhận cả hai thuộc tính này. Cùng một người dùng luôn nhận được cùng một phiên bản. Và tất cả mọi người trong nhóm 5% vẫn được bao gồm ở mức 25%, vì vậy không ai đã có phiên bản mới được chuyển trở lại khi đợt triển khai tăng lên.
Trong các hệ thống thực, lưới dịch vụ, bộ cân bằng tải hoặc công cụ như Argo Rollouts hoặc Flagger thường xử lý việc định tuyến này, do đó bạn không cần phải tự viết nó. Nó vẫn hữu ích để hiểu những gì họ đang làm.
Tự động hóa quyết định
Chim hoàng yến chỉ hoạt động nếu ai đó thực sự so sánh các phiên bản. Kiểm tra tự động đáng tin cậy hơn một người xem biểu đồ. Đây là ý tưởng cốt lõi, so sánh tỷ lệ lỗi của canary với phiên bản ổn định:
def should_rollback(canary_errors, canary_total, base_errors, base_total,
tolerance=1.5, min_requests=500):
if canary_total < min_requests:
return False # not enough data to decide
return (canary_errors / canary_total) > (base_errors / base_total) * tolerance
should_rollback(3, 100, 10, 5000) # False: too few requests
should_rollback(30, 1000, 100, 10000) # True: 3% against 1%
should_rollback(12, 1000, 100, 10000) # False: 1.2% is within tolerance
Lưu ý trường hợp đầu tiên. Tỷ lệ lỗi của nó có vẻ cao nhưng chỉ với 100 yêu cầu thì vẫn chưa đủ bằng chứng. Các công cụ thực tế áp dụng số liệu thống kê cẩn thận hơn và chúng xem xét một số tín hiệu cùng nhau:
| tín hiệu | Ví dụ |
|---|---|
| Lỗi | Tỷ lệ 5xx phản hồi |
| Độ trễ | p95 và p99, như được giải thích trong kiểm tra tải và kiểm tra sức chịu đựng |
| Độ bão hòa | CPU, bộ nhớ, nhóm kết nối |
| Kinh doanh | Đăng ký, thanh toán, thanh toán thành công |
Mẹo: So sánh con chim hoàng yến với phiên bản ổn định trong cùng khoảng thời gian, thay vì so sánh với số liệu của tuần trước. Lưu lượng truy cập và hành vi thay đổi theo giờ, do đó việc so sánh song song sẽ mang lại cho bạn tín hiệu công bằng hơn nhiều.
Vấn đề về cơ sở dữ liệu
Mã ứng dụng có thể được hoán đổi trong vài giây, nhưng dữ liệu thì không. Cả hai chiến lược thường chia sẻ một cơ sở dữ liệu, vì vậy trong quá trình triển khai và sau khi khôi phục, cả phiên bản cũ và mới đều phải hoạt động với cùng một lược đồ.
Câu trả lời tiêu chuẩn là mẫu mở rộng và hợp đồng. Giả sử bạn muốn đổi tên name thành full_name:
- Mở rộng: thêm cột mới. Mã cũ không bị ảnh hưởng.
- Di chuyển: phát hành mã ghi vào cả hai cột và chèn lấp các hàng cũ.
- Chuyển: giải phóng mã đọc từ cột mới.
- Hợp đồng: khi không có gì sử dụng cột cũ, hãy xóa nó trong bản phát hành sau.
Việc này cần thực hiện vài lần phát hành nhưng mỗi bước đều có thể được khôi phục một cách an toàn. Chạy RENAME COLUMN trong một lần sẽ phá vỡ bất kỳ phiên bản nào mong đợi tên khác. Hãy cẩn thận với những thay đổi lược đồ kéo dài vì chúng có thể chứa các khóa. Để biết thêm về điều này, hãy đọc về Giao dịch SQL.
Lăn và các chiến lược khác
| Chiến lược | Nó hoạt động như thế nào | Tốt cho |
|---|---|---|
| Tạo lại | Dừng cái cũ, rồi bắt đầu cái mới, có thời gian ngừng hoạt động | Công cụ nội bộ, hệ thống hàng loạt |
| Lăn | Thay thế một vài trường hợp cùng một lúc | Một mặc định phổ biến, bao gồm cả trong Kubernetes |
| Xanh lam | Chuyển đổi giữa hai môi trường | Chuyển đổi và khôi phục nhanh |
| chim hoàng yến | Mở rộng một phần nhỏ dần dần | Lưu lượng truy cập cao, rủi ro cao |
| Bóng tối | Sao chép lưu lượng truy cập sang phiên bản mới và loại bỏ phản hồi của nó | Thử nghiệm với tải thực, không có tác động đến người dùng |
Triển khai Kubernetes thực hiện cập nhật luân phiên theo mặc định, phù hợp với nhiều dịch vụ. Bản cập nhật luân phiên cũng thay đổi dần dần, nhưng tỷ lệ của nó gắn liền với số lượng phiên bản và bản thân nó không phân tích kết quả hoặc tạm dừng các số liệu xấu.
Còn cờ tính năng thì sao?
Quá trình triển khai đặt mã trên máy chủ và bản phát hành cung cấp tính năng cho người dùng. Cờ tính năng giúp tách biệt các tính năng đó bằng cách cho phép bạn bật một tính năng cho người dùng đã chọn mà không cần triển khai bất kỳ thứ gì. Chúng hoạt động rất tốt với cả hai chiến lược: triển khai khi tắt cờ, sau đó kích hoạt dần dần. Chúng không thay thế các chiến lược này vì cờ không thể bảo vệ bạn khỏi bản phát hành gặp sự cố khi khởi động. Hãy nhớ loại bỏ các cờ cũ vì chúng tích tụ thành nợ kỹ thuật.
Cách chọn
| Tình huống của bạn | Lựa chọn hợp lý |
|---|---|
| Ứng dụng đơn giản và ít người dùng | Cập nhật cuộn |
| Cần chuyển đổi và khôi phục rất nhanh | Xanh lam |
| Muốn thử nghiệm trên sản xuất trước khi chuyển đổi | Xanh lam |
| Lưu lượng truy cập cao và chi phí thất bại cao | chim hoàng yến |
| Giám sát mạnh mẽ và số liệu trên mỗi phiên bản | chim hoàng yến |
| Lưu lượng truy cập thấp | Xanh lam vì tín hiệu hoàng yến quá yếu |
| Ngân sách cơ sở hạ tầng chặt chẽ | Canary hoặc lăn |
Chúng cũng có thể được kết hợp. Một số đội triển khai môi trường xanh, sau đó chuyển dần lưu lượng truy cập sang môi trường đó, đạt được môi trường sạch sẽ và bán kính nổ hạn chế. Dù bạn chọn gì, hãy tự động hóa nó thông qua quy trình CI/CD của bạn, như Hướng dẫn hành động GitHub của chúng tôi giải thích.
Những lỗi thường gặp
- Thực hiện các thay đổi có thể gây lỗi cho lược đồ. Khôi phục không hữu ích nếu mã cũ không thể đọc được dữ liệu.
- Không có tiêu chí khôi phục. Quyết định “xấu” nghĩa là gì trước khi bắt đầu phát hành, không phải trong khi xảy ra sự cố.
- Để môi trường trôi đi. Nếu màu xanh lá cây khác với màu xanh lam thì kết quả thử nghiệm của bạn sẽ kém hơn. Xác định cả hai bằng cơ sở hạ tầng dưới dạng mã.
- Chỉ đo lường các chỉ số kỹ thuật. Một bản phát hành có thể không có lỗi và vẫn vi phạm quy trình kiểm tra.
- Không bao giờ thực hành khôi phục. Hãy luyện tập nó để nó có tác dụng khi bạn gặp áp lực.
- Quên các công việc nền. Người lao động và các nhiệm vụ đã lên lịch cũng cần có kế hoạch trong quá trình chuyển đổi.
Lời kết
Màu xanh lam mang lại cho bạn một sự chuyển đổi rõ ràng và nhanh chóng. Canary cung cấp cho bạn mức độ phơi sáng nhỏ và có thể đo lường được. Nếu việc giám sát của bạn vẫn ở mức cơ bản, hãy bắt đầu với các bản cập nhật luân phiên hoặc màu xanh lam và đầu tư vào số liệu trên mỗi phiên bản trước khi bạn thử dùng chim hoàng yến. Sau đó, thực hiện khôi phục bản phát hành tiếp theo của bạn, bao gồm cả cơ sở dữ liệu. Bài tập đơn lẻ đó có xu hướng tiết lộ những gì thực sự cần sửa chữa.
Câu hỏi thường gặp
Sự khác biệt giữa triển khai xanh lam và hoàng yến là gì?
Màu xanh lam chuyển tất cả lưu lượng truy cập từ môi trường đầy đủ này sang môi trường khác cùng một lúc. Canary gửi một phần nhỏ lưu lượng truy cập đến phiên bản mới và mở rộng dần dần.
Cái nào an toàn hơn, xanh lam hay hoàng yến?
Canary giới hạn số lượng người dùng mà một bản phát hành xấu ảnh hưởng và màu xanh lam mang lại khả năng khôi phục rất nhanh. Sự lựa chọn an toàn hơn phụ thuộc vào lưu lượng truy cập, công cụ và giám sát của bạn.
Triển khai xanh-xanh có đắt không?
Có thể như vậy vì bạn có thể chạy hai môi trường đầy đủ trong khi phát hành. Tự động điều chỉnh quy mô đám mây và tắt môi trường nhàn rỗi có thể giảm chi phí.
Chim hoàng yến nên bắt đầu với bao nhiêu phần trăm?
Các nhóm thường bắt đầu với khoảng 1 đến 5 phần trăm, miễn là số đó cung cấp đủ lưu lượng truy cập để tạo ra tín hiệu có ý nghĩa. Hệ thống có lưu lượng truy cập thấp có thể cần một phần lớn hơn.
Canary và blue-green xử lý các thay đổi cơ sở dữ liệu như thế nào?
Thông thường với những thay đổi tương thích ngược như mở rộng và thu gọn, vì cả hai phiên bản đều có thể dùng chung một cơ sở dữ liệu và cả hai đều phải hoạt động trong quá trình triển khai.
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ềmCác lớp và đối tượng Python: Hướng dẫn OOP với các ví dụ thực tế
Các lớp và đối tượng Python được giải thích bằng mã mà chúng tôi đã chạy: __init__, các phương thức, thuộc tính lớp và phiên bản, tính kế thừa, thuộ…
Đọc bài viết →Trí tuệ nhân tạoMô hình ngôn ngữ lớn là gì? LLM hoạt động như thế nào, được giải thích mà không cường điệu hóa
Mô hình ngôn ngữ lớn là gì? LLM được giải thích bằng ngôn ngữ đơn giản: mã thông báo, phần nhúng, sự chú ý, đào tạo, cửa sổ nhiệt độ và ngữ cảnh, mộ…
Đọc bài viết →DevOpsCác lệnh Linux cho người mới bắt đầu: Hướng dẫn thiết bị đầu cuối cần thiết kèm ví dụ
Các lệnh Linux dành cho người mới bắt đầu, được nhóm theo tác vụ: điều hướng, tệp, xem nhật ký, grep, đường dẫn, quyền, quy trình và lưu trữ, cùng v…
Đọc bài viết →Tự động hóa kiểm thửSelenium vs Nhà viết kịch: Sự khác biệt chính, So sánh mã và nên chọn cái nào
Selenium và Playwright được so sánh: kiến trúc, chờ đợi, hỗ trợ trình duyệt và ngôn ngữ, gỡ lỗi, kiểm tra giống nhau ở cả hai công cụ, lời khuyên di…
Đọc bài viết →Kiểm thử phần mềmPhân vùng tương đương: Giải thích kỹ thuật thiết kế thử nghiệm bằng các ví dụ đã thực hiện
Giải thích về phân vùng tương đương: cách tìm các phân vùng hợp lệ và không hợp lệ, các ví dụ hoạt động theo độ tuổi, mật khẩu và phiếu giảm giá, cá…
Đọc bài viết →Kiểm thử phần mềmMức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: Sự khác biệt, Ma trận và ví dụ thực tế
Giải thích về mức độ nghiêm trọng và mức độ ưu tiên trong kiểm thử phần mềm: định nghĩa rõ ràng, ma trận bốn chiều với các ví dụ, thang đo cấp độ, a…
Đọc bài viết →Cơ sở dữ liệu & SQLHướng dẫn về truy vấn con SQL: Các loại, truy vấn con tương quan và TỒN TẠI kèm ví dụ
Hướng dẫn về truy vấn con SQL với các truy vấn chúng tôi đã chạy: truy vấn con vô hướng, IN, FROM và SELECT, truy vấn con tương quan, EXISTS, bẫy và…
Đọc bài viết →Cơ sở dữ liệu & SQLGiải thích về giao dịch SQL và ACID: Các mức CAM KẾT, ROLLBACK và Cô lập
Các giao dịch SQL và ACID được giải thích bằng chuyển khoản ngân hàng mà chúng tôi đã thực hiện: CAM KẾT, ROLLBACK, điểm lưu trữ, khóa, mức cách ly,…
Đọ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 →