2010-02-18 19 views
32

Tôi đã đọc một cuốn sách và tôi có một câu hỏi cụ thể về chương ETAG. Tác giả nói rằng ETags có thể gây hại cho hiệu suất và bạn phải điều chỉnh chúng một cách tinh vi hoặc vô hiệu hóa chúng hoàn toàn.Nhận ETags ngay

Tôi đã biết ETags là gì và hiểu các rủi ro, nhưng khó có thể nhận được ETags phải không?

Tôi vừa tạo một ứng dụng gửi một ETag có giá trị là băm MD5 của nội dung phản hồi. Đây là một giải pháp đơn giản, dễ dàng đạt được bằng nhiều ngôn ngữ.

  • Đang sử dụng hàm băm MD5 của nội dung phản hồi là ETAG sai? Nếu vậy, tại sao?

  • Tại sao tác giả (rõ ràng là ngoại tác với tôi bởi nhiều đơn đặt hàng lớn) không đề xuất một giải pháp đơn giản như vậy?

Câu hỏi cuối cùng này khó trả lời trừ khi bạn là tác giả :), vì vậy tôi đang cố gắng tìm điểm yếu của việc sử dụng băm MD5 làm ETag.

+6

Không bao giờ an toàn để giả định rằng tác giả sẽ vượt qua bạn một chút. – spender

+13

@spender: Đồng ý, nhưng thậm chí còn ít an toàn hơn để giả sử bạn vượt qua tác giả. – Oddthinking

+7

và chúng tôi thậm chí sẽ không chạm vào biểu tượng của các nhà bình luận trên web, cách này hay cách khác ;-) –

Trả lời

39

ETag tương tự như tiêu đề Sửa đổi lần cuối. Đó là một cơ chế để xác định sự thay đổi của khách hàng.

Có thể cho rằng, một ETAG JUST HAPPENS là ngày sửa đổi cuối cùng (tức là cùng một văn bản) đáp ứng tất cả các tiêu chí cần thiết cho một ETag. Nó đơn giản cần phải là một giá trị duy nhất thể hiện trạng thái của một tài nguyên. Không phải là duy nhất trên toàn bộ miền tài nguyên, chỉ đơn giản là trong tài nguyên.

Hiện tại, về mặt kỹ thuật, một ETag có độ phân giải "vô hạn" so với tiêu đề Sửa đổi lần cuối. Những thay đổi chỉ được sửa đổi lần cuối ở độ chi tiết 1 giây, trong khi một ETag có thể là phụ thứ hai.

Bạn có thể triển khai cả ETag và Last-Modified, hoặc đơn giản là một hoặc khác (hoặc không, tất nhiên). Nếu bạn sửa đổi lần cuối không đủ, hãy xem xét một ETag.

Tâm trí, tôi sẽ không đặt ETag cho tài nguyên "mọi". Về cơ bản, tôi sẽ không đặt nó cho bất cứ điều gì mà không có mong đợi được lưu trữ (nội dung động đáng chú ý). Không có vấn đề gì trong trường hợp đó, chỉ là công việc lãng phí.

Chỉnh sửa: Tôi thấy chỉnh sửa của bạn và làm rõ.

MD5 là tốt. Nhược điểm duy nhất là tính toán MD5 mọi lúc. Chạy MD5, ví dụ, một tệp PDF 200K, đắt tiền. Chạy MD5 trên tài nguyên không mong đợi được lưu vào bộ nhớ cache đơn giản là lãng phí (tức là nội dung động).

Bí quyết đơn giản là bất kỳ cơ chế nào bạn sử dụng, nó phải rẻ như thường được sửa đổi lần cuối. Lần sửa đổi lần cuối, một lần nữa, thường là tài sản của tài nguyên và thường rất rẻ để truy cập.

Thẻ ghi đè phải có giá rẻ tương tự. Nếu bạn đang sử dụng MD5 và bạn có thể lưu trữ/lưu trữ liên kết giữa tài nguyên và mã băm MD5, thì đó là giải pháp tốt. Tuy nhiên, tính toán lại MD5 mỗi khi ETAG là cần thiết, về cơ bản là phản đối ý tưởng sử dụng ETags để cải thiện hiệu suất tổng thể của máy chủ.

+0

Cảm ơn. Trong trường hợp cụ thể của tôi, tôi đã có MD5 bởi vì tôi ký điện tử các yêu cầu, nhưng tôi thấy điều này có thể là một vấn đề hiệu suất cho các tình huống khác. Cảm ơn! –

+11

"một ETag mà JUST HAPPENS là ngày sửa đổi cuối cùng (tức là cùng một văn bản) đáp ứng tất cả các tiêu chí cần thiết cho một ETag". Điều này không đúng bởi vì cả một đáp ứng Gzipped và unGzipped sẽ có cùng ngày sửa đổi; tuy nhiên, chúng nên có các loại Etags khác nhau: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727 – johnstok

