Penerapan dan Pemeliharaan / Arsitektur, Penskalaan, dan Pembatasan Sumber Daya
Artikel ini terutama memperkenalkan arsitektur keseluruhan DataFlux Func, serta cara melakukan penskalaan untuk meningkatkan kapasitas pemrosesan.
1. Arsitektur
Di dalam sistem, ini adalah model khas 'produsen -> konsumen'. Setiap eksekusi fungsi Python akan melalui proses 'menghasilkan tugas -> masuk antrean -> keluar antrean -> mengeksekusi -> mengembalikan hasil'.
Setiap fungsi Python sebenarnya akan terlebih dahulu dibungkus menjadi 'tugas' dan masuk ke 'antrean kerja' miliknya (diberi nomor mulai dari #0), kemudian diambil dari antrean dan dieksekusi oleh 'unit kerja' yang sesuai (diberi nomor mulai dari worker-0).
flowchart TB
USER[Pengguna]
FUNC_SERVER[Layanan Func Server]
REDIS_QUEUE_N[Antrean Redis #N]
FUNC_WORKER_N[Layanan Func Worker-N]
FUNC_BEAT[Layanan Func Beat]
USER --Permintaan HTTP--> FUNC_SERVER
FUNC_SERVER --mengantrekan tugas eksekusi fungsi--> REDIS_QUEUE_N
REDIS_QUEUE_N --mengeluarkan tugas eksekusi fungsi dari antrean--> FUNC_WORKER_N
FUNC_BEAT --"mengantrekan tugas eksekusi fungsi
(Tugas Terjadwal)"--> REDIS_QUEUE_N
1.1 Layanan dan Kegunaannya
DataFlux Func terdiri dari beberapa layanan, masing-masing memiliki tanggung jawab yang berbeda. Layanan-layanan tersebut adalah sebagai berikut:
| Layanan | Kegunaan |
|---|---|
| server | Layanan Web, menyediakan fungsi-fungsi berikut: 1. Antarmuka Web 2. Antarmuka API 3. Pemeliharaan subscriber |
| worker-{nomor antrean} | Unit kerja, digunakan untuk mengeksekusi Skrip pengguna, termasuk: 1. API Fungsi 2. API Fungsi 3. Tugas Terjadwal Selain itu juga menangani beberapa tugas latar belakang tingkat sistem Lihat penjelasan antrean untuk detailnya |
| beat | Pemicu Tugas Terjadwal |
| mysql | Database |
| redis | Cache / antrean tugas eksekusi fungsi |
1.2 Hubungan Pemantauan Antrean oleh Unit Kerja
Untuk layanan worker-{nomor antrean} (unit kerja), setiap layanan Worker hanya memantau sejumlah antrean tertentu:
Antrean dan unit kerja tidak harus berkorespondensi satu-ke-satu
Antrean dan unit kerja tidak harus berkorespondensi satu-ke-satu. Misalnya, unit kerja worker-0 bukan hanya dapat memantau tugas pada antrean #0; setiap unit kerja dapat memantau satu atau lebih antrean mana pun.
Selain itu, antrean yang sama dapat dipantau oleh beberapa unit kerja sekaligus, atau tidak dipantau sama sekali (tidak disarankan).
Antrean Func dengan Deployment mandiri berbeda dengan Func yang terafiliasi dengan platform data
Karena sebagian besar Func dengan Deployment mandiri digunakan secara relatif ringan, untuk mengurangi konsumsi sumber daya yang tidak perlu, jumlah unit kerja pada Func dengan Deployment mandiri lebih kecil daripada jumlah antrean.
Sebaliknya, karena Func yang terafiliasi dengan platform data menangani beban kerja berat seperti monitor dan modul pengiriman pesan (Message Desk), unit kerja dan antrean berkorespondensi satu-ke-satu, dan terdapat lebih banyak unit kerja serta antrean bernomor dibandingkan dengan Func dengan Deployment mandiri.
| Unit Kerja | Antrean Deployment mandiri |
Antrean Terafiliasi dengan platform data |
|---|---|---|
| worker-0 | #0, #4, #7, #8, #9 | #0 |
| worker-1 | #1 | #1 |
| worker-2 | #2 | #2 |
| worker-3 | #3 | #3 |
| worker-4 | - | #4 |
| worker-5 | #5 | #5 |
| worker-6 | #6 | #6 |
| worker-7 | - | #7 |
| worker-8 | - | #8 |
| worker-9 | - | #9 |
| worker-10 | - | #10 |
| worker-11 | - | #11 |
| worker-12 | - | #12 |
| worker-13 | - | #13 |
| worker-14 | - | #14 |
| worker-15 | - | #15 |
| Unit Kerja | Antrean Deployment mandiri |
Antrean Terafiliasi dengan platform data |
|---|---|---|
| worker-0 | #0, #4, #7, #8, #9 | #0 |
| worker-1 | #1 | #1 |
| worker-2 | #2 | #2 |
| worker-3 | #3 | #3 |
| worker-4 | - | #4 |
| worker-5 | #5 | #5 |
| worker-6 | #6 | #6 |
| worker-7 | - | #7 |
| worker-8 | - | #8 |
| worker-9 | - | #9 |
| Unit Kerja | Antrean |
|---|---|
| worker-0 | #0 |
| worker-1-6 | #1, #2, #3, #4, #5, #6 |
| worker-7 | #7 |
| worker-8-9 | #8, #9 |
2. Layanan / Antrean serta Tanggung jawab dan Saran Penskalaan
Penskalaan membutuhkan investasi perangkat keras yang lebih besar
Penskalaan membutuhkan server yang bersangkutan untuk memberikan persyaratan kinerja yang lebih tinggi, termasuk namun tidak terbatas pada server itu sendiri, layanan basis data, Redis, dll.
Umumnya, penskalaan DataFlux Func sebenarnya hanya perlu menambah jumlah replika dari layanan yang bersangkutan. Oleh karena itu, pengguna harus terlebih dahulu memahami situasi bisnis aktual mereka agar dapat melakukan penskalaan secara tepat sasaran.
Layanan, antrean, tanggung jawab, dan saran penskalaan secara lengkap adalah sebagai berikut:
| Layanan / Antrean | Tanggung jawab Deployment mandiri |
Tanggung jawab Terafiliasi dengan platform data |
Jumlah Pod default Terafiliasi dengan platform data |
Saran penskalaan |
|---|---|---|---|---|
| server | Layanan web, menyediakan fungsi-fungsi berikut: 1. Antarmuka web 2. Antarmuka API 3. Memelihara subscriber |
← sama dengan kiri | 1 | Umumnya tidak perlu penskalaan |
| server-inner | (tidak ada layanan ini) | Layanan web, khusus untuk memanggil API di dalam kluster | 1 | Umumnya tidak perlu penskalaan |
| worker-0 Antrean #0 |
Unit kerja sistem, tidak terlibat langsung dalam pemrosesan kode pengguna | ← sama dengan kiri | 2 | Umumnya tidak perlu penskalaan |
| worker-1 Antrean #1 |
Menjalankan tugas fungsi dari API Fungsi yang dieksekusi secara sinkron | ← sama dengan kiri | 1 | Dapat diskalakan saat perlu meningkatkan konkurensi API Fungsi yang dieksekusi secara sinkron |
| worker-2 Antrean #2 |
Menjalankan tugas fungsi dari Tugas Terjadwal | ← sama dengan kiri | 1 | Dapat diskalakan saat perlu meningkatkan konkurensi Tugas Terjadwal |
| worker-3 Antrean #3 |
Menjalankan tugas fungsi dari API Fungsi yang dieksekusi secara asinkron | ← sama dengan kiri | 1 | Dapat diskalakan saat perlu meningkatkan konkurensi API Fungsi yang dieksekusi secara asinkron |
| worker-4 Antrean #4 |
(Cadangan) | (Cadangan) | 0 | Tidak perlu penskalaan |
| worker-5 Antrean #5 |
Debug eksekusi kode yaitu menjalankan fungsi secara langsung di antarmuka web |
← sama dengan kiri | 1 | Dapat diskalakan saat perlu mendukung lebih banyak pengguna mengembangkan Skrip secara bersamaan |
| worker-6 Antrean #6 |
Menjalankan tugas fungsi dari pemrosesan pesan langganan Konektor | ← sama dengan kiri | 1 | Dapat diskalakan saat perlu meningkatkan konkurensi pemrosesan pesan langganan Konektor |
| worker-7 Antrean #7 |
(Cadangan) | Menjalankan tugas fungsi untuk bisnis sistem platform data Misalnya: login sebagai administrator backend platform data, memperbarui berbagai cache, membebaskan kumpulan agregasi pesan, dll. |
2 | Dapat diskalakan saat jumlah total monitor cukup banyak |
| worker-8 Antrean #8 |
(Cadangan) | Menjalankan tugas fungsi terkait monitor biasa seperti deteksi ambang batas platform data, pembuatan metrik, dll. | 5 | Dapat diskalakan saat jumlah monitor biasa cukup banyak |
| worker-9 Antrean #9 |
(Cadangan) | Menjalankan tugas fungsi untuk deteksi lanjutan dan monitor cerdas platform data | 3 | Dapat diskalakan saat jumlah deteksi lanjutan biasa dan monitor cerdas cukup banyak |
| worker-10 Antrean #10 |
(Tidak ada layanan ini) | Menjalankan tugas fungsi platform data untuk menerima peristiwa yang dilaporkan pengguna | 1 | Dapat diskalakan saat volume peristiwa yang dilaporkan pengguna cukup besar |
| worker-11 Antrean #11 |
(Tidak ada layanan ini) | Menjalankan tugas pengiriman pesan Message Desk | 3 | Dapat diskalakan saat volume pengiriman pesan cukup besar |
| worker-12 Antrean #12 |
(Tidak ada layanan ini) | (Cadangan) | 0 | Tidak perlu penskalaan |
| worker-13 Antrean #13 |
(Tidak ada layanan ini) | (Cadangan) | 0 | Tidak perlu penskalaan |
| worker-14 Antrean #14 |
(Tidak ada layanan ini) | Menjalankan pemrosesan terkait AI yang perlu segera merespons tindakan pengguna Misalnya: memanggil fitur "Menulis Pipeline Otomatis", dll. |
2 | Dapat diskalakan saat jumlah pengguna yang perlu didukung dalam menulis Pipeline secara bersamaan cukup banyak |
| worker-15 Antrean #15 |
(Tidak ada layanan ini) | Menjalankan pemrosesan terkait AI yang tidak perlu segera merespons tindakan pengguna Misalnya: memanggil pemrosesan "Kompresi dan Penggabungan Alarm", dll. |
2 | Dapat diskalakan saat jumlah monitor yang menggunakan AI untuk mengagregasi alarm cukup banyak |
| beat | Pemicu Tugas Terjadwal | ← Sama seperti di kiri | 1 | Tidak boleh diskalakan, pastikan satu replika global |
| mysql | Basis data | (Tidak ada layanan ini) | - | Tidak perlu penskalaan, jika ada kebutuhan yang lebih tinggi dapat memilih membangun sendiri atau layanan cloud |
| redis | Cache / Antrean tugas eksekusi fungsi | (Tidak ada layanan ini) | - | Tidak perlu penskalaan, jika ada kebutuhan yang lebih tinggi dapat memilih membangun sendiri atau layanan cloud |
| Layanan / Antrean | Tanggung jawab Deployment mandiri |
Tanggung jawab Terlampir pada platform data |
Saran Penskalaan |
|---|---|---|---|
| server | Layanan Web, menyediakan fungsi berikut: 1. Antarmuka Web 2. Antarmuka API 3. Pemeliharaan subscriber |
← Sama seperti di kiri | Umumnya tidak perlu penskalaan |
| server-inner | (Tidak ada layanan ini) | Layanan Web, khusus untuk memanggil API di dalam kluster | Umumnya tidak perlu penskalaan |
| worker-0 Antrean #0 |
Unit kerja sistem, tidak terlibat langsung dalam pemrosesan kode pengguna | ← Sama seperti di kiri | Umumnya tidak perlu penskalaan |
| worker-1 Antrean #1 |
Menjalankan tugas fungsi dari API Fungsi yang dieksekusi secara sinkron | ← Sama seperti di kiri | Dapat diskalakan jika perlu meningkatkan konkurensi API Fungsi yang dieksekusi secara sinkron |
| worker-2 Antrean #2 |
Menjalankan tugas fungsi dari Tugas Terjadwal | ← Sama seperti di kiri | Dapat diskalakan jika perlu meningkatkan konkurensi Tugas Terjadwal |
| worker-3 Antrean #3 |
Menjalankan tugas fungsi dari API Fungsi yang dieksekusi secara asinkron | ← Sama seperti di kiri | Dapat diskalakan jika perlu meningkatkan konkurensi API Fungsi yang dieksekusi secara asinkron |
| worker-4 Antrean #4 |
(Cadangan) | (Cadangan) | Tidak perlu penskalaan |
| worker-5 Antrean #5 |
Eksekusi kode debug yaitu menjalankan fungsi langsung di antarmuka Web |
← Sama seperti di kiri | Skalakan jika perlu mendukung lebih banyak pengguna mengembangkan Skrip secara bersamaan |
| worker-6 Antrean #6 |
Menjalankan tugas fungsi dari pemrosesan pesan langganan Konektor | ← Sama seperti di kiri | Dapat diskalakan jika perlu meningkatkan konkurensi pemrosesan pesan langganan Konektor |
| worker-7 Antrean #7 |
(Cadangan) | Menjalankan tugas fungsi bisnis sistem platform data dan pengiriman pesan Misalnya: login melalui administrator backend platform data, memperbarui berbagai cache, melepaskan pool agregasi pesan, pengiriman pesan Message Desk |
Skalakan saat volume pengiriman pesan besar |
| worker-8 Antrean #8 |
(Cadangan) | Menjalankan tugas fungsi terkait monitor biasa, seperti deteksi ambang batas platform data | Skalakan saat jumlah monitor biasa cukup banyak |
| worker-9 Antrean #9 |
(Cadangan) | Menjalankan tugas fungsi untuk deteksi lanjutan dan pemantauan cerdas platform data | Skalakan saat jumlah deteksi lanjutan dan monitor cerdas cukup banyak |
| beat | Pemicu Tugas Terjadwal | ← Sama seperti di kiri | Tidak boleh diskalakan, pastikan replika tunggal global |
| mysql | Database | (Tidak ada layanan ini) | Tidak perlu penskalaan, jika ada kebutuhan lebih tinggi dapat memilih self-hosted atau layanan cloud |
| redis | Cache / antrean tugas eksekusi fungsi | (Tidak ada layanan ini) | Tidak perlu penskalaan, jika ada kebutuhan lebih tinggi dapat memilih self-hosted atau layanan cloud |
| Layanan | Tanggung jawab | Saran Penskalaan |
|---|---|---|
| server | Layanan Web, menyediakan fungsi-fungsi berikut: 1. Antarmuka Web 2. Antarmuka API 3. Pemeliharaan subscriber |
Umumnya tidak perlu penskalaan |
| worker-0 Antrean #0 |
Unit kerja sistem, tidak terlibat langsung dalam pemrosesan kode pengguna | Umumnya tidak perlu penskalaan |
| worker-1-6 Antrean #1, #2, #3, #4, #5, #6 |
Secara default, bertanggung jawab atas pemrosesan panggilan sinkron fungsi, seperti: 1. API Fungsi yang dieksekusi secara sinkron 2. Pemrosesan pesan langganan |
Dapat diskalakan jika perlu meningkatkan konkurensi API Fungsi yang dieksekusi secara sinkron dan pemrosesan pesan langganan |
| worker-7 Antrean #7 |
Secara default, bertanggung jawab atas pemrosesan kode debug (yaitu menjalankan fungsi langsung di antarmuka Web) | Skalakan jika perlu mendukung lebih banyak pengguna mengembangkan Skrip secara bersamaan |
| worker-8-9 Antrean #8, #9 |
Secara default, bertanggung jawab atas pemrosesan panggilan asinkron fungsi, seperti: 1. API Fungsi yang dieksekusi secara asinkron 2. Tugas Terjadwal |
Dapat diskalakan jika perlu meningkatkan konkurensi pemrosesan Tugas Terjadwal dan API Fungsi yang dieksekusi secara asinkron |
| beat | Pemicu Tugas Terjadwal | Tidak boleh diskalakan, pastikan replika tunggal global |
| mysql | Database | Tidak perlu penskalaan, jika ada kebutuhan lebih tinggi dapat memilih self-hosted atau layanan cloud |
| redis | Cache / antrean tugas eksekusi fungsi | Tidak perlu penskalaan, jika ada kebutuhan lebih tinggi dapat memilih self-hosted atau layanan cloud |
Contoh: ketika perlu meningkatkan kapasitas pemrosesan Tugas Terjadwal...
Dari penjelasan di atas, Tugas Terjadwal berada pada Antrean #8, Antrean #8 berkorespondensi dengan Layanan worker-8, jadi cukup dengan melakukan penskalaan pada Layanan worker-8.
Memperkirakan Jumlah Penskalaan
Dengan mengambil worker-8 yang umum sebagai contoh:
worker-8 terutama bertanggung jawab untuk menjalankan tugas monitor dalam edisi pendamping platform data. Misalkan satu tugas deteksi memerlukan T milidetik, maka dalam 1 menit dapat dilakukan 60 × 1,000 ÷ T kali deteksi. Secara default, setiap Pod worker-8 menjalankan 5 proses.
Artinya, kapasitas deteksi satu Pod worker-8 adalah 5 × (60 × 1,000 ÷ T) monitor.
Rumus
| Text Only | |
|---|---|
1 2 | |
A: Kapasitas deteksi
T: Durasi eksekusi tugas deteksi (milidetik)
Bergantung pada durasi eksekusi setiap monitor, tabel berikut dapat dibuat:
| Waktu per Deteksi | Kapasitas Deteksi per Pod | Dibandingkan dengan baseline |
|---|---|---|
| 300 | 1,000 | 167% |
| 500 | 600 | baseline |
| 800 | 375 | 63% |
| 1,000 | 300 | 50% |
| 2,000 | 150 | 25% |
| 3,000 | 100 | 17% |
Sebaliknya, jika jumlah total monitor adalah M, maka jumlah Pod yang dibutuhkan dapat dihitung dengan M ÷ (5 × (60 × 1,000 ÷ T)).
Rumus
| Text Only | |
|---|---|
1 2 | |
P: Jumlah Pod yang dibutuhkan
M: Jumlah monitor
T: Durasi eksekusi tugas deteksi (milidetik)
Bergantung pada jumlah monitor dan durasi setiap eksekusi, tabel berikut dapat dibuat:
| Jumlah Monitor | Waktu per Deteksi | Jumlah Pod yang Dibutuhkan | Dibandingkan dengan baseline |
|---|---|---|---|
| 1,000 | 300 | 1 | 50% |
| 1,000 | 500 | 2 | baseline |
| 1,000 | 800 | 3 | 150% |
| 1,000 | 1,000 | 4 | 200% |
| 1,000 | 2,000 | 7 | 350% |
| 1,000 | 3,000 | 10 | 500% |
| Jumlah Monitor | Waktu per Deteksi | Jumlah Pod yang Dibutuhkan | Dibandingkan dengan baseline |
|---|---|---|---|
| 5,000 | 300 | 5 | 56% |
| 5,000 | 500 | 9 | baseline |
| 5,000 | 800 | 14 | 156% |
| 5,000 | 1,000 | 17 | 189% |
| 5,000 | 2,000 | 34 | 378% |
| 5,000 | 3,000 | 50 | 556% |
| Jumlah Monitor | Waktu per Deteksi | Jumlah Pod yang Dibutuhkan | Dibandingkan dengan baseline |
|---|---|---|---|
| 10,000 | 300 | 10 | 59% |
| 10,000 | 500 | 17 | baseline |
| 10,000 | 800 | 27 | 159% |
| 10,000 | 1,000 | 34 | 200% |
| 10,000 | 2,000 | 67 | 394% |
| 10,000 | 3,000 | 100 | 588% |
Cara Pengoperasian
DataFlux Func yang di-deploy pada satu mesin dapat diskalakan dengan mengubah konfigurasi ({direktori instalasi}/docker-stack.yaml) dan menambahkan deploy.replicas pada layanan terkait.
Silakan lihat dokumentasi resmi
Untuk informasi lengkap tentang opsi deploy.replicas, silakan lihat dokumentasi resmi Docker: Docker Documentation / Compose file deploy reference / replicas
Sebagai contoh untuk meningkatkan kapasitas pemrosesan worker-8, bagian yang diubah adalah sebagai berikut:
Contoh hanyalah cuplikan
Contoh hanya menampilkan bagian modifikasi kunci; saat melakukan operasi sebenarnya, pastikan konfigurasi tetap lengkap.
| docker-stack.yaml Bagian Modifikasi Kunci | |
|---|---|
1 2 3 4 5 | |
3. Pembatasan Sumber Daya
Pembatasan sumber daya perlu disesuaikan secara wajar dengan kebutuhan bisnis aktual
Silakan sesuaikan batasan sumber daya secara wajar sesuai kebutuhan bisnis aktual.
Membatasi sumber daya secara berlebihan dapat menyebabkan waktu eksekusi tugas menjadi lebih lama, atau memori tidak cukup sehingga kode tidak dapat selesai dieksekusi.
Cara Pengoperasian
DataFlux Func yang di-deploy pada satu mesin dapat membatasi sumber daya dengan mengubah konfigurasi ({direktori instalasi}/docker-stack.yaml) dan menambahkan deploy.resources pada layanan terkait.
Silakan lihat dokumentasi resmi
Untuk informasi lengkap tentang opsi deploy.resources, silakan lihat dokumentasi resmi Docker: Docker Documentation / Compose file deploy reference / resources
Secara default, setiap replika worker-N dapat menggunakan maksimal 5 inti CPU (yaitu, dalam setiap unit kerja terdapat 5 proses kerja).
Sebagai contoh untuk membatasi penggunaan sumber daya worker-8, bagian yang diubah adalah sebagai berikut:
Contoh hanyalah cuplikan
Contoh hanya menampilkan bagian modifikasi kunci; saat melakukan operasi sebenarnya, pastikan konfigurasi tetap lengkap.
| docker-stack.yaml Bagian Modifikasi Kunci | |
|---|---|
1 2 3 4 5 6 7 | |
4. Pemisahan Unit Kerja
Pada versi baru, semua unit kerja telah dipisahkan
Pada Func 3.2.0 dengan deployment mandiri dan versi yang lebih baru, secara default semua unit kerja yang tidak dicadangkan telah dipisahkan; pengguna dapat mengaktifkan antrean cadangan sesuai kebutuhan.
Pada Func 1.77.145 edisi pendamping platform data dan versi yang lebih baru, semua unit kerja telah dipisahkan secara default, sehingga pengguna tidak perlu lagi memisahkannya secara manual.
Dalam kasus tertentu, unit kerja yang digabungkan secara default (misalnya: worker-1-6) dapat dipisahkan untuk mencapai penjadwalan tugas yang lebih terperinci, serta memungkinkan penskalaan unit kerja yang menangani antrean tertentu dan pembatasan sumber daya.
Misalkan, berdasarkan kebutuhan bisnis, DataFlux Func memiliki persyaratan kinerja yang tinggi untuk pemrosesan langganan, dan diharapkan pemrosesan pesan langganan tidak saling mengganggu dengan pemrosesan API Fungsi yang dieksekusi secara sinkron, maka worker-1-6 dapat dipisahkan menjadi worker-1-5 dan worker-6.
Cara Pengoperasian
DataFlux Func yang di-deploy pada satu mesin dapat memisahkan unit kerja dengan mengubah konfigurasi ({direktori instalasi}/docker-stack.yaml), menambahkan atau mengubah layanan terkait, serta mengubah nomor antrean yang ditentukan dalam command.
Antrean yang dipantau oleh unit kerja ditentukan melalui parameter setelah ./run-worker-by-queue.sh; nama layanan itu sendiri terutama digunakan sebagai penanda, disarankan agar konsisten dengan antrean yang sebenarnya dipantau untuk menghindari kebingungan.
Contoh hanyalah cuplikan
Contoh hanya menampilkan bagian modifikasi kunci; saat melakukan operasi sebenarnya, pastikan konfigurasi tetap lengkap.
| docker-stack.yaml Bagian Modifikasi Kunci | |
|---|---|
1 2 3 4 5 6 7 8 9 10 | |