Antipattern: การตอบกลับข้อผิดพลาดเกี่ยวกับแคช

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

การแคชคือกระบวนการจัดเก็บข้อมูลชั่วคราวในพื้นที่เก็บข้อมูลที่เรียกว่าแคชเพื่อใช้อ้างอิงในอนาคต การแคชข้อมูลช่วยเพิ่มประสิทธิภาพได้อย่างมากเนื่องจาก

  • ช่วยให้ดึงข้อมูลได้เร็วขึ้น
  • ลดเวลาในการประมวลผลโดยหลีกเลี่ยงการสร้างข้อมูลซ้ำๆ
  • ป้องกันไม่ให้คำขอ API ไปยังเซิร์ฟเวอร์แบ็กเอนด์ ซึ่งจะช่วยลดภาระงานของ เซิร์ฟเวอร์แบ็กเอนด์
  • ช่วยให้ใช้ทรัพยากรของระบบ/แอปพลิเคชันได้ดียิ่งขึ้น
  • ปรับปรุงเวลาตอบสนองของ API

เมื่อใดก็ตามที่เราต้องเข้าถึงข้อมูลบางอย่างบ่อยๆ ซึ่งข้อมูลนั้นไม่ได้เปลี่ยนแปลงบ่อยนัก เราขอแนะนำให้ใช้แคชเพื่อจัดเก็บข้อมูลนี้

Apigee Edge มีความสามารถในการจัดเก็บข้อมูลในแคชขณะรันไทม์เพื่อความคงทนและการดึงข้อมูลที่เร็วขึ้น ฟีเจอร์การแคชพร้อมใช้งานผ่านนโยบาย PopulateCache, LookupCache, นโยบาย InvalidateCache และนโยบาย ResponseCache

ในส่วนนี้ เราจะมาดูนโยบาย Response Cache กัน นโยบาย Response Cache ในแพลตฟอร์ม Apigee Edge ช่วยให้คุณแคชการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์ได้ หากแอปพลิเคชันไคลเอ็นต์ส่งคำขอไปยังทรัพยากรแบ็กเอนด์เดียวกันซ้ำๆ และทรัพยากรได้รับการอัปเดตเป็นระยะๆ เราสามารถแคชการตอบกลับเหล่านี้ได้โดยใช้นโยบายนี้ นโยบาย Response Cache ช่วยในการแสดงผลการตอบกลับที่แคชไว้ และหลีกเลี่ยงการส่งต่อคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์โดยไม่จำเป็น

นโยบาย Response Cache มีหน้าที่ดังนี้

  • ลดจำนวนคำขอที่ส่งไปยังแบ็กเอนด์
  • ลดแบนด์วิดท์เครือข่าย
  • ปรับปรุงประสิทธิภาพและเวลาตอบสนองของ API

รูปแบบที่ไม่แนะนำ

นโยบาย ResponseCache ช่วยให้คุณแคชการตอบกลับ HTTP ที่มีรหัสสถานะที่เป็นไปได้ทั้งหมดได้ โดยค่าเริ่มต้น ซึ่งหมายความว่าทั้งการตอบกลับที่สำเร็จและการตอบกลับข้อผิดพลาดสามารถแคชได้

ต่อไปนี้คือตัวอย่างนโยบาย Response Cache ที่มีการกำหนดค่าเริ่มต้น

<!-- /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>

นโยบาย Response Cache จะแคชการตอบกลับข้อผิดพลาดในการกำหนดค่าเริ่มต้น อย่างไรก็ตาม เราไม่แนะนำให้แคชการตอบกลับข้อผิดพลาดโดยไม่พิจารณาถึงผลกระทบที่อาจเกิดขึ้นอย่างรอบคอบ เนื่องจาก

  • สถานการณ์ที่ 1: ข้อผิดพลาดเกิดขึ้นชั่วคราวเป็นระยะเวลาที่ไม่ทราบ และเรา อาจส่งการตอบกลับข้อผิดพลาดต่อไป เนื่องจากการแคช แม้ว่าปัญหาจะได้รับการแก้ไขแล้วก็ตาม

    หรือ

  • สถานการณ์ที่ 2: ข้อผิดพลาดจะเกิดขึ้นเป็นระยะเวลาหนึ่ง จากนั้นเราจะต้องแก้ไขโค้ดเพื่อหลีกเลี่ยงการแคชการตอบกลับเมื่อปัญหาได้รับการแก้ไขแล้ว

เราจะอธิบายเรื่องนี้โดยพิจารณาสถานการณ์ทั้ง 2 นี้โดยละเอียด

สถานการณ์ที่ 1: แบ็กเอนด์/ทรัพยากรขัดข้องชั่วคราว

พิจารณาว่าเซิร์ฟเวอร์แบ็กเอนด์ขัดข้องเนื่องจากสาเหตุใดสาเหตุหนึ่งต่อไปนี้

  • เครือข่ายขัดข้องชั่วคราว
  • เซิร์ฟเวอร์แบ็กเอนด์ทำงานหนักมากและไม่สามารถตอบสนองต่อคำขอได้ชั่วคราว
  • ระบบอาจนำทรัพยากรแบ็กเอนด์ที่ขอออก/ทรัพยากรไม่พร้อมใช้งานชั่วคราว
  • เซิร์ฟเวอร์แบ็กเอนด์ตอบสนองช้าเนื่องจากเวลาในการประมวลผลสูงชั่วคราว เป็นต้น

