หากคุณมีงานที่คุณต้องการเรียกใช้เพียงครั้งเดียวในคลัสเตอร์ของเซิร์ฟเวอร์ในช่วงเวลาปกติสิ่งที่จะเป็นวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้ นิยามของคลัสเตอร์ในกรณีนี้คือเซิร์ฟเวอร์ที่เหมือนกัน 2 ตัวขึ้นไปที่มีเซสชันแบบกระจายซึ่งนั่งอยู่ด้านหลังตัวโหลดบาลานซ์
ใช้กรณี:คุณมีงานที่มีราคาแพงในการทำงานที่ควรรันเพียงครั้งเดียวต่อหนึ่งชั่วโมง X งานนี้สามารถทำซ้ำได้หลายระเบียนและอัพเดทสถานะของพวกเขา
- สถานการณ์กรณีที่เลวร้ายที่สุดคือการให้งานรันสองครั้งทำให้ข้อมูลของคุณไม่ถูกต้อง
- สถานการณ์กรณีที่ดีที่สุดคืองานใช้ทรัพยากรในเซิร์ฟเวอร์ของคุณทั้งหมด
สรุปความต้องการ:
- งานจะต้องยังคงทำงานแม้ว่าหนึ่งในโหนดจะไม่ทำงาน
- งานต้องถูกเรียกใช้หนึ่งครั้งต่อหนึ่งตารางเวลาเท่านั้น
- หากมีการกำหนดเวลางานหลายงานในเวลาเดียวกันหรือในเวลาที่ทับซ้อนกันจำนวนงานที่รันจะถูกกระจายระหว่างเซิร์ฟเวอร์อย่างเท่าเทียมกัน
- เครื่องจะต้องมีรหัสฐานเดียวกันและจะทำข้อมูลให้ตรงกันผ่าน NTP
- การกำหนดค่าอาจแตกต่างกันระหว่างโหนดและโหนดโดยตัวแปรสภาพแวดล้อม
- งานต้องเริ่มตรงเวลาหรือภายในช่วงเวลาที่กำหนดของเวลาที่กำหนด (เช่นพูด 5 นาที)
การแก้ปัญหาที่เป็นไปได้
- ตั้งค่าหนึ่งโหนดเป็นโหนดหลักซึ่งจะไม่ทำงานเนื่องจากมีการละเมิด 1 ด้านบน
- สร้างคำร้องขอให้ load balancer สร้างยอดคงเหลือเพื่อเริ่มต้นงาน น่าเสียดายที่นี่มีผลข้างเคียงที่ถ้าคุณมีงานหลายงานที่ทำงานในเวลาเดียวกันพวกเขาทั้งหมดอาจถูกเรียกใช้โดยเครื่องเดียวกัน
สิ่งนี้จะต้องทำงานใน Java ในภาชนะ servlet อย่างไรก็ตามมันไม่ได้เข้ารหัสงานที่ฉันกำลังมองหา
แน่นอนว่านี่เป็นปัญหาที่แก้ไขแล้วด้วยทางออกที่ดีที่สุดที่รู้จัก
คำถามที่เกี่ยวข้อง /programming/5949038/schedule-job-executes-twice-on-cluster
สิ่งนี้ไม่ซ้ำกันเนื่องจากโซลูชันไม่เพียงพอตามข้อกำหนด 5 ข้อที่ระบุด้านบน วิธีแก้ปัญหาที่ upvote มากที่สุดนั้นเกิดจากปัญหาการแข่งขันและวิธีที่สองนั้นเป็นการละเมิดข้อกำหนด 3