Tôi đã suy nghĩ về yêu cầu trên Software Recommendations, nhưng sau đó tôi đã phát hiện ra rằng nó có thể là một yêu cầu quá lạ và nó cần một số làm rõ đầu tiên.Caching proxy ngược cho nội dung động
điểm của tôi là:
- Mỗi phản ứng có chứa một
etag
- mà là một hash của nội dung
- và đó là duy nhất trên toàn cầu (với đầy đủ khả năng)
- Nội dung (chủ yếu) động và có thể thay đổi bất cứ lúc nào (
expires
vàmax-age
tiêu đề là u không có ở đây). - Nội dung là một phần tùy thuộc vào người dùng, như được cho phép bởi quyền (đôi khi bản thân nó thay đổi).
Về cơ bản, proxy phải chứa bộ nhớ cache ánh xạ etag
đến nội dung phản hồi. etag
được lấy từ máy chủ và trong trường hợp phổ biến nhất, máy chủ không xử lý nội dung phản hồi chút nào.
Nó nên đi như sau: Proxy luôn gửi một yêu cầu đến máy chủ và sau đó một trong hai
- trở về máy chủ chỉ
etag
và proxy làm một tra cứu dựa vào nó và- 1,1 trên bộ nhớ cache hit,
- nó đọc dữ liệu phản hồi từ bộ nhớ cache
- và gửi một phản ứng cho khách hàng
- 1.2 trên cache,
- nó yêu cầu máy chủ một lần nữa và sau đó
- máy chủ trả về phản ứng với nội dung và
etag
, - các cửa hàng ủy quyền đó trong bộ nhớ cache của nó
- và gửi một phản ứng với khách hàng
- 1,1 trên bộ nhớ cache hit,
- hoặc máy chủ trả về phản ứng với nội dung và
etag
,- proxy lưu trữ các dữ liệu trong bộ nhớ cache của nó
- và gửi một phản ứng cho khách hàng
Để đơn giản, tôi rời ra việc xử lý if-none-match
tiêu đề, mà là khá hiển nhiên. Lý do của tôi là trường hợp phổ biến nhất 1.1 có thể được thực hiện rất hiệu quả trong máy chủ (sử dụng yêu cầu ánh xạ bộ nhớ cache của nó đến etags
; nội dung không được lưu trong máy chủ), để hầu hết các yêu cầu có thể được xử lý mà không có máy chủ xử lý nội dung phản hồi. Điều này sẽ tốt hơn lần đầu tiên lấy nội dung từ bộ nhớ cache bên và sau đó phục vụ nó.
Trong trường hợp 1.2, có hai yêu cầu đối với máy chủ, điều đó nghe có vẻ xấu, nhưng không tệ hơn máy chủ yêu cầu bộ nhớ cache bên và bị bỏ lỡ.
Q1: Tôi tự hỏi, cách ánh xạ yêu cầu đầu tiên tới HTTP. Trong trường hợp 1, nó giống như yêu cầu HEAD. Trong trường hợp 2, nó giống như GET. Quyết định giữa hai tùy thuộc vào máy chủ: Nếu nó có thể phục vụ etag
mà không cần tính toán các nội dung, thì đó là trường hợp 1, nếu không, đó là trường hợp 2.
Q2: Có một reverse proxy làm một cái gì đó như thế này ? Tôi đã đọc về nginx, HAProxy và Varnish và nó không có vẻ như vậy. Điều này dẫn tôi đến Q3: Đây có phải là một ý tưởng tồi không? Tại sao?
Q4: Nếu không, thì proxy hiện tại nào dễ thích ứng nhất?
Một thí dụ
Một yêu cầu GET như /catalog/123/item/456
từ người dùng U1
được phục vụ với một số nội dung C1
và etag: 777777
. Proxy được lưu trữ C1
dưới khóa 777777
.
Bây giờ, cùng một yêu cầu đến từ người dùng U2
. Proxy chuyển tiếp nó, máy chủ trả về chỉ etag: 777777
và proxy là may mắn, tìm thấy C1
trong bộ nhớ cache của nó (trường hợp 1.1) và gửi nó đến U2
. Trong ví dụ này, cả khách hàng không phải proxy đều biết kết quả mong đợi.
Phần thú vị là làm cách nào máy chủ có thể biết được etag
mà không cần tính toán câu trả lời.Ví dụ, nó có thể có một quy tắc cho biết rằng các yêu cầu của biểu mẫu này trả về cùng một kết quả cho tất cả người dùng, giả sử rằng người dùng đã cho được phép nhìn thấy nó. Vì vậy, khi yêu cầu từ U1
đến, nó đã tính C1
và lưu trữ etag
dưới khóa /catalog/123/item/456
. Khi cùng một yêu cầu đến từ U2
, nó chỉ xác minh rằng U2
được phép xem kết quả.
Những gì bạn mô tả là GET có điều kiện trong HTTP. Khách hàng thực hiện GET với một số tiêu đề HTTP cụ thể chỉ cho máy chủ trả lời nội dung chỉ khi một điều kiện cụ thể phù hợp hoặc không khớp, giống như một điều kiện dựa trên ngày hợp lệ hoặc ETag. –
@PatrickMevzek Sau đó, mô tả của tôi là khó hiểu. Tôi nhận thức được điều kiện GET và đó là một cái gì đó khác nhau. Nó giả định rằng, người khởi xướng "đoán" câu trả lời có thể xảy ra của phản hồi (thậm chí có thể gửi [nhiều hơn một] (https://stackoverflow.com/q/40186498/581205) trong 'if-none-match 'header). '+++' Ở đây, proxy truy vấn máy chủ mà không đoán và máy chủ thường (trường hợp 1) chỉ trả lời với 'etag', hy vọng rằng proxy nhận được một lần truy cập cache (trường hợp 1.1). Ngoài ra còn có khả năng truy vấn thứ hai (trường hợp 1.2). – maaartinus
Không có giả định rằng khách hàng đoán bất cứ điều gì vì các giá trị ETAG mờ đục theo thiết kế. Khách hàng gửi một giá trị ETag nó có trong bộ nhớ cache của nó, liên quan đến URL mà nó truy vấn. –