Gateway

การกู้คืนหลังการรีสตาร์ต

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

หน้านี้อธิบายว่าสิ่งใดยังคงอยู่หลังการรีสตาร์ต วิธีตรวจพบงานที่ถูกขัดจังหวะ และลักษณะการดำเนินงานต่อโดยอัตโนมัติ

สิ่งที่ยังคงอยู่หลังการรีสตาร์ต

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

การรีสตาร์ตแบบนุ่มนวลจะระบายงานก่อน

การรีสตาร์ตที่มีการร้องขอ (openclaw gateway restart การเปลี่ยนแปลงการกำหนดค่าที่ต้อง รีสตาร์ต หรือการอัปเดต Gateway) จะไม่ยุติงานที่กำลังดำเนินอยู่ทันที Gateway จะหยุดรับงานใหม่ แล้วรอให้รอบการทำงานของเอเจนต์และ งานเบื้องหลังที่ใช้งานอยู่เสร็จสิ้น ภายในงบเวลาระบายงาน (ค่าเริ่มต้นคือ 5 นาที) ดังนั้น การรีสตาร์ตส่วนใหญ่จึงไม่ขัดจังหวะงานใดเลย

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

วิธีตรวจพบงานที่ถูกขัดจังหวะ

กลไกเสริมกันสามประการจะทำเครื่องหมายเซสชันที่รอบการทำงานไม่เสร็จสิ้น:

  • เมื่อรับรอบการทำงาน: สำหรับรอบข้อความทั่วไปในเซสชันหลักที่มีอยู่ Gateway จะเพิ่มข้อความของผู้ใช้ ทำเครื่องหมายว่าเซสชันกำลังทำงาน และบันทึก การอ้างสิทธิ์การนำส่งเพื่อการกู้คืนในธุรกรรม SQLite เดียว ก่อนดำเนินการกับโมเดลหรือ ฮุก before_agent_reply โดย Control UI จะดำเนินการนี้ก่อนส่งการตอบรับ started กลับ ส่วนการส่งผ่านช่องทางจะดำเนินการเมื่อรอบการทำงานที่เตรียมไว้ รับช่วงการทำงานของเอเจนต์ คำสั่ง ไฟล์แนบ การแทนที่ค่าเฉพาะรอบ การนำส่งที่รอดำเนินการ คำบอกใบ้การยกเลิกก่อนหน้า เซสชันที่ Plugin เป็นเจ้าของ และรอบการทำงานที่มีฮุกการดำเนินการ จะยังคงใช้ เส้นทางการรับงานเฉพาะของตน หากติดตั้งฮุก before_agent_reply การรับงานจะบันทึกเฟสของฮุกด้วย การกู้คืนจะไม่เล่นซ้ำฮุกที่ถูกขัดจังหวะระหว่างการเรียก เมื่อฮุกที่ไม่ได้จัดการ ทำงานเสร็จ จุดตรวจสอบจะบันทึกผลลัพธ์นั้น แต่การกู้คืนจะยังคงปฏิเสธการดำเนินการ ขณะที่ฮุกดังกล่าวยังทำงานอยู่ เนื่องจากจุดตรวจสอบไม่สามารถพิสูจน์ได้ว่า โค้ดและการกำหนดค่าของ Plugin เดิมถูกโหลดหลังการรีสตาร์ต ผลลัพธ์ข้อความ ที่จัดการแล้วและผลลัพธ์แบบเงียบจะถูกบันทึกเป็นจุดตรวจสอบแยกกันเพื่อให้ยุติสถานะ ได้อย่างแน่นอน การอ้างสิทธิ์การกู้คืนแบบคงทนที่เขียนโดยเวอร์ชันเก่าไม่มีเครื่องหมายระบุ ความเป็นเจ้าของของแหล่งที่มา จึงได้รับการตรวจสอบฮุกแบบปฏิเสธการดำเนินการเช่นเดียวกัน ระหว่างการอัปเกรด
  • เมื่อปิดระบบ: ระหว่างการระบายงานเพื่อรีสตาร์ต ทุกเซสชันที่มีการทำงานอยู่ จะได้รับเครื่องหมายการกู้คืนในพื้นที่จัดเก็บเซสชันก่อนที่การทำงานนั้นจะถูก ยกเลิก
  • เมื่อเริ่มต้นระบบ: Gateway จะสแกนพื้นที่จัดเก็บเซสชันเพื่อหาเซสชันที่ยัง อ้างว่ากำลังทำงาน แต่ไม่มีเจ้าของที่ทำงานอยู่ในโพรเซสใหม่ วิธีนี้ตรวจพบ ระบบขัดข้องรุนแรงและการยุติโพรเซสที่ไม่มีโค้ดปิดระบบทำงาน ระบบจะล้างไฟล์ล็อก บันทึกการสนทนาที่ค้างอยู่ในเวลาเดียวกัน

การดำเนินงานต่อโดยอัตโนมัติ

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

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

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

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

