แก้ปัญหาความล้มเหลวของ API ของมิดเดิลแวร์

API มิดเดิลแวร์ส่วนใหญ่จะแสดงผลออบเจ็กต์ SdvResult หากสำเร็จ ออบเจ็กต์นี้จะมีออบเจ็กต์ผลลัพธ์ที่คาดไว้ หากไม่สำเร็จ ออบเจ็กต์นี้จะมีออบเจ็กต์ SdvStatus ซึ่งบ่งบอกถึงลักษณะการทำงานที่ไม่คาดคิดหรือเงื่อนไขข้อผิดพลาด ซึ่งมักจะระบุด้วยรหัสข้อผิดพลาด เช่น Internal, Unavailable หรือ DataLoss

หน้านี้จะช่วยคุณแก้ปัญหารหัสข้อผิดพลาดเหล่านี้

แก้ปัญหาการลงทะเบียนและการสร้างไม่สำเร็จ

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

สร้างบริการที่ 2 ไม่ได้

ข้อผิดพลาด:

ข้อผิดพลาด Internal

สาเหตุ:

คุณพยายามลงทะเบียนอินสแตนซ์ของชุดบริการเดียวกัน (ชื่อและรหัสอินสแตนซ์) 2 ครั้ง

วิธีแก้ไข:

อย่าพยายามลงทะเบียนอินสแตนซ์ของชุดบริการเดียวกัน (ชื่อและรหัสอินสแตนซ์) 2 ครั้ง

ลบชุดบริการที่ซ้ำกันไม่ได้

ข้อผิดพลาด:

Status(-3, EX_ILLEGAL_ARGUMENT)

สาเหตุ:

คุณพยายามลบชุดบริการที่ซ้ำกันซึ่งไม่มีอยู่

วิธีแก้ไข:

อย่าพยายามลบชุดบริการที่ซ้ำกันซึ่งไม่มีอยู่

เรียกอินสแตนซ์ของผู้เผยแพร่โฆษณาเพื่อส่งข้อความไม่ได้

ข้อผิดพลาด:

การเรียก take_publisher() จะแสดงผล none

สาเหตุ:

คุณเรียก take_publisher() 2 ครั้งสำหรับตัวแปรเดียวกันจากอินสแตนซ์ของชุดบริการเดียวกัน

วิธีแก้ไข:

อย่าเรียก take_publisher() 2 ครั้งสำหรับตัวแปรเดียวกันจากอินสแตนซ์ของชุดบริการเดียวกัน

สร้าง Subscriber, Observer, History หรือ InstantReader ไม่ได้

ข้อผิดพลาด:

ข้อผิดพลาด Unavailable

สาเหตุ:

คุณพยายามสร้าง Subscriber, Observer, History หรือ InstantReader สำหรับผู้เผยแพร่โฆษณาที่ไม่มีอยู่หรือยกเลิกการลงทะเบียนแล้ว

วิธีแก้ไข:

ตรวจสอบว่าผู้เผยแพร่โฆษณามีอยู่หรือลงทะเบียนแล้วก่อนที่จะพยายามสร้าง Subscriber, Observer, History หรือ InstantReader สำหรับผู้เผยแพร่โฆษณา

สร้างไคลเอ็นต์ RPC ไม่ได้

ข้อผิดพลาด:

ข้อผิดพลาด Unavailable

สาเหตุ:

คุณพยายามสร้างไคลเอ็นต์ RPC สำหรับชื่อหน่วยเซิร์ฟเวอร์ที่ไม่มีอยู่หรือไม่ได้ลงทะเบียน

วิธีแก้ไข:

ตรวจสอบว่าเซิร์ฟเวอร์มีอยู่และลงทะเบียนแล้วก่อนที่จะสร้างไคลเอ็นต์ RPC

แก้ปัญหาการสื่อสารไม่สำเร็จ

