Chống lại mô hình: Phản hồi lỗi bộ nhớ đệm

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

Lưu vào bộ nhớ đệm là quá trình lưu trữ dữ liệu tạm thời trong một vùng lưu trữ được gọi là bộ nhớ đệm để sau này tham chiếu. Việc lưu dữ liệu vào bộ nhớ đệm mang lại lợi ích đáng kể về hiệu suất vì hoạt động này:

  • Cho phép truy xuất dữ liệu nhanh hơn
  • Giảm thời gian xử lý bằng cách tránh việc tạo lại dữ liệu nhiều lần
  • Ngăn các yêu cầu API đến được máy chủ phụ trợ, từ đó giảm mức hao tổn trên các máy chủ phụ trợ
  • Cho phép tận dụng tốt hơn các tài nguyên của hệ thống/ứng dụng
  • Cải thiện thời gian phản hồi của API

Bất cứ khi nào chúng tôi phải thường xuyên truy cập vào một số dữ liệu không thay đổi quá thường xuyên, bạn nên sử dụng bộ nhớ đệm để lưu trữ dữ liệu này.

Apigee Edge cung cấp khả năng lưu trữ dữ liệu trong bộ nhớ đệm trong thời gian chạy để duy trì và truy xuất nhanh hơn. Tính năng lưu vào bộ nhớ đệm được cung cấp thông qua chính sáchPopulateCache, chính sách TraCache, chính sách InvalidateCachechính sách củaResponseCache.

Trong phần này, hãy tìm hiểu chính sách Bộ nhớ đệm của phản hồi. Chính sách bộ nhớ đệm của phản hồi trong nền tảng Apigee Edge cho phép bạn lưu các phản hồi vào bộ nhớ đệm từ các máy chủ phụ trợ. Nếu các ứng dụng khách liên tục yêu cầu cùng một tài nguyên phụ trợ và tài nguyên đó được cập nhật định kỳ, thì chúng ta có thể lưu các phản hồi đó vào bộ nhớ đệm bằng chính sách này. Chính sách Bộ nhớ đệm phản hồi giúp trả về các phản hồi đã lưu vào bộ nhớ đệm, nhờ đó tránh chuyển tiếp các yêu cầu đến máy chủ phụ trợ một cách không cần thiết.

Chính sách về bộ nhớ đệm của phản hồi:

  • Giảm số lượng yêu cầu gửi đến phần phụ trợ
  • Giảm băng thông mạng
  • Cải thiện hiệu suất của API và thời gian phản hồi

Phản mẫu

Chính sách bộ nhớ đệm của phản hồi (ResponseCache) cho phép bạn lưu các phản hồi HTTP vào bộ nhớ đệm cùng với mọi mã Trạng thái theo mặc định. Điều này có nghĩa là cả phản hồi thành công và phản hồi lỗi đều có thể được lưu vào bộ nhớ đệm.

Dưới đây là một chính sách Bộ nhớ đệm phản hồi mẫu có cấu hình mặc định:

<!-- /antipatterns/examples/1-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
  <DisplayName>TargetServer ResponseCache</DisplayName>
  <CacheKey>
    <Key Fragment ref="request.uri" /></CacheKey>
    <Scope>Exclusive</Scope>
    <ExpirySettings>
      <TimeoutInSec ref="flow.variable.here">600</TimeoutInSec>
    </ExpirySettings>
  <CacheResource>targetCache</CacheResource>
</ResponseCache>

Chính sách Bộ nhớ đệm phản hồi sẽ lưu các phản hồi lỗi vào bộ nhớ đệm ở cấu hình mặc định. Tuy nhiên, bạn không nên lưu các phản hồi lỗi vào bộ nhớ đệm mà không cân nhắc đáng kể về các hệ quả bất lợi vì:

  • Trường hợp 1: Lỗi xảy ra trong một khoảng thời gian tạm thời, không xác định và chúng tôi có thể tiếp tục gửi các phản hồi lỗi do lưu vào bộ nhớ đệm ngay cả khi sự cố đã được khắc phục

    HOẶC

  • Trường hợp 2: Lỗi sẽ được quan sát thấy trong một khoảng thời gian cố định, sau đó chúng tôi sẽ phải sửa đổi mã để tránh lưu các phản hồi vào bộ nhớ đệm sau khi khắc phục vấn đề

Hãy cùng tìm hiểu kỹ hơn về 2 trường hợp này để hiểu rõ hơn về điều này.

Trường hợp 1: Lỗi phụ trợ/tài nguyên tạm thời