OpenClaw ยังสามารถสร้างงาน Code Mode แบบอ่านอย่างเดียว ที่ถูกขัดจังหวะขึ้นใหม่ได้ Code Mode จะทำเครื่องหมายการทำงานเหล่านี้ว่าปลอดภัย ต่อการรีสตาร์ต และปฏิเสธเครื่องมือในแค็ตตาล็อกหรือเนมสเปซของ Plugin ที่ก่อให้เกิด ผลข้างเคียงก่อนดำเนินการ หากการรีสตาร์ตเกิดขึ้นที่ตัวควบคุม wait Gateway ใหม่จะสร้างรอบการทำงานขึ้นใหม่จากบันทึกการสนทนา และบังคับให้การดำเนินการที่สร้างขึ้นใหม่ยังคงปลอดภัยต่อการรีสตาร์ต แม้โมเดลจะละเว้น หรือล้างแฟล็กดังกล่าว โฮสต์จะกรองรอบการทำงานที่สร้างขึ้นใหม่ทั้งหมดให้เหลือเฉพาะ เครื่องมือหลักแบบอ่านอย่างเดียวที่ผ่านการตรวจสอบ และเครื่องมือของ Plugin ที่ระบุ อย่างชัดเจนว่าปลอดภัยต่อการเล่นซ้ำ รวมถึงกรณีที่ Code Mode ถูกปิดใช้งานหลัง การรีสตาร์ต งานที่ก่อให้เกิดผลข้างเคียงจะยังคงได้รับการป้องกันด้วยข้อความแจ้งให้ ส่งซ้ำ แทนการเสี่ยงเขียนข้อมูลซ้ำ

เอเจนต์ย่อย

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

  • การทำงานที่ถูกขัดจังหวะนานกว่า 2 ชั่วโมงจะถูกยุติสถานะแทนการดำเนินงานต่อ เพื่อให้ Gateway ที่หยุดทำงานข้ามคืนไม่ชุบชีวิตงานที่ล้าสมัย
  • เซสชันที่กู้คืนล้มเหลวซ้ำ ๆ จะถูกทำเครื่องหมายด้วยทูมสโตนว่าติดค้าง เพื่อให้ การกู้คืนไม่วนซ้ำตลอดไป

งานเบื้องหลัง

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

การรีสตาร์ตที่เอเจนต์ร้องขอ

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

กลไกความปลอดภัยและการสังเกตการณ์

  • ตัวตัดวงจรการขัดข้องซ้ำ: การบูตที่ไม่สมบูรณ์ 3 ครั้งภายใน 5 นาทีจะเรียกใช้ ตัวตัดวงจร ซึ่งระงับการเริ่มบริการเสริมโดยอัตโนมัติในการบูตครั้งถัดไป เพื่อไม่ให้ Gateway ที่ขัดข้องซ้ำทวีความรุนแรงของปัญหา ระบบจะกลับมาทำงานเมื่อช่วงเวลา ติดตามการบูตที่ไม่สมบูรณ์สิ้นสุดลง
  • เมตริก: กิจกรรมการกู้คืนจะถูกส่งออกผ่าน Prometheus ในชื่อ openclaw_session_recovery_total และ openclaw_session_recovery_age_seconds
  • บันทึกเหตุการณ์: การตัดสินใจเกี่ยวกับการกู้คืนจะถูกบันทึกภายใต้ ระบบย่อย main-session-restart-recovery และ subagent-interrupted-resume

สิ่งที่ระบบไม่ดำเนินงานต่อ

  • เซสชันที่ถูกยกเว้นจากการกู้คืนเซสชันหลัก เนื่องจากมีเจ้าของรายอื่นจัดการอยู่แล้ว: เซสชันเอเจนต์ย่อย (การกู้คืนเอเจนต์ย่อย), เซสชัน cron (ตัวกำหนดเวลาจะเรียกใช้ อีกครั้งตามกำหนดการ) และเซสชันที่ ACP จัดการ (IDE หรือไคลเอนต์ที่เชื่อมต่อ เป็นเจ้าของการดำเนินงานต่อ)
  • เซสชันที่ไม่สามารถดำเนินงานต่อจากส่วนท้ายของบันทึกการสนทนาได้อย่างปลอดภัย เซสชันเหล่านี้จะได้รับข้อความแจ้งให้ส่งซ้ำตามที่อธิบายไว้ข้างต้น แทนการเรียกใช้ซ้ำ โดยไม่มีการแจ้ง
  • งานที่ไม่เคยถูกรับเข้าระบบ ข้อความที่เข้ามาระหว่างช่วงระบายงานจะถูกปฏิเสธ พร้อมข้อผิดพลาดการรีสตาร์ตที่ชัดเจน แทนการนำเข้าคิวของโพรเซสที่กำลังจะยุติ โดยไม่มีการแจ้ง
Was this useful?
On this page

On this page