Lewati ke isi

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 = 5 × (60 × 1,000 ÷ T)
  = 300,000 ÷ T

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 = M ÷ (300,000 ÷ T)
  = M × T ÷ 300,000

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
services:
  worker-8:
    deploy:
      # Menjalankan 2 unit kerja untuk memproses antrean 8 secara bersamaan
      replicas: 2

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
services:
  worker-8:
    deploy:
      resources:
        limits:
          cpus  : '2.50' # Batasi CPU maksimal 2.5 inti
          memory: 4G     # Batasi memori maksimal 4 GB

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
services:
  # Hapus 'worker-1-6' sebelumnya, ganti dengan konten berikut

  worker-1-5:
    # Menentukan unit kerja yang memproses antrean kerja 1 ~ 5
    command: ./run-worker-by-queue.sh 1 2 3 4 5

  worker-6:
    # Menentukan unit kerja yang memproses antrean kerja 6
    command: ./run-worker-by-queue.sh 6