Bộ nhớ đệm trang, CDN và biểu ngữ đồng ý: Cách tránh phục vụ sai trạng thái đồng ý
Trang nhanh, sự đồng ý sai
Bộ nhớ đệm trang là một trong những điều tốt nhất bạn có thể làm cho tốc độ và chi phí lưu trữ. Nó cũng là một trong những cách dễ nhất để làm hỏng thiết lập đồng ý mà không hay biết. Bộ nhớ đệm làm đúng những gì nó được bảo: lưu một phản hồi một lần và phục vụ cho tất cả những ai khớp với cùng một khóa. Nếu phản hồi được lưu đó chứa bất cứ điều gì riêng của lựa chọn đồng ý hay vị trí của một khách truy cập, thì khách truy cập tiếp theo cũng sẽ nhận được nó.
Hướng dẫn này đề cập đến các tầng bộ nhớ đệm thường nằm phía trước một trang web của nhà xuất bản — bộ nhớ đệm biên của CDN, plugin lưu đệm toàn trang, reverse proxy, service worker và chính trình duyệt — và cách ngăn từng tầng phục vụ sai trải nghiệm đồng ý.
Quy tắc cốt lõi: Giữ sự đồng ý ra khỏi HTML được lưu đệm
Kiến trúc an toàn nhất là kết xuất trang HTML được lưu đệm ở trạng thái trung lập về đồng ý. Trang chứa trình tải CMP và các thẻ của bạn ở trạng thái bị chặn hoặc đang chờ, nhưng không có quyết định nào về khách truy cập cụ thể này. Sau đó CMP chạy trong trình duyệt, đọc lựa chọn đã lưu, quyết định có hiển thị biểu ngữ hay không, và giải phóng các thẻ cho phù hợp.
Vấn đề bắt đầu khi máy chủ đưa ra quyết định đồng ý tại thời điểm kết xuất, chẳng hạn như:
- một giao diện hoặc plugin chỉ in thẻ quảng cáo hay phân tích khi có cookie đồng ý;
- mã phía máy chủ bỏ qua mã đánh dấu biểu ngữ đối với những khách truy cập đã chọn;
- các mẫu nhúng trạng thái đồng ý của khách truy cập vào một biến tập lệnh nội tuyến.
Một khi trang đó được lưu đệm, trạng thái của khách truy cập đầu tiên trở thành trạng thái của tất cả mọi người. Một khách truy cập đã từ chối theo dõi có thể nhận một trang có các thẻ đã hoạt động, hoặc một khách truy cập mới có thể không bao giờ thấy biểu ngữ vì bản sao được lưu đệm đến từ một người đã đóng nó.
Vì sao “Vary: Cookie” hiếm khi là câu trả lời
Cách khắc phục theo sách giáo khoa cho nội dung theo từng khách truy cập là bảo bộ nhớ đệm phân biệt theo tiêu đề cookie. Trên thực tế, khách truy cập mang nhiều cookie có giá trị duy nhất, nên phân biệt theo toàn bộ tiêu đề cookie thường đưa tỷ lệ trúng bộ nhớ đệm xuống gần bằng không. Một số CDN cho phép bạn xây dựng khóa bộ nhớ đệm từ giá trị của một cookie duy nhất, điều này khả thi nếu cookie đồng ý của bạn có ít trạng thái khả dĩ, nhưng nó làm tăng độ phức tạp và vẫn nhân số lượng bản sao được lưu đệm lên. Chuyển quyết định vào trình duyệt đơn giản hơn và giữ cho bộ nhớ đệm hiệu quả.
Vị trí địa lý ở biên
Nhiều nhà xuất bản hiển thị các biểu ngữ khác nhau theo khu vực: một biểu ngữ chủ động đồng ý cho EU và Vương quốc Anh, một thông báo từ chối cho các bang của Hoa Kỳ, và thứ gì đó nhẹ hơn ở nơi khác. Nếu máy chủ chọn biến thể dựa trên địa chỉ IP của khách truy cập và trang đó được lưu đệm, độc giả châu Âu có thể nhận một trang Hoa Kỳ được lưu đệm, hoặc ngược lại.
Có ba mẫu cách tránh điều này:
- Định vị địa lý phía máy khách. Để CMP xác định khu vực trong trình duyệt, để HTML được lưu đệm giống nhau cho tất cả mọi người.
- Quốc gia trong khóa bộ nhớ đệm. Nếu bạn buộc phải quyết định ở biên, hãy đưa mã quốc gia mà CDN của bạn cung cấp vào khóa bộ nhớ đệm. Bạn có một bản sao được lưu đệm cho mỗi quốc gia, điều này dễ dự đoán.
- Logic biên không lưu đệm. Chạy quyết định theo khu vực trong một hàm biên để chèn một giá trị nhỏ, không lưu đệm vào một trang vốn được lưu đệm.
Dù bạn chọn cách nào, hãy ghi lại. Lỗi địa lý nằm trong số những lỗi khó tái hiện nhất, vì chúng chỉ xuất hiện với khách truy cập ở một nơi tình cờ nhận một trang do ai đó ở nơi khác lưu đệm.
Lưu đệm chính tập lệnh CMP
Lưu đệm trình tải CMP trong thời gian dài là tốt cho hiệu suất, nhưng có cái giá khi cấu hình thay đổi. Nếu bạn cập nhật nhà cung cấp, mục đích hoặc văn bản biểu ngữ mà tập lệnh hay tệp cấu hình được lưu đệm một năm, một số khách truy cập sẽ tiếp tục thấy phiên bản cũ. Hãy kiểm tra cách CMP của bạn đánh phiên bản cho các tệp: tên tệp hoặc tham số phiên bản thay đổi cho phép bạn lưu đệm mạnh tay mà vẫn triển khai thay đổi ngay lập tức. Cũng hãy xác nhận rằng CDN của chính bạn không loại bỏ chuỗi truy vấn khỏi URL tập lệnh của bên thứ ba nếu CMP dựa vào chúng.
Service worker và bộ nhớ đệm ngoại tuyến
Các trang web có lớp ứng dụng web tiến bộ thường lưu đệm HTML trong một service worker. Quy tắc tương tự áp dụng: không bao giờ lưu một trang phản ánh một quyết định đồng ý cụ thể. Loại trừ các điểm cuối liên quan đến đồng ý và các trang trung tâm tùy chọn khỏi bộ nhớ đệm của service worker, và đảm bảo luôn có thể tải về một cấu hình CMP mới.
Bộ nhớ đệm quay lại/tiến tới
Các trình duyệt hiện đại giữ các trang đã truy cập gần đây trong bộ nhớ để nút quay lại khôi phục chúng ngay lập tức. Nếu một khách truy cập mở trung tâm tùy chọn ở một trang, rút lại sự đồng ý, rồi nhấn quay lại, trang được khôi phục có thể vẫn còn các thẻ đang chạy từ trước đó. Hãy lắng nghe sự kiện pageshow và kiểm tra thuộc tính persisted của nó: khi một trang được khôi phục từ bộ nhớ đệm này, hãy đọc lại trạng thái đồng ý đã lưu và dừng hoặc khởi động các thẻ cho khớp.
Quy trình kiểm thử
- Tải một trang trong một phiên sạch, từ chối, rồi tải trang thứ hai và xác nhận không có thẻ theo dõi nào được kích hoạt.
- Lặp lại với một trình duyệt sạch thứ hai và xác nhận biểu ngữ xuất hiện, chứng tỏ nó không bị lưu đệm mất.
- Kiểm tra tiêu đề phản hồi để xem các trang có được phục vụ từ bộ nhớ đệm hay không, và so sánh HTML có và không có cookie đồng ý — chúng phải giống hệt nhau.
- Kiểm thử từ ít nhất hai khu vực sau khi xóa bộ nhớ đệm, rồi lại một lần nữa sau khi bộ nhớ đệm đã được làm nóng.
- Rút lại sự đồng ý, dùng nút quay lại và xác minh rằng các thẻ dừng lại.
Những điểm chính cần nhớ
- HTML được lưu đệm nên trung lập về đồng ý; để CMP quyết định trong trình duyệt.
- Tránh phân biệt theo toàn bộ tiêu đề cookie; nó phá hủy tỷ lệ trúng bộ nhớ đệm.
- Nếu biểu ngữ khác nhau theo khu vực, hãy quyết định phía máy khách hoặc thêm quốc gia vào khóa bộ nhớ đệm.
- Đánh phiên bản cho các tệp CMP để thời gian lưu đệm dài không trì hoãn các thay đổi cấu hình.
- Xử lý service worker và bộ nhớ đệm quay lại/tiến tới, và kiểm thử khi bộ nhớ đệm đã được làm nóng, không chỉ sau khi xóa.