Pengaturan server saya untuk API yang banyak digunakan


9

Saya akan segera membeli banyak server untuk aplikasi yang akan saya luncurkan tetapi saya khawatir tentang pengaturan saya. Saya menghargai umpan balik yang saya dapatkan.

Saya memiliki aplikasi yang akan menggunakan API yang saya tulis. Pengguna / pengembang lain juga akan menggunakan API ini. Server API akan menerima permintaan dan menyampaikannya ke server pekerja. API hanya akan menampung permintaan mysql db untuk tujuan logging, otentikasi, dan untuk pembatasan tingkat.

Setiap server pekerja melakukan pekerjaan yang berbeda dan di masa depan untuk skala, saya akan menambahkan lebih banyak server pekerja yang tersedia untuk melakukan pekerjaan. File konfigurasi API akan diedit untuk mencatat server pekerja baru. Server pekerja akan melakukan beberapa pemrosesan dan beberapa akan menyimpan path ke gambar ke database lokal untuk kemudian diambil oleh API untuk dilihat pada aplikasi saya, beberapa akan mengembalikan string hasil dari suatu proses dan menyimpannya ke database lokal .

Apakah pengaturan ini terlihat efisien bagi Anda? Apakah ada cara yang lebih baik untuk merestrukturisasi ini? Masalah apa yang harus saya pertimbangkan? Silakan lihat gambar di bawah, saya harap ini membantu pemahaman.masukkan deskripsi gambar di sini

Jawaban:


17

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.

terima kasih banyak atas balasan luar biasa anda. Saya tahu lapisan API adalah hambatan tetapi sepertinya satu-satunya cara saya bisa menambahkan lebih banyak server pekerja tanpa harus membiarkan pengguna aplikasi tahu secara manual. Setelah membaca jawaban Anda sepenuhnya, saya menyadari bahwa ya, akan lebih baik jika setiap pekerja memiliki API sendiri. Meskipun kode akan digandakan karena saya menambah lebih banyak pekerja, itu lebih berkinerja untuk skenario saya.
Abs

@Abs - Terima kasih atas suara pertama saya! Jika Anda memutuskan untuk menghapus lapisan API, saya sarankan tidak melakukan round-robin DNS dan setup HAProxy (lebih disukai pasangan) seperti yang dijelaskan dalam artikel ini . Dengan begitu, Anda tidak perlu berurusan dengan timeout.
Fanatik

@ab Anda tidak perlu menghapus lapisan API, tetapi menambahkan redundansi (failover CARP atau yang serupa) akan menjadi pertimbangan penting untuk menghilangkan titik kegagalan tunggal ...
voretaq7

Sejauh berkirim pesan, saya sarankan untuk melihat lebih dekat pada RabbitMQ sebelum Anda memutuskan: rabbitmq.com
Antonius Bloch

2

Masalah terbesar yang saya lihat adalah kurangnya perencanaan failover.

Server API Anda adalah titik kegagalan tunggal yang besar. Jika turun, maka tidak ada yang berfungsi bahkan jika server pekerja Anda masih berfungsi. Selain itu, jika server pekerja turun, maka layanan yang disediakan server tidak lagi tersedia.

Saya sarankan Anda melihat proyek Linux Virtual Server ( http://www.linuxvirtualserver.org/ ) untuk mendapatkan ide tentang bagaimana load balancing dan failover bekerja, dan untuk mendapatkan ide bagaimana ini dapat menguntungkan desain Anda.

Ada banyak cara untuk menyusun sistem Anda. Cara mana yang lebih baik adalah panggilan subyektif yang paling baik dijawab oleh Anda. Saya sarankan Anda melakukan riset; timbang timbal balik dari berbagai metode. Jika Anda memerlukan informasi tentang metode implantasi, maka kirimkan pertanyaan baru.


Bagaimana Anda menerapkan mekanisme kegagalan dalam skenario ini? Gambaran umum akan sangat bagus.
Abs

Dari diagram Anda, Anda harus meneliti Linux Virtual Server (LVS). Buka linuxvirtualserver.org dan mulailah belajar semampu Anda.
Chris Ting

Menarik, saya akan melihat ke dalamnya dan gagal secara umum. Ada komentar lain di pengaturan saya? Adakah bahaya lain yang bisa saya hadapi?
Abs

@Abs: Ada banyak masalah yang bisa Anda hadapi. Pertanyaan Anda memiliki banyak bagian subjektif untuk itu, dan saya tidak ingin memasukkan Anda ke dalam apa yang saya lakukan secara pribadi. Saya tidak harus mendukung pengaturan Anda; kamu lakukan. Jawaban saya yang sebenarnya adalah belajar tentang failover dan ketersediaan tinggi.
Chris Ting
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.