Antipattern: เรียกใช้นโยบาย MessageLoking หลายครั้งในพร็อกซี API

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

นโยบาย MessageLaking ของ Apigee Edge ช่วยให้นักพัฒนาพร็อกซี API บันทึกข้อความที่กำหนดเองไปยัง syslog หรือไปยังดิสก์ (Edge สำหรับ Private Cloud เท่านั้น) ข้อมูลสำคัญที่เกี่ยวข้องกับ API เช่น พารามิเตอร์อินพุต เพย์โหลดคำขอ โค้ดตอบกลับ ข้อความแสดงข้อผิดพลาด (หากมี) เป็นต้น จะสามารถบันทึกสำหรับการอ้างอิงในภายหลังหรือสำหรับการแก้ไขข้อบกพร่อง แม้ว่านโยบายจะใช้ กระบวนการเบื้องหลังในการบันทึก มีข้อควรระวังในการใช้นโยบาย

ลาย Antipattern

นโยบายการบันทึกข้อความเป็นวิธีที่มีประสิทธิภาพในการรับข้อมูลเพิ่มเติมเกี่ยวกับ คำขอ API และแก้ไขข้อบกพร่องของคำขอ API ที่พบ แต่การใช้นโยบาย MessageLนั้นๆ มากกว่า 1 ครั้ง หรือการใช้ ข้อมูลบันทึกของนโยบาย MessageLaking เป็นส่วนๆ ในพร็อกซี API เดียวกันในขั้นตอนอื่นนอกเหนือจาก PostClientFlow อาจส่งผลกระทบที่ไม่พึงประสงค์ เนื่องจาก Apigee Edge เปิดการเชื่อมต่อ ไปยังเซิร์ฟเวอร์ Syslog ภายนอกสำหรับนโยบาย MessageLaking หากนโยบายใช้ TLS ผ่าน TCP จะมีค่าใช้จ่ายเพิ่มเติมในการสร้างการเชื่อมต่อ TLS

เรามาลองอธิบายเรื่องนี้โดยใช้ตัวอย่างพร็อกซี API กัน

พร็อกซี API

ในตัวอย่างต่อไปนี้ นโยบาย MessageLcking ที่ชื่อ "LogRequestInfo" จะอยู่ใน ขั้นตอนการส่งคำขอและนโยบาย MessageLและข้อมูล อีกรายการหนึ่งชื่อ "LogResponseInfo" จะเพิ่มลงใน ขั้นตอนการตอบกลับ ทั้ง 2 อย่างอยู่ใน ProxyEndpoint PreFlow นโยบาย LogRequestInfo ดำเนินการตาม อยู่ในเบื้องหลังทันทีที่พร็อกซี API ได้รับคำขอ และ LogResponseInfo นโยบายจะทำงานหลังจากที่พร็อกซีได้รับการตอบสนองจากเซิร์ฟเวอร์เป้าหมาย แต่ก่อนที่พร็อกซีจะแสดงผลการตอบกลับไปยังไคลเอ็นต์ API การดำเนินการนี้จะใช้เวลา ทรัพยากรระบบเพิ่มเติมเนื่องจากกำลังสร้างการเชื่อมต่อ TLS 2 รายการ

นอกจากนี้ยังมีนโยบาย MessageLcking ที่ชื่อว่า "LogErrorInfo" ที่จะดำเนินการเท่านั้น หากมีข้อผิดพลาดระหว่างการดำเนินการพร็อกซี API

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
  ...
<FaultRules>
    <FaultRule name="fault-logging">
        <Step>
            <Name>LogErrorInfo</Name>
        </Step>
    </FaultRule>
</FaultRules>
<PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>LogRequestInfo</Name>
      </Step>
    </Request>
  </PreFlow>
  <PreFlow name="PreFlow">
    <Response>
      <Step>
        <Name>LogResponseInfo</Name>
      </Step>
    </Response>
  </PreFlow>
  ...
</ProxyEndpoint>

นโยบายการบันทึกข้อความ

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

นโยบาย LogRequestInfo

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogRequestInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {request.queryparam.w}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

นโยบาย LogResponseInfo

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogResponseInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Status: {response.status.code}, Response {response.content}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

