全部产品
Search
文档中心

Realtime Compute for Apache Flink:Definisi aturan dalam format JSON di Flink CEP dinamis

更新时间:Jul 02, 2025

Tema ini menjelaskan aturan yang didefinisikan dalam format JSON pada Flink Complex Event Processing (CEP) dinamis.

Audience yang dituju

  • Pengembang platform pengendalian risiko: Pengembang yang akrab dengan Flink CEP dinamis dapat mempelajari format yang dijelaskan dalam tema ini dan menentukan apakah enkapsulasi lebih lanjut diperlukan sesuai kebutuhan platform.
  • Personel strategi pengendalian risiko: Personel yang hanya akrab dengan strategi pengendalian risiko tertentu tetapi tidak memiliki pengalaman pengembangan Java dapat mempelajari dan menggunakan format ini untuk menulis aturan baru berdasarkan konsep CEP serta menerapkannya dalam penerapan pengendalian risiko online.

Definisi aturan CEP dalam format JSON

Pola dalam urutan peristiwa dianggap sebagai graf. Sebuah simpul dalam graf menunjukkan pola untuk peristiwa tertentu. Sisi antara simpul menunjukkan strategi pemilihan peristiwa yang menentukan cara mentransformasikan pola ke pola lain untuk mencocokkan peristiwa. Setiap graf juga dapat dianggap sebagai simpul anak dari graf yang lebih besar, sehingga mendukung penumpukan pola. Alibaba Cloud Realtime Compute for Apache Flink mendefinisikan satu set spesifikasi berbasis JSON untuk menggambarkan aturan dalam CEP dan memfasilitasi penyimpanan serta modifikasi aturan. Tabel-tabel berikut menjelaskan arti dari setiap bidang dalam spesifikasi.
  • Simpul
    Sebuah simpul menunjukkan pola lengkap. Tabel berikut menjelaskan bidang-bidang dalam pola.
    BidangDeskripsiTipe dataDiperlukanCatatan
    nameNama pola. STRINGYaString unik.
    Catatan Nama setiap simpul harus unik.
    typeTipe simpul. ENUM(STRING)Ya
    • Untuk simpul yang mencakup pola anak, nilai bidang ini adalah COMPOSITE.
    • Untuk simpul yang tidak mencakup pola anak, nilai bidang ini adalah ATOMIC.
    quantifierKuantifier yang menggambarkan cara mencocokkan pola. Misalnya, Anda dapat menentukan kuantifier untuk mencocokkan pola hanya sekali. KamusYaUntuk informasi lebih lanjut, lihat "Quantifier" dalam tema ini.
    conditionKondisi. KamusTidakUntuk informasi lebih lanjut, lihat "Condition" dalam tema ini.
  • Kuantifier
    Kuantifier digunakan untuk menggambarkan cara mencocokkan peristiwa dengan pola. Misalnya, properti kuantifier dari pola "A*" adalah LOOPING dan bidang consumingStrategy dari pola disetel ke SKIP_TILL_ANY.
    BidangDeskripsiTipe dataDiperlukanCatatan
    consumingStrategyStrategi pemilihan peristiwa. ENUM(STRING)YaNilai valid:
    • STRICT
    • SKIP_TILL_NEXT
    • SKIP_TILL_ANY

    Untuk informasi lebih lanjut tentang nilai-nilai dan artinya, lihat "Contiguity" dalam tema ini.

    timesJumlah kali pola perlu dicocokkan. KamusTidak
    Contoh:
    "times": {
              "from": 3,
              "to": 3,
              "windowTime": {
              "unit": "MINUTES",
              "size": 12
              }
            },
    Nilai from dan to harus bertipe INTEGER. Unit windowTime bisa DAYS, HOURS, MINUTES, SECONDS, atau MILLISECONDS.
    Catatan windowTime bisa disetel ke null. Properti ini ditampilkan dalam format berikut: "windowTime": null.
    propertiesProperti kuantifier. Array string enumerasiYaUntuk informasi lebih lanjut tentang nilai-nilai dan artinya, lihat "Quantifier" dalam tema ini.
    untilCondition Kondisi yang digunakan untuk menghentikan pencocokan pola.
    Catatan Parameter ini hanya dapat dikonfigurasi setelah pola yang menggunakan kuantifier LOOPING.
    Kamus TidakUntuk informasi lebih lanjut tentang nilai-nilai dan artinya, lihat "Condition" dalam tema ini.
  • Kondisi
    Kondisi digunakan untuk mengidentifikasi peristiwa yang memenuhi persyaratan tertentu. Misalnya, jika Anda ingin mengidentifikasi pengguna dengan durasi penjelajahan lebih dari 5 menit, Anda dapat menentukan kondisi bahwa durasi penjelajahan lebih dari 5 menit.
    BidangDeskripsiTipe dataDiperlukanCatatan
    typeTipe kondisi. ENUM(STRING)YaNilai valid:
    • CLASS: kondisi kustom.
    • AVIATOR: kondisi berdasarkan ekspresi aviator.
    • GROOVY: kondisi berdasarkan ekspresi Groovy.
    ...Bidang kustom lainnya yang dapat diserialisasi. Tidak...
    Kondisi berikut didukung:
    • Kondisi tipe Class
      BidangDeskripsiTipe dataDiperlukanCatatan
      typeTipe kondisi. ENUM(STRING)YaSetel nilai ke Class.
      classNameNama kelas. STRINGYaNama lengkap kelas, seperti com.alibaba.ververica.cep.demo.StartCondition.
    • Kondisi yang mencakup parameter kustom

      Saat menggunakan kondisi tipe Class, Anda hanya dapat menentukan parameter className. Parameter tidak dapat dilewatkan secara dinamis. Untuk meningkatkan kemampuan ekspresi kondisi, Flink CEP dinamis mendukung kondisi CustomArgsCondition, yang mencakup parameter kustom. Dengan cara ini, Anda dapat mengonfigurasi parameter yang diperlukan dalam kondisi CustomArgsCondition dalam bentuk array string JSON dan secara dinamis membuat instance CustomArgsCondition. Dalam hal ini, Anda dapat memperbarui parameter kondisi secara dinamis tanpa perlu memodifikasi kode Java.

      BidangDeskripsiTipe dataDiperlukanCatatan
      typeTipe kondisi. ENUM(STRING)YaSetel nilai ke Class.
      classNameNama kelas. STRINGYaNama lengkap kelas, seperti com.alibaba.ververica.cep.demo.CustomMiddleCondition.
      argsParameter kustom. Array stringYaNilainya adalah array string.
    • Kondisi berdasarkan ekspresi aviator
      Aviator adalah mesin evaluasi ekspresi yang secara dinamis mengkompilasi ekspresi menjadi bytecode. Untuk informasi lebih lanjut, lihat aviatorscript. Oleh karena itu, Anda dapat menggunakan kondisi berdasarkan ekspresi aviator dalam penerapan untuk secara dinamis memodifikasi ambang batas kondisi tanpa perlu memodifikasi kode Java untuk mengkompilasi ulang dan menjalankan kode.
      BidangDeskripsiTipe dataDiperlukanCatatan
      typeNama kelas. STRINGYaSetel nilai ke AVIATOR.
      expressionString ekspresi. STRINGYaBidang ini menentukan string ekspresi dalam bentuk serupa dengan price > 10. Variabel price adalah bidang yang didefinisikan dalam kode Java.

      Anda dapat mengubah nilai string dalam database. Misalnya, jika Anda mengubah nilai string menjadi price > 20, ekspresi price > 20 dimuat secara dinamis dalam penerapan Flink CEP dinamis untuk membuat kondisi aviator baru untuk memproses peristiwa selanjutnya.

    • Kondisi berdasarkan ekspresi Groovy
      Groovy adalah bahasa dinamis berbasis platform Java Virtual Machine (JVM). Untuk informasi lebih lanjut tentang sintaks Groovy, lihat Sintaks. Flink CEP dinamis memungkinkan Anda menggunakan ekspresi Groovy untuk mendefinisikan kondisi, sehingga ambang batas kondisi dapat dimodifikasi secara dinamis.
      BidangDeskripsiTipe dataDiperlukanCatatan
      typeNama kelas. STRINGYaSetel nilai ke GROOVY.
      expressionString ekspresi. STRINGYaBidang ini menentukan string ekspresi dalam bentuk serupa dengan price > 5.0 && name.contains("mid"). Variabel seperti price dan name adalah bidang yang didefinisikan dalam kode Java. Anda dapat mengubah nilai string dalam database. Misalnya, jika Anda mengubah nilai string menjadi price > 20 && name.contains("end"), string Groovy baru dimuat secara dinamis dalam penerapan Flink CEP dinamis untuk membuat kondisi Groovy baru untuk memproses peristiwa selanjutnya.
  • Sisi
    BidangDeskripsiTipe dataDiperlukanCatatan
    sourceNama pola sumber. STRINGYaTidak ada.
    targetNama pola tujuan. STRINGYaTidak ada.
    typeStrategi pemilihan peristiwa. KamusYaNilai valid:
    • STRICT
    • SKIP_TILL_NEXT
    • SKIP_TILL_ANY
    • NOT_FOLLOW
    • NOT_NEXT

    Untuk informasi lebih lanjut tentang nilai-nilai dan artinya, lihat "Contiguity" dalam tema ini.

  • GraphNode memperluas Node

    GraphNode menunjukkan urutan pola lengkap. Setiap simpul GraphNode menunjukkan pola independen, sedangkan setiap sisi GraphNode menunjukkan cara mentransformasikan pola ke pola lain untuk mencocokkan peristiwa.

    GraphNode dianggap sebagai subkelas dari Node dan dapat digunakan sebagai Node dalam GraphNode yang lebih besar, sehingga mendukung GroupPattern yang menunjukkan penumpukan pola. Dibandingkan dengan Node, GraphNode menyediakan jenis bidang tambahan berikut:
    • Bidang nodes dan edges yang menggambarkan struktur graf.
    • Bidang window yang menggambarkan kebijakan jendela waktu dalam graf dan bidang afterMatchSkipStrategy yang menggambarkan strategi lewati yang digunakan setelah pencocokan peristiwa.
    Tabel berikut menjelaskan bidang GraphNode.
    BidangDeskripsiTipe dataDiperlukanCatatan
    nameNama pola komposit. STRINGYaString unik.
    Catatan Nama setiap graf harus unik.
    typeTipe simpul. ENUM(STRING)YaSetel nilai ke COMPOSITE.
    versionVersi format JSON yang digunakan oleh graf. INTEGERYaNilai default: 1.
    nodesPola anak yang bersarang dalam pola. Array simpulYaNilai bidang ini adalah array. Array tidak boleh kosong.
    edgesHubungan koneksi antara pola anak yang bersarang. Array sisiYaNilai bidang ini adalah array. Array bisa kosong.
    window
    • Jika tipe jendela adalah FIRST_AND_LAST, bidang ini menunjukkan interval waktu maksimum antara awal dan akhir kecocokan lengkap dari pola komposit.
    • Jika tipe jendela adalah PREVIOUS_AND_CURRENT, bidang ini menunjukkan interval waktu maksimum antara kecocokan dua pola anak yang berdekatan.
    KamusTidakContoh:
    "window": {
       "type": "FIRST_AND_LAST",
       "time": {
       "unit": "DAYS",
       "size": 1
       }
    }

    Unit bisa DAYS, HOURS, MINUTES, SECONDS, atau MILLISECONDS. Tipe data bisa LONG atau INTEGER.

    afterMatchSkipStrategyStrategi lewati setelah semua peristiwa dalam graf cocok. KamusYaUntuk informasi lebih lanjut, lihat "AfterMatchSkipStrategy" dalam tema ini.
    quantifierKuantifier yang menggambarkan cara mencocokkan pola. Misalnya, Anda dapat menentukan kuantifier untuk mencocokkan pola hanya sekali. KamusYaUntuk informasi lebih lanjut, lihat "Quantifier" dalam tema ini.
  • AfterMatchSkipStrategy
    BidangDeskripsiTipe dataDiperlukanCatatan
    typeTipe strategi. ENUM(STRING)Ya
    Nilai valid:
    • NO_SKIP: mengembalikan setiap kecocokan sukses di output. Ini adalah nilai default.
    • SKIP_TO_NEXT: membuang semua kecocokan parsial yang dimulai dengan peristiwa yang sama.
    • SKIP_PAST_LAST_EVENT: membuang semua kecocokan parsial yang dimulai antara awal dan akhir kecocokan.
    • SKIP_TO_FIRST: membuang semua kecocokan parsial yang dimulai antara awal kecocokan dan kemunculan pertama peristiwa bernama PatternName.
    • SKIP_TO_LAST: membuang semua kecocokan parsial yang dimulai antara awal kecocokan dan kemunculan terakhir peristiwa bernama PatternName.

    Untuk informasi lebih lanjut, lihat After Match Skip Strategy.

    patternNameNama pola yang menggunakan strategi. STRINGTidakString unik.
  • Kekontinuan
    Nilai validDeskripsi
    STRICTKekontinuan ketat. Peristiwa yang tidak cocok tidak dapat muncul di antara peristiwa yang cocok.
    SKIP_TILL_NEXTKekontinuan longgar. Peristiwa yang tidak cocok dapat muncul di antara peristiwa yang cocok. Peristiwa yang tidak cocok diabaikan.
    SKIP_TILL_ANYKekontinuan non-deterministik longgar. Nilai ini menunjukkan kekontinuan yang lebih longgar. Dalam mode kekontinuan ini, kecocokan tambahan untuk peristiwa tertentu yang cocok dapat diabaikan.
    NOT_NEXTPeristiwa berikutnya yang terjadi setelah peristiwa tidak dapat menjadi peristiwa tertentu.
    NOT_FOLLOWPeristiwa tertentu tidak dapat muncul kemudian.

    Untuk informasi lebih lanjut, lihat FlinkCEP - Complex event processing for Flink.

  • Properti kuantifier
    Nilai validDeskripsi
    SINGLEPola terjadi hanya sekali.
    LOOPINGPola adalah pola looping dan mungkin terjadi beberapa kali. Kuantifier ini mirip dengan tanda bintang (*) dan tanda plus (+) dalam ekspresi reguler.
    TIMESPola dapat terjadi sejumlah kali tertentu.
    GREEDYStrategi pencocokan serakah digunakan untuk mencocokkan pola untuk mendapatkan jumlah kecocokan maksimum.
    OPTIONALPola bersifat opsional.

