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