นโยบาย LogErrorInfo

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogErrorInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Fault name: {fault.name}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>ERROR</logLevel>
</MessageLogging>

ผลกระทบ

  • เพิ่มค่าใช้จ่ายของเครือข่ายเนื่องจากสร้างการเชื่อมต่อกับเซิร์ฟเวอร์บันทึกหลายรายการ ระหว่างขั้นตอนพร็อกซี API
  • หากเซิร์ฟเวอร์ syslog ทำงานช้าหรือไม่สามารถจัดการกับปริมาณมากที่เกิดจาก syslog หลายรายการ แล้วจะทำให้เกิดแรงกดดันกลับต่อผู้ประมวลผลข้อความ ทำให้คำขอทำงานช้า การประมวลผลและข้อผิดพลาดที่มีเวลาในการตอบสนองสูงหรือข้อผิดพลาดเกตเวย์ 504
  • เพิ่มจำนวนข้อบ่งชี้ไฟล์ที่เปิดโดยตัวประมวลผลข้อความพร้อมกันใน การตั้งค่า Private Cloud ที่ใช้การบันทึกไฟล์
  • หากวางนโยบาย MessageLนั้นๆ ในขั้นตอนอื่นๆ ที่ไม่ใช่ขั้นตอน PostClient มี เป็นไปได้ว่าข้อมูลอาจไม่ได้รับการบันทึก เนื่องจากนโยบาย MessageLaking จะไม่ จะได้รับการดำเนินการหากมีความล้มเหลวเกิดขึ้นก่อนการใช้นโยบายนี้

    ในตัวอย่าง ProxyEndpoint ก่อนหน้านี้ ข้อมูลจะ จะไม่ถูกบันทึกในกรณีต่อไปนี้

    • หากนโยบายใดๆ ที่แสดงก่อนนโยบาย LogRequestInfo ใน ขั้นตอนการส่งคำขอไม่สำเร็จ
      หรือ
    • หากเซิร์ฟเวอร์เป้าหมายทำงานล้มเหลวโดยมีข้อผิดพลาด (HTTP 4XX, 5XX) ในสถานการณ์นี้ เมื่อ จะไม่มีการส่งกลับคำตอบที่สำเร็จ และนโยบาย LogResponseInfo จะไม่ ถูกประหาร

    ในทั้ง 2 กรณี ระบบจะเรียกใช้นโยบาย LogErrorInfo และบันทึกเฉพาะข้อผิดพลาดที่เกี่ยวข้องกับข้อผิดพลาดเท่านั้น

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

  • ใช้นโยบาย ExtractVariable หรือนโยบาย JavaScript เพื่อตั้งค่าโฟลว์ทั้งหมด ตัวแปรที่จะบันทึก ซึ่งทำให้พร้อมใช้งานในนโยบาย MessageLaking
  • ใช้นโยบาย MessageLcking เดียวเพื่อบันทึกข้อมูลที่จำเป็นทั้งหมดใน PostClientFlow ซึ่งจะถูกดำเนินการโดยไม่มีเงื่อนไข
  • ใช้โปรโตคอล UDP ซึ่งไม่มีการรับประกันว่าจะส่งข้อความไปยังเซิร์ฟเวอร์ syslog และไม่จำเป็นต้องใช้ TLS/SSL

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

ตัวอย่างการเรียกใช้นโยบาย MessageL การดำเนินการต่อใน PostClientFlow มีดังนี้

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 ...
<PostClientFlow>
        <Request/>
        <Response>
            <Step>
                <Name>LogInfo</Name>
            </Step>
        </Response>
</PostClientFlow>
 ...

ต่อไปนี้คือตัวอย่างของนโยบาย MessageLนั้นๆ ที่ชื่อ LogInfo ที่บันทึกข้อมูลทั้งหมด

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {woeid} Status: {weather.response.code}, Response {weather.response}, Fault: {fault.name:None}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

เนื่องจากการตอบสนอง ตัวแปรจะไม่มีใน PostClientFlow หลังจากโฟลว์ข้อผิดพลาด ตั้งค่าตัวแปร woeid และ weather.response* อย่างชัดแจ้งโดยใช้ นโยบาย ExtractVariable หรือ JavaScript

อ่านเพิ่มเติม