Chuyên đề của tháng 12 về thu thập dữ liệu: Hoạt động vào bộ nhớ cache HTTP

Thứ Hai, ngày 9 tháng 12 năm 2024

Vui lòng cho phép chúng tôi thực hiện hoạt động lưu vào bộ nhớ cache.

Đi đôi với sự phát triển của Internet qua nhiều năm, lượng nội dung được Google thu thập dữ liệu cũng tăng lên. Mặc dù cơ sở hạ tầng thu thập dữ liệu của Google luôn hỗ trợ các cơ chế lưu vào bộ nhớ cache theo phương pháp phỏng đoán, nhưng số lượng yêu cầu có thể được trả về từ bộ nhớ cache cục bộ đã giảm: 10 năm trước, khoảng 0,026% tổng số lượt tìm nạp có thể lưu vào bộ nhớ cache (con số vốn đã không ấn tượng lắm); ngày nay, con số đó là 0,017%.

Tại sao hoạt động lưu vào bộ nhớ cache lại quan trọng?

Hoạt động lưu vào bộ nhớ cache là một phần quan trọng trong bức tranh lớn về Internet. Hoạt động lưu vào bộ nhớ cache cho phép các trang tải rất nhanh khi người dùng truy cập lại, giúp tiết kiệm tài nguyên điện toán và nhờ vậy cũng tiết kiệm tài nguyên thiên nhiên, đồng thời tiết kiệm một lượng lớn băng thông đắt đỏ cho cả phía ứng dụng khách và máy chủ.

Đặc biệt là nếu bạn có một trang web lớn với nội dung hiếm khi thay đổi trong các URL riêng biệt, thì việc cho phép lưu vào bộ nhớ cache cục bộ có thể giúp trang web của bạn được thu thập dữ liệu hiệu quả hơn. Cơ sở hạ tầng thu thập dữ liệu của Google hỗ trợ tính năng lưu vào bộ nhớ cache HTTP theo phương thức phỏng đoán được định nghĩa trong tiêu chuẩn lưu vào bộ nhớ cache HTTP, cụ thể là thông qua tiêu đề của yêu cầu phản hồi ETagIf-None-Match, cũng như tiêu đề của yêu cầu phản hồi Last-ModifiedIf-Modified-Since.

Bạn nên sử dụng ETag vì như thế sẽ ít gặp lỗi hơn (giá trị này không có cấu trúc, không giống như giá trị Last-Modified). Và nếu có thể, bạn hãy thiết lập cả hai: điều này sẽ mang lại lợi ích chung cho cả mạng lưới Internet. Có thể.

Còn việc bạn xem đâu là thay đổi đòi hỏi ứng dụng khách phải làm mới bộ nhớ cache là tuỳ ý bạn. Bạn nên yêu cầu làm mới bộ nhớ cache khi nội dung của mình có thay đổi đáng kể; nếu bạn chỉ cập nhật ngày đăng ký bản quyền ở cuối trang, thì có thể đó không phải là thay đổi đáng kể.

ETagIf-None-Match

Trình thu thập dữ liệu của Google hỗ trợ các yêu cầu có điều kiện dựa trên ETag chính xác được định nghĩa trong tiêu chuẩn lưu vào bộ nhớ cache HTTP. Tức là để báo hiệu cho trình thu thập dữ liệu của Google về lựa chọn ưu tiên lưu vào bộ nhớ cache, hãy thiết lập giá trị Etag thành một chuỗi ASCII tuỳ ý (thường là hàm băm của nội dung hoặc số phiên bản, nhưng cũng có thể là một phần của số π, tuỳ ý bạn) chỉ dành riêng cho việc thể hiện nội dung do URL được truy cập lưu trữ. Ví dụ: nếu bạn lưu trữ nhiều phiên bản của cùng một nội dung trong cùng một URL (ví dụ: phiên bản dành cho thiết bị di động và phiên bản dành cho máy tính), thì từng phiên bản có thể có một giá trị ETag duy nhất.

Các trình thu thập dữ liệu của Google có hỗ trợ hoạt động lưu vào bộ nhớ cache sẽ gửi giá trị ETag được trả về đối với lần thu thập dữ liệu trước đó của URL đó trong If-None-Match header. Nếu giá trị ETag mà trình thu thập dữ liệu gửi khớp với giá trị hiện tại do máy chủ tạo, thì máy chủ của bạn sẽ trả về mã trạng thái HTTP 304 (Chưa được sửa đổi) không có nội dung HTTP. Bit sau cùng này (không có phần nội dung HTTP) là quan trọng vì một số lý do:

  • máy chủ của bạn không phải hao tốn tài nguyên điện toán để tạo nội dung thực sự; tức là bạn sẽ tiết kiệm được tiền
  • máy chủ của bạn không phải truyền nội dung HTTP; tức là bạn sẽ tiết kiệm được tiền

Ở phía ứng dụng khách (chẳng hạn như trình duyệt của người dùng hoặc Googlebot), nội dung trong URL đó sẽ được truy xuất từ bộ nhớ cache nội bộ của ứng dụng khách. Vì không có hoạt động truyền dữ liệu nào, nên việc này diễn ra cực nhanh, khiến người dùng hài lòng và có thể tiết kiệm một số tài nguyên cho họ.

Last-ModifiedIf-Modified-Since

