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.
Truy cập vào tài liệu Apigee X.
thông tin

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

  • 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 liên tục tạo lại dữ liệu
  • Ngăn các yêu cầu API truy cập vào máy chủ phụ trợ, từ đó giảm mức hao tổn trên máy chủ phụ trợ
  • Cho phép sử dụng hiệu quả hơn các tài nguyên 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 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 tại 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ách PopulateCache, chính sách LookupCache, chính sách InvalidateCachechính sách ResponseCache.

Trong phần này, hãy xem xét chính sách về Bộ nhớ đệm phản hồi. Chính sách Bộ nhớ đệm phản hồi trong nền tảng Apigee Edge cho phép bạn lưu 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 đưa ra yêu cầu đối với 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 này 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 được lưu vào bộ nhớ đệm và do đó, tránh chuyển tiếp các yêu cầu đến các máy chủ phụ trợ một cách không cần thiết.

Chính sách Response Cache:

  • 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 và thời gian phản hồi của API

Antipattern

Theo mặc định, chính sách ResponseCache cho phép bạn lưu các phản hồi HTTP vào bộ nhớ đệm bằng mọi mã trạng thái có thể. Đ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.

Sau đây là chính sách Response Cache 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 Response Cache (Bộ nhớ đệm phản hồi) sẽ lưu vào bộ nhớ đệm các phản hồi lỗi trong cấu hình mặc định. Tuy nhiên, bạn không nên lưu phản hồi lỗi vào bộ nhớ đệm mà không cân nhắc kỹ lưỡng những tác động tiêu cực 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 phản hồi lỗi do lưu vào bộ nhớ đệm ngay cả sau khi vấn đề đã được khắc phục

    HOẶC

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

Hãy cùng tìm hiểu chi tiết hơn về hai trường hợp này để hiểu rõ hơn.

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

Hãy cân nhắc rằng lỗi ở máy chủ phụ trợ là do một trong các lý do sau:

  • Lỗi 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 dùng được trong một khoảng thời gian tạm thời
  • Máy chủ phụ trợ đang 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, các lỗi có thể xảy ra trong một khoảng thời gian không xác định và sau đó chúng ta có thể bắt đầu nhận được các phản hồi thành công. Nếu lưu phản hồi lỗi vào bộ nhớ đệm, thì chúng ta có thể tiếp tục gửi phản hồi lỗi cho người dùng ngay cả khi vấn đề với máy chủ phụ trợ đã được khắc phục.

Trường hợp 2: Lỗi kéo dài hoặc cố định về phần phụ trợ/tài nguyên

Hãy xem xét rằng chúng tôi biết lỗi ở 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 trong hai trường hợp sau đây xảy ra:

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

    HOẶC

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

Với thông tin này, chúng ta có thể đặt thời gian hết hạn của bộ nhớ đệm một cách thích hợp trong chính sách Bộ nhớ đệm phản hồi để không lưu vào bộ nhớ đệm các phản hồi lỗi 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 ta sẽ phải sửa đổi chính sách để tránh lưu vào bộ nhớ đệm các phản hồi lỗi. Điều này là do nếu có lỗi tạm thời/một lần từ máy chủ phụ trợ, chúng tôi sẽ lưu phản hồi vào bộ nhớ đệm và gặp phải vấn đề như đã giải thích trong trường hợp 1 ở trên.

Tác động

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

Phương pháp hay nhất

  • Đừng lưu trữ các phản hồi lỗi trong bộ nhớ đệm phản hồi. Đảm bảo rằng phần tử <ExcludeErrorResponse> được đặt thành true trong chính sách ResponseCache để ngăn các phản hồi lỗi được lưu vào bộ nhớ đệm như trong đoạn mã bên dưới. 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 bạn sửa đổi mã thành công) 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ó yêu cầu lưu vào bộ nhớ đệm các phản hồi lỗi vì một lý do cụ thể, thì bạn có thể xác định khoảng thời gian tối đa/chính xác mà lỗi sẽ xảy ra (nếu có thể):
    • Đặt Thời gian hết hạn một cách thích hợp để đảm bảo rằng bạn không lưu vào bộ nhớ đệm các phản hồi lỗi lâu hơn thời gian có thể thấy lỗi.
    • Sử dụng chính sách ResponseCache để lưu vào bộ nhớ đệm các phản hồi lỗi mà không có phần tử <ExcludeErrorResponse>.

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

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