Contoh 1: Menggunakan pola umum

Contoh ini menjelaskan cara menggunakan Flink CEP dinamis untuk menyesuaikan strategi pemasaran bagi pelanggan yang memenuhi kondisi berikut dalam jendela waktu 10 menit selama acara promosi e-commerce real-time:
  • Mendapatkan kupon untuk tempat acara.
  • Menambahkan item ke keranjang belanja mereka lebih dari tiga kali.
  • Tidak menyelesaikan pembayaran.
Dalam kode sampel berikut, kondisi untuk mendapatkan kupon untuk tempat acara didefinisikan sebagai StartCondition, kondisi untuk menambahkan item ke keranjang belanja didefinisikan sebagai MiddleCondition, dan kondisi terkait penyelesaian pembayaran didefinisikan sebagai EndCondition. Pola berikut diabstraksi: Dalam jendela waktu 10 menit, peristiwa yang memenuhi StartCondition terjadi sekali, peristiwa yang memenuhi MiddleCondition terjadi tiga kali atau lebih, dan tidak ada peristiwa yang memenuhi EndCondition yang terjadi. Peristiwa yang memenuhi StartCondition bersifat opsional. Kode sampel berikut menunjukkan kode Java yang menggambarkan pola dalam contoh ini.
Pattern<Event, Event> pattern =
    Pattern.<Event>begin("start")
            .where(new StartCondition())
            .optional()
            .followedBy("middle")
            .where(new MiddleCondition())
            .timesOrMore(3)
            .notFollowedBy("end")
            .where(new EndCondition())
            .within(Time.minutes(10));