Tương tự như ETag, trình thu thập dữ liệu của Google cũng hỗ trợ các yêu cầu có điều kiện Last-Modified based, chính xác được định nghĩa trong tiêu chuẩn lưu vào bộ nhớ cache HTTP. Xét theo quan điểm ngữ nghĩa thì giá trị này hoạt động giống như ETag (một giá trị nhận dạng được sử dụng để quyết định xem có lưu tài nguyên vào bộ nhớ cache hay không) và mang lại các lợi ích giống như ETag ở phía ứng dụng khách.

Chúng tôi có một vài gợi ý cho bạn nếu bạn đang sử dụng Last-Modified làm lệnh lưu vào bộ nhớ cache:

  1. Ngày trong tiêu đề Last-Modified phải được định dạng theo tiêu chuẩn HTTP. Để tránh các vấn đề về phân tích cú pháp, bạn nên sử dụng định dạng ngày sau: "Ngày trong tuần, DD Mon YYYY HH:MM:SS Múi giờ". Ví dụ: "Fri, 4 Sep 1998 19:15:56 GMT".
  2. Mặc dù không bắt buộc, nhưng bạn cũng nên cân nhắc việc thiết lập trường max-age của tiêu đề Cache-Control nhằm giúp trình thu thập dữ liệu xác định thời điểm thu thập dữ liệu lại đối với một URL cụ thể. Thiết lập giá trị của trường max-age thành số giây dự kiến mà nội dung sẽ không thay đổi. Ví dụ: Cache-Control: max-age=94043.

Ví dụ

Chắc là bạn cũng cảm nhận giống như tôi, tìm hiểu cách hoạt động của cơ chế lưu vào bộ nhớ cache theo phương pháp phỏng đoán là một việc không dễ chút nào, tuy nhiên, có vẻ như việc đưa ra ví dụ về chuỗi yêu cầu và phản hồi sẽ có ích cho tôi. Dưới đây là hai chuỗi (một chuỗi cho ETag/If-None-Match và một chuỗi cho Last-Modified/If-Modified-Since) để minh hoạ cách thức hoạt động của cơ chế này:

ETag/If-None-Match Last-Modified/If-Modified-Since
Phản hồi của máy chủ đối với một hoạt động thu thập dữ liệu: Đây là phản hồi mà thông qua đó trình thu thập dữ liệu có thể lưu các trường tiêu đề tiền đề ETagLast-Modified.
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Fri, 4 Sep 1998 19:15:50 GMT
ETag: "34aa387-d-1568eb00"
...
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Fri, 4 Sep 1998 19:15:50 GMT
Last-Modified: Fri, 4 Sep 1998 19:15:56 GMT
Cache-Control: max-age=94043
...
Yêu cầu có điều kiện của trình thu thập dữ liệu tiếp theo: Yêu cầu có điều kiện dựa trên các giá trị tiêu đề tiền đề được lưu từ một yêu cầu trước đó. Các giá trị này sẽ được gửi lại máy chủ để xác thực trong tiêu đề yêu cầu If-None-MatchIf-Modified-Since.
GET /hello.world HTTP/1.1
Host: www.example.com
Accept-Language: en, hu
User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)
If-None-Match: "34aa387-d-1568eb00"
...
GET /hello.world HTTP/1.1
Host: www.example.com
Accept-Language: en, hu
User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html)
If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT
...
Phản hồi của máy chủ đối với yêu cầu có điều kiện: Vì các giá trị tiêu đề tiền đề mà trình thu thập dữ liệu gửi đi sẽ được xác thực ở phía máy chủ, nên máy chủ sẽ trả về một mã trạng thái HTTP 304 (không có nội dung HTTP) cho trình thu thập dữ liệu. Điều này sẽ xảy ra với mọi yêu cầu tiếp theo cho đến khi không xác thực được các tiền đề (ngày ETag hoặc Last-Modified thay đổi ở phía máy chủ).
HTTP/1.1 304 Not Modified
Date: Fri, 4 Sep 1998 19:15:50 GMT
Expires: Fri, 4 Sep 1998 19:15:52 GMT
Vary: Accept-Encoding
If-None-Match: "34aa387-d-1568eb00"
...
HTTP/1.1 304 Not Modified
Date: Fri, 4 Sep 1998 19:15:50 GMT
Expires: Fri, 4 Sep 1998 19:15:51 GMT
Vary: Accept-Encoding
If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT
...

Nếu bạn đang nỗ lực để làm hài lòng người dùng và cũng muốn tiết kiệm một chút tiền đối với hoá đơn dịch vụ lưu trữ, hãy trao đổi với nhà cung cấp dịch vụ lưu trữ hoặc CMS hoặc nhà phát triển của mình về cách bật tính năng lưu vào bộ nhớ cache HTTP cho trang web của bạn. Ít nhất thì người dùng sẽ có cảm tình hơn một chút với bạn.

Nếu bạn muốn trao đổi về hoạt động lưu vào bộ nhớ cache, hãy truy cập vào cộng đồng trợ giúp của Trung tâm Tìm kiếm gần nơi bạn ở nhất. Nếu bạn có ý kiến về cách thức chúng tôi thực hiện hoạt động lưu vào bộ nhớ cache, hãy để lại ý kiến phản hồi đối với tài liệu về Hoạt động lưu vào bộ nhớ cache mà chúng tôi đã xuất bản cùng với bài đăng trên blog này.


Bạn muốn tìm hiểu thêm về hoạt động thu thập dữ liệu? Xem toàn bộ loạt bài Chuyên đề của tháng 12 về thu thập dữ liệu: