Semua dikemas dalam proses yang mudah, dapat diulang, dan dipelihara

Tentang Artikel Ini

Implementasi standar Netflix Conductor dikonfigurasi untuk menggunakan Elasticsearch 6. Artikel ini membahas perubahan yang perlu dilakukan untuk menggunakan Elasticsearch 7 dan PostgreSQL, serta menyediakan beberapa skrip untuk mengotomatiskan pembuatan dan menjalankan Conductor, baik secara lokal maupun dalam arsitektur cloud .

Pada saat penulisan, versi terbaru Netflix Conductor yang dirilis adalah 3.5.3. Informasi dalam artikel ini didasarkan pada versi 3.5.1 tetapi harus dapat diterapkan (dan mudah dimodifikasi) ke versi terbaru. Jika Anda mengalami masalah apa pun, beri tahu saya, dan saya akan melakukan yang terbaik untuk membantu. Sumber bantuan hebat lainnya adalah Papan diskusi Konduktor Netflix.

Saya menjalankan semua kode yang disediakan pada mesin Windows 10, dari Git Bash, yang disertakan dengan Git untuk Windows. Arsitektur cloud kami berjalan pada CentOS.

Apa itu Konduktor Netflix?

Netflix Conductor adalah mesin orkestrasi alur kerja yang dibuat oleh Netflix untuk “mengatur alur proses berbasis layanan mikro” (sumber: Dokumentasi Netflix Conductor). Daftar fitur lengkap Netflix Conductor terletak di sini, tetapi beberapa fitur utamanya adalah:

  • Alur kerja dan ketentuan tugas diimplementasikan dalam format JSON. Hal ini memungkinkan pembuatan versi dan dukungan mudah untuk alat khusus untuk membuat dan mengelola alur kerja dan tugas.
  • Tugas dan Pekerja, yaitu blok penyusun yang membentuk alur kerja dan layanan mikro yang menampungnya, sepenuhnya agnostik bahasa, yang memungkinkan implementasi dilakukan dalam bahasa yang paling sesuai untuk tugas tersebut. Perpustakaan ada untuk Java, Python, .NET (plug tak tahu malu: yang ini dikembangkan oleh saya), dan lain-lain.
  • Arsitektur database bersifat pluggable, artinya kita dapat memilih database apa yang ingin kita gunakan untuk Conductor. Conductor hadir dengan banyak plugin siap pakai, mendukung (antara lain) Dynomite (juga oleh Netflix), MySQL, dan PostgreSQL.
  • Netflix Conductor hadir dengan UI (opsional), yang memungkinkan wawasan dan kontrol atas alur kerja, seperti memulai (kembali), menjeda, menghentikan.
  • Keseluruhan proyek bersifat open source dan sedang dikembangkan dan didukung secara aktif.

Singkatnya, Netflix Conductor memungkinkan Anda mengotomatiskan dan mengelola proses yang terdiri dari beberapa tugas (yang mungkin merupakan proses itu sendiri), yang mungkin perlu dijalankan secara berurutan, dengan cara yang andal, konsisten, dan terukur.

Pada proyek saya saat ini, kami menggunakan Netflix Conductor dan PostgreSQL untuk menjalankan proses ETL terjadwal, membuat hubungan baik, mengunduh dan mengunggah file, serta untuk memantau dan memberi peringatan. Kami juga telah menyelidiki penggunaan Konduktor untuk mengotomatiskan penyediaan akun pengguna dan infrastruktur lainnya.

Mengonfigurasi Konduktor Netflix untuk Elasticsearch 7

Seperti disebutkan dalam pendahuluan, implementasi standar Netflix Conductor dikonfigurasikan untuk menggunakan Elasticsearch 6. Dukungan untuk Elasticsearch 7 sudah ada di dalamnya, namun beberapa perubahan perlu dilakukan untuk mengaktifkannya. Ada "dokumentasi" yang tersedia di GitHub untuk melakukan perubahan ini, tetapi tampaknya belum sepenuhnya lengkap. Saya memerlukan perubahan yang saya jelaskan di bawah untuk membangun dan menjalankan Elasticsearch 7.

Pada saat penulisan, Elasticsearch 7.17.1 adalah versi terbaru dari Elasticsearch 7.