Kode sampel berikut menunjukkan kode berformat JSON yang menggambarkan pola dalam contoh ini.
{
  "name": "end",
  "quantifier": {
    "consumingStrategy": "SKIP_TILL_NEXT",
    "properties": [
      "SINGLE"
    ],
    "times": null,
    "untilCondition": null
  },
  "condition": null,
  "nodes": [
    {
      "name": "end",
      "quantifier": {
        "consumingStrategy": "SKIP_TILL_NEXT",
        "properties": [
          "SINGLE"
        ],
        "times": null,
        "untilCondition": null
      },
      "condition": {
        "className": "com.alibaba.ververica.cep.demo.condition.EndCondition",
        "type": "CLASS"
      },
      "type": "ATOMIC"
    },
    {
      "name": "middle",
      "quantifier": {
        "consumingStrategy": "SKIP_TILL_NEXT",
        "properties": [
          "LOOPING"
        ],
        "times": {
          "from": 3,
          "to": 3,
          "windowTime": null
        },
        "untilCondition": null
      },
      "condition": {
        "className": "com.alibaba.ververica.cep.demo.condition.MiddleCondition",
        "type": "CLASS"
      },
      "type": "ATOMIC"
    },
    {
      "name": "start",
      "quantifier": {
        "consumingStrategy": "SKIP_TILL_NEXT",
        "properties": [
          "SINGLE",
          "OPTIONAL"
        ],
        "times": null,
        "untilCondition": null
      },
      "condition": {
        "className": "com.alibaba.ververica.cep.demo.condition.StartCondition",
        "type": "CLASS"
      },
      "type": "ATOMIC"
    }
  ],
  "edges": [
    {
      "source": "middle",
      "target": "end",
      "type": "NOT_FOLLOW"
    },
    {
      "source": "start",
      "target": "middle",
      "type": "SKIP_TILL_NEXT"
    }
  ],
  "window": {
    "type": "FIRST_AND_LAST",
    "time": {
      "unit": "MINUTES",
      "size": 10
    }
  },
  "afterMatchStrategy": {
    "type": "NO_SKIP",
    "patternName": null
  },
  "type": "COMPOSITE",
  "version": 1
}

