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

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

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

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

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

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

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

นโยบายแคชการตอบกลับ

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

ลาย Antipattern

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

ตัวอย่างนโยบายแคชการตอบกลับที่มีการกำหนดค่าเริ่มต้นมีดังนี้

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

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

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

    หรือ

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

เรามาอธิบายเรื่องนี้โดยดู 2 สถานการณ์นี้อย่างละเอียดมากขึ้นกัน

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

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

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

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

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

เราทราบว่าความล้มเหลวในแบ็กเอนด์เป็นระยะเวลาหนึ่ง ตัวอย่างเช่น คุณทราบว่า:

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

    หรือ

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

เมื่อมีข้อมูลนี้ เราก็จะสามารถตั้งเวลาหมดอายุของแคชในแคชการตอบกลับได้อย่างเหมาะสม เพื่อให้ระบบไม่แคชการตอบกลับข้อผิดพลาดเป็นเวลานานขึ้น อย่างไรก็ตาม เมื่อ เซิร์ฟเวอร์/ทรัพยากรแบ็กเอนด์พร้อมใช้งานอีกครั้ง เราจะต้องแก้ไขนโยบายเพื่อหลีกเลี่ยงการแคช การตอบกลับข้อผิดพลาด ทั้งนี้เนื่องจากหากมีความล้มเหลวชั่วคราว/ครั้งเดียวจากแบ็กเอนด์ เราจะแคชการตอบกลับและจบลงด้วยปัญหาที่อธิบายในสถานการณ์ 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 จากเซิร์ฟเวอร์แบ็กเอนด์