Berikut ringkasan singkat perubahan yang diperlukan (semua referensi file berhubungan dengan folder root):

  • build.gradle — Ubah ext['elasticsearch.version'] = revElasticSearch6
    menjadi ext['elasticsearch.version'] = revElasticSearch7
  • settings.gradle — Hapus baris include 'es6-persistence'
  • server/build.gradle — Ubah implementation project(':conductor-es6-persistence')
    menjadi implementation project(':conductor-es7-persistence')
  • server/src/main/resources/application.properties — Ubah conductor.elasticsearch.version=6
    menjadi conductor.elasticsearch.version=7
  • docker/docker-compose.yaml — Ubah image: elasticsearch:6.8.15
    menjadi image: docker.elastic.co/elasticsearch/elasticsearch:7.17.1
  • test-harness/build.gradle — Ubah testImplementation project(‘:conductor-es6-persistence’)
    menjadi testImplementation project(‘:conductor-es7-persistence’)
  • /testharness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java — Ubah conductor.elasticsearch.version=6
    menjadi conductor.elasticsearch.version=7

Ubah DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss").withTag("6.8.12"));
menjadi DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch").withTag("7.17.1"));

Cara standar untuk menerapkan perubahan ini adalah dengan membuat fork dari repositori Konduktor dan melakukan pekerjaan Anda dari sana.

Namun, menurut saya menyalin seluruh repositori untuk mengubah beberapa file hanya membuang-buang sumber daya, jadi saya mengikuti pendekatan yang berbeda.

Saat membangun, saya clone repositori Konduktor, lalu menerapkan beberapa file patch untuk membuat perubahan yang saya perlukan. Meskipun langkah-langkah ini sedikit meningkatkan waktu pembuatan, saya merasa ini adalah kompromi yang baik antara kecepatan dan menjaga repositori saya tetap bersih dan terpelihara.

Begini cara kerjanya:

  1. Kloning repo Konduktor di dalam direktori proyek Anda.
  2. Lakukan perubahan di atas.
  3. Di folder Konduktor, jalankan git diff > v3.5.1-update-to-es7.patch untuk membuat file patch. v3.5.1 adalah untuk kenyamanan, untuk menunjukkan bahwa patch ini hanya berfungsi pada versi tersebut.
  4. Salin file patch ke direktori root, sehingga Anda dapat menghapus repo Konduktor dengan aman dan menerapkan perubahan setiap kali Anda mengkloning repo itu lagi.

Anda juga perlu menghapus file dependencies.lock apa pun sebelum membuat. Ini semudah menjalankan rm -f **/dependencies.lock.

Untuk mengotomatiskan penghapusan file lock dan menerapkan tambalan, saya membuat skrip 01.get-conductor.sh:

Anda dapat melihat bahwa saya sebenarnya menerapkan beberapa tambalan lagi. Ini tidak diperlukan untuk dijalankan melawan Elasticsearch 7.

Pada titik ini, Anda dapat membangun Konduktor. Saya membuat 02.build-conductor-server.sh untuk tujuan ini:

Di bagian “Menyatukan semuanya,” saya akan memberikan beberapa skrip tambahan untuk mengotomatisasi kloning, patch, dan membangun proses lebih lanjut, termasuk cara menggunakan variabel lingkungan untuk mengonfigurasi Elasticsearch.

Mengonfigurasi Konduktor Netflix untuk PostgreSQL

Menjalankan Konduktor terhadap PostgreSQL juga dijelaskan dalam file README. Menjalankan docker-compose -f docker-compose.yaml -f docker-compose-postgres.yaml upakan memulai instans kontainer tambahan untuk PostgreSQL dan mengonfigurasi Konduktor untuk menggunakannya.

Namun dalam kasus kami, kami ingin menjalankan instalasi PostgreSQL yang sudah ada. Selain itu, kami tidak ingin objek database Konduktor dibuat dalam skema public, seperti defaultnya.

Untuk mencapai hal ini, kita perlu mengubah file config-postgres.properties. Ini ada di folder conductor/docker/server/config. Namun karena kami mendapatkan repo Konduktor di setiap build, kami tidak dapat mengubahnya di sana.

Jadi, saya membuat folder docker di root proyek saya yang akan berisi semua penyesuaian pada file di folder conductor/docker. Saat membangun, saya cukup menyalin isi folder ini.

Skrip 02.build-conductor-server.sh sekarang menjadi:

File config-postgres.properties lokal kami hanyalah salinan dari aslinya, dengan bagian PostgreSQL dimodifikasi, sebagai berikut:

Dengan menambahkan currentSchema ke URL sumber data, kami memastikan objek database Konduktor dibuat dalam skema yang ditentukan. Properti applicationName membantu kami men-debug sesi database jika diperlukan.

Kecuali itu tidak berhasil. Saat kita menjalankan Conductor hanya dengan menggunakan perubahan ini, properti currentSchema diabaikan dan semuanya dibuat dalam skema public. Tidak keren. Saya mengajukan bug terhadap PR yang menyebabkannya.