การสื่อสารไม่สำเร็จอาจเกิดขึ้นหลังจากที่บริการทำงานเสร็จแล้วและเริ่มสื่อสารกับบริการอื่นๆ

แก้ปัญหาการยกเลิกการลงทะเบียนผู้เผยแพร่โฆษณา

ข้อผิดพลาดอาจเกิดขึ้นเมื่อผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านยังคงใช้งานอยู่

read_next_messages() ของ Subscriber แสดงผลรายการว่าง

ข้อผิดพลาด:

read_next_messages() ทำงานสำเร็จแต่แสดงผลรายการว่าง

สาเหตุ:

ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนแล้วและไม่มีข้อความใหม่

next() ของ Observer แสดงผลข้อผิดพลาดภายใน

ข้อผิดพลาด:

next() แสดงผลข้อผิดพลาด Internal

สาเหตุ:

ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาหายไปแล้วและไม่มีข้อความใหม่

read_from_history() ของ History ไม่แสดงผลข้อความใหม่

ข้อผิดพลาด:

read_from_history() ไม่แสดงผลข้อความใหม่ แต่แสดงผลเฉพาะข้อความเก่า

สาเหตุ:

ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาหายไปแล้วและไม่มีข้อความใหม่

read_latest_message() ของ InstantReader แสดงผลข้อผิดพลาดภายใน

ข้อผิดพลาด:

read_latest_message() แสดงผลข้อผิดพลาด Internal

สาเหตุ:

ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาหายไปแล้วและไม่มีข้อความใหม่

แก้ปัญหาคิวข้อความว่าง

ข้อผิดพลาดอาจเกิดขึ้นเมื่อพยายามอ่านจากคิวข้อความว่าง

read_next_messages() ของ Subscriber แสดงผลรายการว่าง

ข้อผิดพลาด:

read_next_messages() แสดงผลรายการว่างสำเร็จ

สาเหตุ:

ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่

next() ของ Observer แสดงผลข้อผิดพลาดภายใน

ข้อผิดพลาด:

next() แสดงผลข้อผิดพลาด Internal

สาเหตุ:

ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่

read_from_history() ของ History ไม่แสดงผลข้อความใหม่

ข้อผิดพลาด:

read_from_history() แสดงผลรายการว่างสำเร็จ

สาเหตุ:

ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่

read_latest_message() ของ InstantReader แสดงผลข้อผิดพลาดภายใน

ข้อผิดพลาด:

read_latest_message() แสดงผลข้อผิดพลาด Internal

สาเหตุ:

ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ

วิธีแก้ไข:

ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่

แก้ปัญหาบัฟเฟอร์ล้นหรือข้อมูลรั่วไหล

ข้อผิดพลาดอาจเกิดขึ้นเมื่อผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้

การอ่านครั้งแรกของ Subscriber หลังจากบัฟเฟอร์ล้นจะแสดงผลข้อผิดพลาด DataLoss

ข้อผิดพลาด:

read_next_message() แสดงผลข้อผิดพลาด DataLoss

สาเหตุ:

ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้

วิธีแก้ไข:

next() ครั้งแรกของ Observer หลังจากบัฟเฟอร์ล้นจะแสดงผลข้อผิดพลาด DataLoss

ข้อผิดพลาด:

next() แสดงผลข้อผิดพลาด DataLoss

สาเหตุ:

ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้

