ห้องว่างที่สูงขึ้น
ตามที่ Chris กล่าวถึงเซิร์ฟเวอร์ API ของคุณเป็นเพียงจุดเดียวของความล้มเหลวในโครงร่างของคุณ สิ่งที่คุณตั้งค่าคือโครงสร้างพื้นฐานการจัดคิวข้อความบางสิ่งที่หลาย ๆ คนเคยนำไปใช้งานมาก่อน
ดำเนินการต่อไปในเส้นทางเดียวกัน
คุณพูดถึงการรับคำขอบนเซิร์ฟเวอร์ API และแทรกงานลงในฐานข้อมูล MySQL ที่ทำงานบนแต่ละเซิร์ฟเวอร์ หากคุณต้องการดำเนินการต่อในเส้นทางนี้ฉันแนะนำให้ลบเลเยอร์เซิร์ฟเวอร์ API ออกและออกแบบให้ผู้ใช้แต่ละคนยอมรับคำสั่งโดยตรงจากผู้ใช้ API ของคุณ คุณสามารถใช้สิ่งที่เรียบง่ายเหมือนกับ DNS แบบปัดวนเพื่อแจกจ่ายการเชื่อมต่อผู้ใช้ API แต่ละรายการโดยตรงไปยังโหนดผู้ปฏิบัติงานที่มีอยู่ (และลองอีกครั้งหากการเชื่อมต่อไม่สำเร็จ)
ใช้เซิร์ฟเวอร์ Queue Message
มีประสิทธิภาพมากขึ้นการจัดคิวข้อความซอฟต์แวร์โครงสร้างพื้นฐานการใช้งานที่ออกแบบมาเพื่อการนี้เช่นActiveMQ คุณสามารถใช้ RESTful API ของ ActiveMQ เพื่อรับคำขอ POST จากผู้ใช้ API และคนทำงานที่ไม่ทำงานสามารถรับข้อความต่อไปในคิว อย่างไรก็ตามนี่อาจเกินความต้องการของคุณ - มันถูกออกแบบมาเพื่อความหน่วงแฝงความเร็วและข้อความนับล้านต่อวินาที
ใช้ผู้ดูแลสัตว์เลี้ยง
โดยพื้นฐานแล้วคุณอาจต้องการดูZookeeperแม้ว่าจะไม่ใช่เซิร์ฟเวอร์คิวข้อความโดยเฉพาะ เราใช้เงิน $ เพื่อวัตถุประสงค์ที่แน่นอนนี้ เรามีชุดเซิร์ฟเวอร์สามชุด (คล้ายกับเซิร์ฟเวอร์ API ของคุณ) ที่รันซอฟต์แวร์เซิร์ฟเวอร์ Zookeeper และมีส่วนหน้าเว็บสำหรับจัดการคำขอจากผู้ใช้และแอปพลิเคชัน ส่วนหน้าของเว็บรวมถึงการเชื่อมต่อแบ็คเอนด์ของ Zookeeper กับพนักงานนั้นมี load balancer เพื่อให้แน่ใจว่าเราดำเนินการประมวลผลคิวต่อไปแม้ว่าเซิร์ฟเวอร์จะหยุดทำงานเพื่อการบำรุงรักษา เมื่องานเสร็จแล้วผู้ปฏิบัติงานจะบอกคลัสเตอร์ Zookeeper ว่างานเสร็จสมบูรณ์ หากผู้ปฏิบัติงานเสียชีวิตงานนั้นจะถูกส่งไปทำงานอื่นให้เสร็จ
ข้อกังวลอื่น ๆ
- ตรวจสอบให้แน่ใจว่างานเสร็จสมบูรณ์ในกรณีที่ผู้ปฏิบัติงานไม่ตอบสนอง
- API จะทราบได้อย่างไรว่างานเสร็จสมบูรณ์และดึงข้อมูลจากฐานข้อมูลของผู้ปฏิบัติงาน
- พยายามลดความซับซ้อน คุณต้องการเซิร์ฟเวอร์ MySQL อิสระในแต่ละโหนดของผู้ปฏิบัติงานหรือพวกเขาสามารถพูดคุยกับเซิร์ฟเวอร์ MySQL (หรือจำลองแบบ MySQL Cluster) บนเซิร์ฟเวอร์ API ได้หรือไม่?
- ความปลอดภัย ทุกคนสามารถส่งงานได้หรือไม่ มีการรับรองความถูกต้องหรือไม่
- คนงานคนไหนควรได้งานต่อไป คุณไม่ได้พูดถึงว่างานนั้นคาดว่าจะใช้เวลา 10ms หรือ 1 ชั่วโมง หากพวกมันเร็วคุณควรลบเลเยอร์เพื่อลดความหน่วง หากพวกเขาช้าคุณควรระวังให้มากเพื่อให้แน่ใจว่าคำขอที่สั้นกว่านั้นจะไม่ติดอยู่กับคำขอที่ใช้งานมานาน