+11

"Chạy MD5 trên một tệp PDF 200K, đắt tiền" - thường là không, trên bộ vi xử lý hiện đại MD5 nhanh hơn nhiều so với Gbit Ethernet, cho phép một mình kết nối Internet của người dùng cuối. Nếu ETags của bạn có cơ hội tránh thậm chí 1% chuyển khoản, nó có thể bù đắp cho thời gian CPU được sử dụng. – intgr

0

Tôi nghĩ rằng perceived problem với ETAGS có thể là trình duyệt của bạn phải phát hành và phân tích yêu cầu/phản hồi (đơn giản và nhỏ) cho mọi tài nguyên trên trang của bạn để kiểm tra xem giá trị etag có thay đổi phía máy chủ hay không.

Cá nhân tôi tìm thấy các vòng tròn nhỏ bổ sung này cho máy chủ có thể chấp nhận để thay đổi hình ảnh, css, javascript (máy chủ không cần gửi lại nội dung nếu etag của trình duyệt hiện tại) vì cơ chế giúp dễ dàng đánh dấu ' nội dung cập nhật '.

+0

Vấn đề được đề cập trong cuốn sách là bạn cần phải đưa ra một chiến lược đặc biệt và có thể __smart__ (tác giả thậm chí khuyến khích bỏ hỗ trợ từ etags nếu bạn không thể tìm thấy một chiến lược tốt). Đó là những gì tôi đang tìm kiếm kỳ lạ, MD5 là một giải pháp tốt? nếu vậy tại sao không chỉ nói vậy? –

+0

Một 'max-age' hoặc' Expires' đúng đắn sẽ cho phép khách hàng biết số tiền chờ đợi mà không gửi ngay cả khi nhỏ "có gì mới không?" yêu cầu. Vì vậy, bạn có thể lưu các chuyến đi khứ hồi. –

+0

@Pablo Fernandez: MD5 là tốt, nhưng cá nhân tôi sẽ không băm toàn bộ nội dung của tệp. Việc băm 'ngày sửa đổi tập tin cuối cùng' sẽ chứng minh đủ. Về "tại sao không chỉ nói điều đó?" Bit: câu trả lời có lẽ là đúng trong tiêu đề sách (các trang web hiệu suất cao). Etags (và roundtrips của họ) làm thêm một số chi phí và có thể là một yếu tố quan trọng để xem xét trên một máy chủ web tải nặng nề (nhưng đồng thời họ thêm tính linh hoạt) ... – ChristopheD

1

Chưa đọc cuốn sách, tôi không thể nói về những mối quan tâm chính xác của tác giả.

Tuy nhiên, việc tạo ra các thẻ ETAG phải sao cho một ETag chỉ được tạo khi một trang đã thay đổi. Tạo ra một băm MD5 của một trang web chi phí xử lý sức mạnh và thời gian trên máy chủ; nếu bạn có nhiều khách hàng kết nối, nó có thể bắt đầu gây ra vấn đề hiệu suất. Vì vậy, bạn cần một kỹ thuật tốt để tạo ETags chỉ khi cần thiết và lưu chúng vào máy chủ cho đến khi trang có liên quan thay đổi.

+1

Tôi phải ký điện tử mọi câu trả lời của máy chủ với bí mật được chia sẻ. Vì vậy, ETAG là một tác dụng phụ tốt đẹp :) –

4

Chúng tôi đang sử dụng etags cho nội dung động của chúng tôi trong instela.

Chiến lược của chúng tôi ở cuối đầu ra tạo hàm băm md5 của nội dung để gửi và nếu tiêu đề if-none-match tồn tại, chúng tôi so sánh tiêu đề với băm được tạo. Nếu hai giá trị giống nhau, chúng tôi gửi mã 304 và xen kẽ yêu cầu mà không trả lại bất kỳ nội dung nào.

Đúng là chúng tôi tiêu thụ một chút cpu để băm nội dung nhưng cuối cùng chúng tôi đang tiết kiệm được nhiều băng thông.

Chúng tôi có trang chính thức kiểu tin tức facebook có nội dung khác nhau cho mọi người dùng. Vì nội dung nguồn cấp tin tức chỉ thay đổi 3-4 lần mỗi giờ, nên việc làm mới trang chính rất hiệu quả cho phía máy khách. Trong thời đại di động, tôi nghĩ tốt hơn nên dành nhiều thời gian hơn một chút so với chi tiêu băng thông. Băng thông vẫn còn đắt hơn CPU, và đó là một trải nghiệm tốt hơn cho khách hàng.