Ketersediaan Lebih Tinggi
Seperti yang disebutkan Chris, server API Anda adalah satu-satunya titik kegagalan dalam tata letak Anda. Apa yang Anda siapkan adalah infrastruktur antrian pesan, sesuatu yang telah diterapkan banyak orang sebelumnya.
Lanjutkan ke jalur yang sama
Anda menyebutkan menerima permintaan di server API dan memasukkan pekerjaan ke dalam DB MySQL yang berjalan di setiap server. Jika Anda ingin melanjutkan jalur ini, saya sarankan menghapus lapisan server API, dan merancang Pekerja untuk masing-masing menerima perintah langsung dari Pengguna API Anda. Anda bisa menggunakan sesuatu yang sederhana seperti round-robin DNS untuk mendistribusikan setiap koneksi Pengguna API langsung ke salah satu node pekerja yang tersedia (dan coba lagi jika koneksi tidak berhasil).
Gunakan Server Antrian Pesan
Infrastruktur antrian pesan yang lebih kuat menggunakan perangkat lunak yang dirancang untuk tujuan ini seperti ActiveMQ . Anda dapat menggunakan RESTful API ActiveMQ untuk menerima permintaan POST dari Pengguna API, dan pekerja yang menganggur dapat MENDAPATKAN pesan berikutnya pada antrian. Namun, ini mungkin berlebihan untuk kebutuhan Anda - ini dirancang untuk latensi, kecepatan, dan jutaan pesan per detik.
Gunakan Zookeeper
Sebagai jalan tengah, Anda mungkin ingin melihat Zookeeper , meskipun itu bukan server antrian pesan. Kami menggunakan $ work untuk tujuan yang tepat ini. Kami memiliki tiga server (analog dengan server API Anda) yang menjalankan perangkat lunak server Zookeeper, dan memiliki antarmuka web untuk menangani permintaan dari pengguna dan aplikasi. Frontend web, serta koneksi backend Zookeeper ke para pekerja, memiliki penyeimbang beban untuk memastikan kami terus memproses antrian, bahkan jika server sedang dalam perbaikan. Ketika pekerjaan selesai, pekerja memberi tahu kluster Zookeeper bahwa pekerjaan telah selesai. Jika seorang pekerja meninggal, pekerjaan itu akan dikirim ke pekerjaan lain untuk diselesaikan.
Kekhawatiran lainnya
- Pastikan pekerjaan selesai jika pekerja tidak merespons
- Bagaimana API mengetahui bahwa suatu pekerjaan sudah selesai, dan untuk mengambilnya dari basis data pekerja?
- Coba kurangi kerumitannya. Apakah Anda memerlukan server MySQL independen pada setiap node pekerja, atau bisakah mereka berbicara dengan server MySQL (atau MySQL Cluster yang direplikasi) pada server API?
- Keamanan. Adakah yang bisa mengirimkan pekerjaan? Apakah ada otentikasi?
- Pekerja mana yang harus mendapatkan pekerjaan selanjutnya? Anda tidak menyebutkan apakah tugas-tugas tersebut diperkirakan akan memakan waktu 10 ms atau 1 jam. Jika mereka cepat, Anda harus menghapus lapisan untuk menjaga latensi. Jika lambat, Anda harus sangat berhati-hati untuk memastikan permintaan yang lebih pendek tidak terjebak di belakang beberapa permintaan yang sudah berjalan lama.