ในกรณีเหล่านี้ทั้งหมด ข้อผิดพลาดอาจเกิดขึ้นเป็นระยะเวลาที่ไม่ทราบ จากนั้นเราอาจเริ่มได้รับการตอบกลับที่สำเร็จ หากเราแคชการตอบกลับข้อผิดพลาด เราอาจส่งการตอบกลับข้อผิดพลาดไปยังผู้ใช้ต่อไป แม้ว่าปัญหาเกี่ยวกับเซิร์ฟเวอร์แบ็กเอนด์จะได้รับการแก้ไขแล้วก็ตาม

สถานการณ์ที่ 2: แบ็กเอนด์/ทรัพยากรขัดข้องเป็นเวลานานหรือเป็นระยะเวลาที่กำหนด

พิจารณาว่าเราทราบว่าแบ็กเอนด์ขัดข้องเป็นระยะเวลาที่กำหนด เช่น คุณทราบว่า

  • ทรัพยากรแบ็กเอนด์ที่เฉพาะเจาะจงจะไม่พร้อมใช้งานเป็นเวลา 1 ชั่วโมง

    หรือ

  • ระบบนำเซิร์ฟเวอร์แบ็กเอนด์ออก/เซิร์ฟเวอร์ไม่พร้อมใช้งานเป็นเวลา 24 ชั่วโมงเนื่องจากเว็บไซต์ขัดข้องกะทันหัน, ปัญหาการปรับขนาด การบำรุงรักษา การอัปเกรด เป็นต้น

เมื่อทราบข้อมูลนี้แล้ว เราสามารถกำหนดเวลาหมดอายุของแคชได้อย่างเหมาะสมในนโยบาย Response Cache เพื่อไม่ให้แคชการตอบกลับข้อผิดพลาดเป็นเวลานาน อย่างไรก็ตาม เมื่อเซิร์ฟเวอร์/ทรัพยากรแบ็กเอนด์พร้อมใช้งานอีกครั้ง เราจะต้องแก้ไขนโยบายเพื่อหลีกเลี่ยงการแคชการตอบกลับข้อผิดพลาด เนื่องจากหากเซิร์ฟเวอร์แบ็กเอนด์ขัดข้องชั่วคราว/เพียงครั้งเดียว เราจะแคชการตอบกลับและจะพบปัญหาตามที่อธิบายไว้ในสถานการณ์ที่ 1 ด้านบน

ผลกระทบ

  • การแคชการตอบกลับข้อผิดพลาดอาจทำให้ระบบส่งการตอบกลับข้อผิดพลาดแม้ว่าปัญหาในเซิร์ฟเวอร์แบ็กเอนด์จะได้รับการแก้ไขแล้วก็ตาม
  • ผู้ใช้อาจใช้ความพยายามอย่างมากในการแก้ปัญหาโดยไม่ทราบว่า สาเหตุเกิดจากการแคชการตอบกลับข้อผิดพลาดจากเซิร์ฟเวอร์แบ็กเอนด์

แนวทางปฏิบัติแนะนำ

  • อย่าจัดเก็บการตอบกลับข้อผิดพลาดในแคชการตอบกลับ ตรวจสอบว่าได้ตั้งค่าองค์ประกอบ <ExcludeErrorResponse> เป็นtrue ใน นโยบาย ResponseCache เพื่อป้องกันไม่ให้แคชการตอบกลับข้อผิดพลาดตามที่แสดงในข้อมูลโค้ดด้านล่าง การกำหนดค่านี้จะแคชเฉพาะการตอบกลับสำหรับรหัสความสำเร็จเริ่มต้น 200 ถึง 205 (ยกเว้นกรณีที่แก้ไขรหัสความสำเร็จ)
    <!-- /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>
  • หากคุณต้องการแคชการตอบกลับข้อผิดพลาดด้วยเหตุผลบางประการ คุณ สามารถกำหนดระยะเวลาสูงสุด/ระยะเวลาที่แน่นอนที่อาจพบข้อผิดพลาด (หาก เป็นไปได้) ได้ดังนี้
    • กำหนดเวลาหมดอายุอย่างเหมาะสมเพื่อให้แน่ใจว่าคุณจะไม่แคชการตอบกลับข้อผิดพลาด นานกว่าระยะเวลาที่อาจพบข้อผิดพลาด
    • ใช้นโยบาย ResponseCache เพื่อแคชการตอบกลับข้อผิดพลาดโดยไม่มีองค์ประกอบ <ExcludeErrorResponse>

    ทำเช่นนี้ ก็ต่อเมื่อคุณแน่ใจว่าเซิร์ฟเวอร์แบ็กเอนด์ขัดข้องไม่นาน/ชั่วคราว

  • Apigee ไม่แนะนำให้แคชการตอบกลับ 5xx จากเซิร์ฟเวอร์แบ็กเอนด์