Lewati ke isi

Pengembangan Skrip / Proses Eksekusi Fungsi

Artikel ini terutama menjelaskan proses tugas spesifik ketika suatu fungsi dipanggil.

1. Proses Dasar

Secara keseluruhan, ketika memanggil suatu fungsi di DataFlux Func, alur eksekusinya adalah sebagai berikut:

  1. Pengguna mengirimkan permintaan HTTP ke Server
  2. Server membuat tugas eksekusi fungsi dan melakukan push ke antrean Redis
  3. Worker melakukan pop tugas eksekusi fungsi dari antrean Redis dan mengeksekusinya.

Sedangkan untuk tugas yang dieksekusi secara terjadwal, langkah "pengguna mengirimkan permintaan HTTP" tidak ada; tugas dihasilkan langsung oleh layanan Beat, dengan alur eksekusi spesifik sebagai berikut:

  1. Beat membuat tugas eksekusi fungsi secara terjadwal dan melakukan push ke antrean Redis
  2. Worker melakukan pop tugas eksekusi fungsi dari antrean Redis dan mengeksekusinya.

2. Deployment Satu Mesin

Untuk DataFlux Func dengan deployment satu mesin, keseluruhan alurnya sangat sederhana:

flowchart TB
    USER[Pengguna]
    SERVER[Server]
    WORKER[Worker]
    REDIS_QUEUE[Antrean Redis]

    USER --Permintaan HTTP--> SERVER
    SERVER --Tugas eksekusi fungsi masuk antrean--> REDIS_QUEUE
    REDIS_QUEUE --Tugas eksekusi fungsi keluar antrean--> WORKER

    Beat --"Tugas eksekusi fungsi masuk antrean\n(terjadwal)"--> REDIS_QUEUE

2. Deployment Multi-Replika

Untuk DataFlux Func dengan deployment multi-replika, karena terdapat SLB (atau layanan reverse proxy lainnya), Server mana pun dapat menerima permintaan tersebut.

Selain itu, karena setiap replika terhubung ke Redis yang sama, setiap tugas hanya akan diambil dan dieksekusi oleh salah satu Worker:

flowchart TB
    USER[Pengguna]
    SERVER_1[Server 1]
    SERVER_2[Server 2]
    WORKER_1[Worker 1]
    WORKER_2[Worker 2]
    REDIS_QUEUE[Antrean Redis]

    USER --Permintaan HTTP--> SLB
    SLB --Penerusan HTTP--> SERVER_1
    SLB -.-> SERVER_2
    SERVER_1 --Tugas eksekusi fungsi masuk antrean--> REDIS_QUEUE
    SERVER_2 -.-> REDIS_QUEUE
    REDIS_QUEUE -.-> WORKER_1
    REDIS_QUEUE --Tugas eksekusi fungsi keluar antrean--> WORKER_2

    Beat --"Tugas eksekusi fungsi masuk antrean\n(terjadwal)"--> REDIS_QUEUE

3. Deployment Utama-Cadangan yang Sepenuhnya Independen

Dalam beberapa kasus, jika perlu mewujudkan "deployment utama-cadangan yang sepenuhnya independen", Anda dapat memisahkan Redis lebih lanjut dan mengatur perbandingan bobot node utama dan node cadangan menjadi 100:0 di SLB (atau server reverse proxy lainnya).

Pada saat ini, karena node utama dan node cadangan sepenuhnya independen dan masing-masing merupakan DataFlux Func yang berjalan sepenuhnya independen, jika DataFlux Func pada node utama dan node cadangan dijalankan secara bersamaan, hal ini akan menyebabkan Tugas Terjadwal dieksekusi berulang kali. Oleh karena itu, Anda dapat mematikan DataFlux Func pada node cadangan dalam kondisi normal, atau menulis sendiri penanganan dalam Skrip untuk mencegah eksekusi tugas yang berulang.

flowchart TB
    USER[Pengguna]
    MAIN_NODE_SERVER[Server Node Utama]
    MAIN_NODE_WORKER[Worker Node Utama]
    MAIN_NODE_BEAT[Beat Node Utama]
    MAIN_NODE_REDIS_QUEUE[Antrean Redis Node Utama]
    BACKUP_NODE_SERVER[Server Node Cadangan]
    BACKUP_NODE_WORKER[Worker Node Cadangan]
    BACKUP_NODE_BEAT[Beat Node Cadangan]
    BACKUP_NODE_REDIS_QUEUE[Antrean Redis Node Cadangan]

    USER --Permintaan HTTP--> SLB
    SLB --Penerusan HTTP--> MAIN_NODE_SERVER
    SLB -.-> BACKUP_NODE_SERVER

    subgraph Node Cadangan
        direction TB
        BACKUP_NODE_SERVER --Tugas eksekusi fungsi masuk antrean--> BACKUP_NODE_REDIS_QUEUE
        BACKUP_NODE_REDIS_QUEUE --Tugas eksekusi fungsi keluar antrean--> BACKUP_NODE_WORKER

        BACKUP_NODE_BEAT --"Tugas eksekusi fungsi masuk antrean\n(terjadwal)"--> BACKUP_NODE_REDIS_QUEUE
    end

    subgraph Node Utama
        direction TB
        MAIN_NODE_SERVER --Tugas eksekusi fungsi masuk antrean--> MAIN_NODE_REDIS_QUEUE
        MAIN_NODE_REDIS_QUEUE --Tugas eksekusi fungsi keluar antrean--> MAIN_NODE_WORKER

        MAIN_NODE_BEAT --"Tugas eksekusi fungsi masuk antrean\n(terjadwal)"--> MAIN_NODE_REDIS_QUEUE
    end