แก้ปัญหาความล้มเหลวของ 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 ของผู้สมัครใช้บริการแสดงรายการว่างเปล่า

ข้อผิดพลาด:

read_next_messages สำเร็จแต่แสดงผลรายการที่ว่างเปล่า

สาเหตุ

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

วิธีแก้ไข

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

การเรียกใช้ Observer.next แสดงข้อผิดพลาดภายใน

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

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

read_from_history ของประวัติไม่แสดงข้อความใหม่

ข้อผิดพลาด:

read_from_history จะไม่แสดงข้อความใหม่ แต่จะแสดงเฉพาะข้อความเก่าเท่านั้น

สาเหตุ

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

วิธีแก้ไข

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

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

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

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

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

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

read_next_messages ของผู้สมัครใช้บริการแสดงรายการที่ว่างเปล่า

ข้อผิดพลาด:

read_next_messages แสดงผลรายการว่างเปล่าเรียบร้อยแล้ว

สาเหตุ

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

วิธีแก้ไข

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

การเรียกใช้ Observer.next แสดงข้อผิดพลาดภายใน

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

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

read_from_history ของประวัติไม่แสดงข้อความใหม่

ข้อผิดพลาด:

read_from_history แสดงผลรายการว่างเปล่าเรียบร้อยแล้ว

สาเหตุ

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

วิธีแก้ไข

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

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

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

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

แก้ปัญหาบัฟเฟอร์โอเวอร์โฟลว์หรือข้อมูลสูญหาย

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

การอ่านครั้งแรกของผู้สมัครใช้บริการหลังจากเกิดข้อผิดพลาด Overflow จะแสดงข้อผิดพลาด DataLoss

ข้อผิดพลาด:

read_next_messages แสดงผลข้อผิดพลาด DataLoss

สาเหตุ

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

วิธีแก้ไข

การแก้ไขที่เป็นไปได้มีดังนี้

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

การเรียกใช้ next ครั้งแรกของผู้สังเกตการณ์หลังจากเกิดข้อผิดพลาดโอเวอร์โฟลว์จะแสดงข้อผิดพลาด DataLoss

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

การแก้ไขที่เป็นไปได้มีดังนี้

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

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

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

    ตัวอย่างเช่น สมมติว่า P1 เผยแพร่ข้อความทุกๆ 10 มิลลิวินาที แต่ O1 อ่านข้อความได้เพียง 1 ข้อความทุกๆ 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 ++;
    }
    }
    

การอ่านประวัติไม่สมบูรณ์

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

การแก้ไขที่เป็นไปได้มีดังนี้

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

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

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

ไม่มี

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

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

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

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

ข้อผิดพลาด:

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

สาเหตุ

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

วิธีแก้ไข

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