Saya akan memberi Anda waktu beberapa jam untuk melakukan pencarian yang saya lakukan untuk menemukan penyebabnya dan hanya menyajikan “solusinya”. Termasuk air quotes, karena lebih terasa seperti hack. Tapi itu berhasil.

Dalam file postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresConfiguration.java, Jalur Terbang (yang menangani migrasi basis data) dikonfigurasi dengan baris .schemas("public"), yang menyebabkan segala upaya untuk mengubah skema default diabaikan. Menghapus baris ini menyelesaikan masalah.

Saya membuat v3.5.1-fix-currentSchema-override.patch untuk ini dan memasukkannya ke dalam skrip 01.get-conductor.sh.

Jika Anda bertanya-tanya tentang ## placeholder di sana, ini akan digantikan oleh nilai dari variabel lingkungan yang cocok. Saya akan membahasnya di bagian “Menyatukan semuanya”. Sementara itu, ganti saja ini dengan nilai-nilai Anda.

Mengonfigurasi Pengarsipan Alur Kerja

Sebagai bonus kecil namun berguna, kami mengaktifkan alur kerja yang selesai dan dihentikan untuk diarsipkan setelah 60 detik (default), dengan mengonfigurasi pemroses status alur kerja.

Cukup tambahkan conductor.workflow-status-listener.type=archive ke file config-postgres.properties.

Ini akan menjaga database Anda agar tidak dipenuhi alur kerja yang tidak ingin Anda lihat lagi. Dan meskipun Anda melakukannya, data akan tetap disimpan di Elasticsearch, dan dapat diakses sesuai permintaan.

Menyatukan Semuanya

Agar hal di atas berfungsi secara lokal dan juga di lingkungan cloud, kami ingin menggunakan variabel lingkungan untuk mengonfigurasi Elasticsearch dan PostgreSQL. Untuk melakukan ini, buka file startup.sh di folder conductor/docker/server/bin. Kami menyalin file ini ke folder docker lokal kami sehingga kami dapat membuat beberapa perubahan.

Kami menambahkan baris berikut tepat setelah blok if..fi:

Ingat ## placeholder yang Anda lihat sebelumnya? Kami menggunakan alat sed untuk menggantinya dengan nilai yang dikonfigurasi dalam variabel lingkungan yang cocok.

Untuk menjalankan secara lokal, kami menambahkan variabel lingkungan dan nilainya ke file docker-compose.yaml dan docker-compose-postgres.yaml, yang kami salin ke folder docker lokal kami. Sebagai contoh, lihat file docker-compose-postgres.yaml:

Kami menggunakan nilai ajaib host.docker.internal untuk menunjuk ke instance PostgreSQL lokal kami, karena localhost tidak akan berfungsi dari dalam container Docker.

Skrip 02.build-conductor-server.sh juga menyalin startup.sh.

Akhirnya tinggal beberapa skrip lagi.

03.build-conductor-ui.sh menangani pembuatan image UI Konduktor:

Kita dapat menjalankan Konduktor menggunakan 04.run-local.sh, yang sebenarnya tidak lebih dari memanggil docker compose up:

Atau, kita dapat menjalankan 04.run-local-postgres.sh untuk dijalankan pada database PostgreSQL kita:

Itu dia. Dengan menggunakan skrip di atas, Anda seharusnya dapat membuat dan menjalankan Netflix Conductor lokal dalam beberapa menit. Dan menghubungkan skrip ke alat CI/CD favorit Anda juga bisa dilakukan dengan sempurna.

Kesimpulannya

Menjalankan Netflix Conductor dengan Elasticsearch 7 dan PostgreSQL membutuhkan sedikit usaha, namun dengan menggunakan kekuatan git diff dan skrip bash, kita dapat membuat prosesnya mudah, dapat diulang, dan dapat digunakan baik dalam konteks lokal maupun cloud.

Semua kode sumber di atas tersedia di GitHub.

Saya harap artikel ini membantu Anda memulai Netflix Conductor menggunakan Elasticsearch 7 dan PostgreSQL.

Selamat membuat kode!

Semua cuplikan kode dalam artikel ini dibuat menggunakan gistbuilder, sebuah program kecil bagus yang saya tulis untuk tujuan tersebut.

Jika Anda merasa artikel ini bermanfaat, Anda mungkin tertarik dengan cara kami menjadwalkan alur kerja di proyek kami. Beruntungnya Anda, saya juga menulis artikel tentang itu: