Bộ đếm lượt xem đã biến danh mục của chúng tôi thành lỗi 502
Vận chuyển
Trang liệt kê mọi bộ công cụ chúng tôi bán đã trả về lỗi 502 Bad Gateway cho mọi khách truy cập trong khoảng 41 giờ sau khi ra mắt. Trang riêng của từng bộ công cụ vẫn hoạt động, trang chủ vẫn hoạt động, thanh toán vẫn hoạt động. Phần bị hỏng chỉ là vài dòng mã đếm lượt xem trang.
Lỗi
Máy chủ cửa hàng của chúng tôi đếm lượt truy cập vào các trang bộ công cụ. Để xác định bộ công cụ nào được yêu cầu, nó lấy phần thứ hai của đường dẫn:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Với /kits/studio/, đó là studio. Với chính danh mục, /kits/, đường dẫn có hai dấu gạch chéo, nên bộ bảo vệ cho phép đi qua, nhưng sau khi loại bỏ các dấu gạch chéo chỉ còn một phần, và [1] gây ra IndexError. Bộ xử lý là http.server tiêu chuẩn của Python: một ngoại lệ trong do_GET sẽ đóng kết nối mà không trả lời, và Cloudflare hiển thị cho khách truy cập lỗi 502.
Cách khắc phục là một hàm nhỏ trả về chuỗi rỗng khi phần đó bị thiếu. Bộ đếm lượt xem chỉ cần tên của bộ công cụ; nó không bao giờ cần phải làm hỏng chính trang mà nó đang đếm.
Tại sao không có kiểm tra nào của chúng tôi phát hiện ra
- Bộ giám sát thời gian hoạt động chỉ mở các trang chủ. Trang chủ vẫn ổn.
- Bước phát hành đã kiểm tra từng bộ công cụ được xuất bản: trang của nó, chuyển hướng thanh toán của nó, quy trình thanh toán từ đầu đến cuối. Nó không bao giờ mở danh sách tất cả các bộ công cụ.
- Công cụ phân tích không thể hiển thị vấn đề này. Mã lẽ ra đã đếm lượt truy cập vào danh mục chính là mã bị lỗi. Nhật ký máy chủ đã có sẵn câu trả lời: 17 traceback trong 41 giờ đó, mỗi cái là một yêu cầu, từ một người dùng hoặc một crawler, nhận được lỗi thay vì trang.
Những gì đã thay đổi
- Mọi trang, từ bên ngoài, mỗi giờ. Một tác vụ nhỏ đọc sitemap và mở mọi trang tiếng Anh và, lần lượt, một trong 42 ngôn ngữ còn lại, thông qua Cloudflare như một khách truy cập. Hai lần chạy thất bại liên tiếp sẽ gửi email; khi phục hồi sẽ gửi một email khác.
- Bước phát hành mở mọi trang tiếng Anh sau khi xây dựng lại trang web, và từ chối hoàn tất nếu một trang không trả về 200.
- Các trang chỉ mục được tính là trang. Các trang liệt kê các trang khác là những trang mà khách truy cập tiếp cận đầu tiên, và chúng là những trang mà không ai kiểm tra.
Bài học rút ra
Các công việc phụ trong một request handler, chẳng hạn như đếm, ghi log hoặc theo dõi, không bao giờ được phép làm request thất bại, và một bước kiểm tra trang chỉ bao gồm các trang bạn vừa thay đổi sẽ bỏ sót những trang liên kết đến chúng. Bộ giám sát trong Night Watch nhận bất kỳ danh sách trang nào, mỗi trang kèm theo văn bản phải chứa, không chỉ riêng các trang chủ.