Hãy xem xét rằng lỗi máy chủ phụ trợ là vì một trong những lý do sau:

  • Sự cố mạng tạm thời
  • Máy chủ phụ trợ đang rất bận và không thể phản hồi các yêu cầu trong một khoảng thời gian tạm thời
  • Tài nguyên phụ trợ được yêu cầu có thể bị xoá/không sử dụng được trong một khoảng thời gian tạm thời
  • Máy chủ phụ trợ phản hồi chậm do thời gian xử lý cao trong một khoảng thời gian tạm thời, v.v.

Trong tất cả những trường hợp này, lỗi có thể xảy ra trong một khoảng thời gian không xác định và sau đó chúng tôi có thể bắt đầu nhận được phản hồi thành công. Nếu lưu các phản hồi lỗi vào bộ nhớ đệm, chúng tôi có thể tiếp tục gửi các phản hồi lỗi cho người dùng mặc dù sự cố với máy chủ phụ trợ đã được khắc phục.

Trường hợp 2: Lỗi phụ trợ/tài nguyên bị kéo dài hoặc đã khắc phục

Hãy lưu ý rằng chúng ta biết lỗi trong phần phụ trợ là trong một khoảng thời gian cố định. Ví dụ: bạn biết rằng:

  • Một tài nguyên phụ trợ cụ thể sẽ không khả dụng trong 1 giờ

    HOẶC

  • Máy chủ phụ trợ sẽ bị xoá/không hoạt động trong 24 giờ do trang web đột ngột gặp lỗi, vấn đề về mở rộng quy mô, bảo trì, nâng cấp, v.v.

Với thông tin này, chúng tôi có thể đặt thời gian hết hạn bộ nhớ đệm một cách phù hợp trong Chính sách bộ nhớ đệm phản hồi để chúng tôi không lưu các phản hồi lỗi vào bộ nhớ đệm trong thời gian dài hơn. Tuy nhiên, khi máy chủ/tài nguyên phụ trợ hoạt động trở lại, chúng tôi sẽ phải sửa đổi chính sách để tránh việc lưu phản hồi lỗi vào bộ nhớ đệm. Lý do là nếu máy chủ phụ trợ gặp lỗi tạm thời/một lần, chúng ta sẽ lưu phản hồi vào bộ nhớ đệm và sẽ gặp sự cố giải thích trong tình huống 1 ở trên.

Mức độ tác động

  • Việc lưu các phản hồi lỗi vào bộ nhớ đệm có thể khiến các phản hồi lỗi được gửi ngay cả sau khi sự cố đã được giải quyết trong máy chủ phụ trợ
  • Người dùng có thể tốn nhiều công sức để khắc phục nguyên nhân của sự cố mà không biết rằng nguyên nhân là do việc lưu các phản hồi lỗi từ máy chủ phụ trợ vào bộ nhớ đệm

Phương pháp hay nhất

  • Không lưu trữ các phản hồi lỗi trong bộ nhớ đệm phản hồi. Hãy nhớ đặt phần tử <ExcludeErrorResponse> thành true trong chính sáchResponseCache để ngăn các phản hồi lỗi được lưu vào bộ nhớ đệm như minh hoạ trong đoạn mã dưới đây. Với cấu hình này, chỉ các phản hồi cho mã thành công mặc định từ 200 đến 205 (trừ phi mã thành công được sửa đổi) mới được lưu vào bộ nhớ đệm.
    <!-- /antipatterns/examples/1-2.xml -->
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ResponseCache async="false" continueOnError="false" enabled="true" name="TargetServerResponseCache">
      <DisplayName>TargetServerResponseCache</DisplayName>
      <CacheKey>
        <KeyFragment ref="request.uri" />
      </CacheKey>
      <Scope>Exclusive</Scope>
      <ExpirySettings>
        <TimeoutinSec ref="flow.variable.here">600</TimeoutinSec>
      </ExpirySettings>
      <CacheResource>targetCache</CacheResource>
      <ExcludeErrorResponse>true</ExcludeErrorResponse>
    </ResponseCache>
    
  • Nếu cần phải lưu các phản hồi lỗi vào bộ nhớ đệm vì lý do cụ thể nào đó, thì bạn có thể xác định khoảng thời gian tối đa/chính xác mà lỗi sẽ phát hiện được (nếu có thể):
    • Hãy đặt Thời gian hết hạn thích hợp để đảm bảo rằng bạn không lưu các phản hồi lỗi vào bộ nhớ đệm lâu hơn thời gian mà hệ thống có thể thấy lỗi.
    • Sử dụng chính sách ResponseCache để lưu các phản hồi lỗi vào bộ nhớ đệm mà không cần phần tử <ExcludeErrorResponse>.

    Chỉ làm việc này nếu bạn hoàn toàn chắc chắn rằng lỗi máy chủ phụ trợ không phải trong một khoảng thời gian ngắn/tạm thời.

  • Apigee không nên lưu các phản hồi 5xx vào bộ nhớ đệm từ các máy chủ phụ trợ.