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

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

หลังจากใช้งบแบบคงทนหมดแล้ว ระบบจะสร้าง tombstone ให้เซสชันแทนที่จะ วนซ้ำตลอดไป ให้ตรวจสอบเซสชันที่ล้มเหลวและใช้ /new หรือ /reset เพื่อเริ่ม เซสชันทดแทน openclaw doctor --fix สามารถซ่อมแซมแฟล็กการยกเลิกที่ค้างอยู่ ซึ่งขัดแย้งกับ tombstone แต่จะไม่เปิดใช้งานรอบการกู้คืนนั้นอีกครั้ง

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

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

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

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

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

เอเจนต์ย่อย

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

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

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

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

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

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

คอลัมน์ SQLite แบบระบุชนิดของตัวบ่งชี้เป็นแหล่งข้อมูลที่มีอำนาจสำหรับการจัดการรีสตาร์ต ค่า payload_json เป็นเพียงสำเนาเงาสำหรับการเรียกซ้ำ/ดีบักเท่านั้น รันไทม์จะอ่าน เขียน และล้างสถานะ SQLite โดยไม่มีระบบสำรองเป็นไฟล์ ระหว่างการเปลี่ยนผ่านระบบจัดเก็บ การย้ายสถานะที่มีขอบเขตจำกัดจะทำงานเมื่อเริ่มต้นระบบและผ่าน Doctor เพื่อรักษา restart-sentinel.json ที่ผ่านการตรวจสอบซึ่งโปรเซสเก่าทิ้งไว้หลังการอัปเดต การย้ายจะตรวจสอบแถวแบบระบุชนิดและลบไฟล์ต้นทางก่อนที่การจัดการรีสตาร์ตตามปกติ จะดำเนินการต่อ

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

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

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

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

On this page