Contoh 2: Menggunakan kondisi yang mencakup parameter kustom dalam pola

Contoh ini menjelaskan cara menentukan strategi pemasaran yang berbeda untuk pelanggan dari kelas yang berbeda selama acara promosi e-commerce real-time. Misalnya, Anda dapat menentukan strategi pemasaran yang mengirim pesan teks terkait pemasaran kepada pelanggan Kelas A, strategi pemasaran yang mengirim kupon kepada pelanggan Kelas B, dan strategi pemasaran yang tidak mengambil tindakan pemasaran untuk pelanggan lainnya. Anda dapat mendefinisikan kondisi kelas umum dalam penerapan Anda untuk memenuhi persyaratan tersebut. Jika Anda ingin menyesuaikan strategi pemasaran saat kondisi kelas umum digunakan dalam penerapan Anda, Anda harus menulis ulang kode penerapan dan mengompilasi ulang serta menjalankan penerapan. Misalnya, Anda dapat memodifikasi strategi pemasaran yang mengirim kupon kepada pelanggan Kelas C. Untuk menyederhanakan operasi, Anda dapat menggunakan kondisi yang mencakup parameter kustom. Setelah Anda mendefinisikan cara menyesuaikan strategi berdasarkan parameter yang dilewatkan dalam kode, Anda hanya perlu mengubah nilai parameter yang dilewatkan dalam database. Nilai parameter yang dilewatkan adalah nilai parameter args dari kondisi yang mencakup parameter kustom. Misalnya, Anda dapat mengubah ["A", "B"] menjadi ["A", "B", "C"] untuk melakukan pembaruan dinamis strategi pemasaran.

Kode sampel berikut menunjukkan kondisi yang awalnya didefinisikan dalam pola.
"condition": {
    "args": [
        "A", "B"
    ],
    "className": "org.apache.flink.cep.pattern.conditions.CustomMiddleCondition",
    "type": "CLASS"
}
Anda dapat mengubah kondisi sebelumnya menjadi kondisi yang mencakup parameter kustom. Kode sampel berikut menunjukkan kondisi yang mencakup parameter kustom.
"condition": {
    "args": [
        "A", "B", "C"
    ],
    "className": "org.apache.flink.cep.pattern.conditions.CustomMiddleCondition",
    "type": "CLASS"
}
Untuk informasi lebih lanjut tentang cara menggunakan kondisi yang mencakup parameter kustom dalam skenario bisnis tertentu, lihat Demo.
Catatan aviatorscript dan Demo yang disebutkan dalam tema ini berasal dari situs web pihak ketiga. Saat Anda mengunjungi situs web tersebut, situs web mungkin gagal dibuka atau aksesnya mungkin tertunda.

Referensi

Memulai dengan Flink CEP Dinamis