วิธีแก้ไข:

  • ผู้เผยแพร่โฆษณาเผยแพร่ช้าลง เช่น คุณอาจมีตัวแปรที่มีการประทับเวลาของข้อความล่าสุด หากเวลาปัจจุบันน้อยกว่าเวลาเผยแพร่ล่าสุดบวกกับเดลต้า คุณจะไม่เผยแพร่ข้อความ กลไกนี้จะเผยแพร่ข้อความอย่างมาก 1 ข้อความต่อเดลต้า

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

  • ผู้รับใช้การสุ่มตัวอย่าง หากโซลูชันของคุณมีผู้เผยแพร่โฆษณา (P1) ที่เผยแพร่ข้อความเร็วกว่าที่ Observer (01) จะอ่านได้ คุณสามารถสร้างผู้เผยแพร่โฆษณา (P2) และ Observer (02) ใหม่เพื่อรองรับความแตกต่างของความเร็วในการเผยแพร่และการอ่าน

    ตัวอย่างเช่น สมมติว่า P1 เผยแพร่ข้อความทุกๆ 10 มิลลิวินาที แต่ O1 อ่านได้เพียงข้อความเดียวทุกๆ 100 มิลลิวินาทีและละทิ้งข้อความที่เหลืออีก 9 ข้อความ หากต้องการแก้ไขความคลาดเคลื่อน ให้สร้างโซลูชันที่ทำตามขั้นตอนต่อไปนี้

    1. P1 เผยแพร่ข้อความไปยัง O2
    2. O2 อ่านข้อความ 1 ข้อความและละทิ้งข้อความอีก 9 ข้อความ
    3. O2 ส่งข้อความที่อ่านแล้ว 1 ข้อความไปยัง P2
    4. P2 ส่งข้อความที่อ่านแล้ว 1 ข้อความไปยัง O1
    5. O1 อ่านข้อความ 1 ข้อความทุกๆ 10 วินาที

    โค้ดตัวอย่างต่อไปนี้แสดงวิธีใช้สถานการณ์การสุ่มตัวอย่างนี้

    int discarded_message = 10;
    
    while (true) {
    message m = O2.read_message();
    if discarded_message == 10 {
      discarded_message = 0;
      P2.publish(m);
    } else {
     discarded_message ++;
    }
    }
    

การอ่านของ History ไม่สมบูรณ์

ข้อผิดพลาด:

ข้อความสูญหายก่อนที่จะคัดลอกประวัติ ไม่มีการแจ้งเตือนข้อผิดพลาดโดยตรงเมื่ออ่าน

สาเหตุ:

ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้

วิธีแก้ไข:

InstantReader อ่านเฉพาะข้อความสุดท้าย

ข้อผิดพลาด:

ข้อความสูญหายก่อนที่จะคัดลอกประวัติ ไม่มีการแจ้งเตือนข้อผิดพลาดโดยตรงเมื่ออ่าน

สาเหตุ:

ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้

วิธีแก้ไข:

ไม่มี

ไคลเอ็นต์ RPC เรียกใช้เมธอด แต่เมธอดไม่พร้อมใช้งาน

ข้อผิดพลาด:

การเรียกใช้เมธอดไม่สำเร็จเนื่องจากข้อผิดพลาด Unavailable

สาเหตุ:

SDV ไม่รู้จักชื่อเซิร์ฟเวอร์และแสดงผล Unavailable มิดเดิลแวร์จะแสดงผลข้อผิดพลาดนี้หาก Service Discovery ไม่แสดงผลชื่อเซิร์ฟเวอร์ที่ถูกต้อง

วิธีแก้ไข:

เริ่มชุดบริการที่กำหนด server สำหรับอินเทอร์เฟซที่ไคลเอ็นต์ต้องการใช้

การติดตั้งใช้งานฝั่งเซิร์ฟเวอร์แสดงผลข้อผิดพลาด SdvStatus

ข้อผิดพลาด:

การติดตั้งใช้งานฝั่งเซิร์ฟเวอร์แสดงผล SdvResult ที่มี SdvStatus ข้อผิดพลาด เช่น SdvStatusCode::NotFound ระบบจะส่งต่อข้อผิดพลาดกลับไปยังไคลเอ็นต์ที่เรียกใช้

สาเหตุ:

SDV และระบบการสื่อสารระหว่างไคลเอ็นต์กับเซิร์ฟเวอร์ทำงานตามที่คาดไว้ แต่ไคลเอ็นต์ส่งคำขอที่ทำให้เกิดข้อผิดพลาดในเซิร์ฟเวอร์

วิธีแก้ไข:

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