Saya teruja untuk memperkenalkan satu siri artikel tentang Apache Camel. Dalam catatan pertama ini, daripada menyelidiki secara mendalam kerumitan Apache Camel, saya akan membentangkan kes penggunaan praktikal untuk mempamerkan keupayaannya. Secara khusus, anda akan belajar cara membuat aplikasi Ekstrak, Transformasi dan Muat (ETL) mudah antara dua pangkalan data menggunakan Apache Camel.
Sebelum kita menyelami kes penggunaan praktikal, mari kita perkenalkan secara ringkas Apache Camel. Apache Camel ialah rangka kerja penyepaduan sumber terbuka yang memanfaatkan Corak Integrasi Perusahaan (EIP) untuk memudahkan penyepaduan pelbagai sistem.
Dalam dunia hari ini, pelbagai jenis sistem wujud bersama. Sesetengahnya mungkin sistem warisan, manakala yang lain baharu. Sistem ini selalunya perlu berinteraksi dan berintegrasi antara satu sama lain, yang boleh mencabar kerana pelaksanaan dan format mesej yang berbeza. Satu penyelesaian ialah menulis kod tersuai untuk merapatkan perbezaan ini, tetapi ini boleh membawa kepada masalah gandingan dan penyelenggaraan yang ketat.
Sebaliknya, Apache Camel menawarkan lapisan tambahan untuk mengantara perbezaan antara sistem, menghasilkan gandingan longgar dan penyelenggaraan yang lebih mudah. Camel menggunakan API (atau Bahasa Khusus Domain Java deklaratif) untuk mengkonfigurasi peraturan penghalaan dan pengantaraan berdasarkan EIP.
Untuk memahami Apache Camel, adalah penting untuk memahami "Corak Integrasi Perusahaan" (EIP). Buku "Corak Integrasi Perusahaan" menerangkan satu set corak untuk mereka bentuk sistem berasaskan komponen yang besar di mana komponen boleh berjalan dalam proses yang sama atau pada mesin yang berbeza. Idea utama ialah sistem harus berorientasikan mesej, dengan komponen berkomunikasi melalui mesej. Corak menyediakan kit alat untuk melaksanakan komunikasi ini (Rajah 1).
Rajah 1 – Elemen Asas Penyelesaian Integrasi (enterpriseintegrationpatterns.com)
EndPoint: Endpoint ialah saluran yang melaluinya mesej dihantar dan diterima. Ia berfungsi sebagai antara muka antara komponen dan dunia luar.
Mesej: Mesej ialah struktur data yang digunakan untuk komunikasi antara sistem, yang terdiri daripada pengepala dan badan. Pengepala mengandungi metadata dan badan mengandungi data sebenar.
Saluran: Saluran menghubungkan dua titik akhir, memudahkan penghantaran dan penerimaan mesej.
Penghala: Penghala menghalakan mesej dari satu titik ke hujung yang lain, menentukan laluan mesej.
Penterjemah: Penterjemah menukar mesej daripada satu format ke format lain.
Saya pertimbangkan untuk berhenti di sini buat masa ini mengenai pengenalan kepada Apache Camel. Sekarang mari tunjukkan kepada anda cara membuat aplikasi ETL ringkas antara dua pangkalan data menggunakan Apache Camel.
Anggap kita mempunyai sistem yang sangat sarat di mana satu komponen kritikal ialah pangkalan data. Pada satu ketika, kami perlu menangani data ini di luar kes operasi biasa - melatih model ML, menjana eksport, graf, atau kami hanya memerlukan sebahagian daripada data. Sudah tentu, ini akan membebankan pangkalan data operasi kami lebih banyak lagi, dan untuk tujuan ini, adalah optimum untuk mempunyai mekanisme yang kami boleh mengekstrak data yang diperlukan, mengubahnya ke dalam bentuk yang kami perlukan, dan menyimpannya dalam pangkalan data lain - lain daripada yang beroperasi. Dengan strategi ini, kami menyelesaikan masalah potensi beban berlebihan yang berlebihan di pangkalan operasi kami. Selain itu, dengan mekanisme sedemikian, kami boleh melakukan operasi ini pada masa sistem kami tidak terlalu dimuatkan (mis., waktu malam).
Penyelesaian ditunjukkan dalam rajah di bawah (Rajah 2). Kami akan menggunakan Apache Camel untuk mencipta aplikasi ETL ringkas antara dua pangkalan data. Aplikasi akan mengekstrak data daripada pangkalan data sumber, mengubahnya, dan memuatkannya ke dalam pangkalan data sasaran. Kami boleh memperkenalkan strategi yang berbeza untuk melaksanakan penyelesaian ini, memfokuskan pada cara mengekstrak data daripada pangkalan data sumber. Saya menganggap bahawa kriteria untuk memilih data adalah berdasarkan tarikh pengubahsuaian rekod. Strategi ini memberi peluang untuk mengekstrak data yang telah diubah suai juga.
Rajah 2 – Menyegerakkan Data Antara Dua Pangkalan Data Menggunakan Apache Camel
Pangkalan data sumber dan sasaran akan mempunyai struktur jadual berikut:
CREATE TABLE IF NOT EXISTS user ( id serial PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL, email VARCHAR(255) NOT NULL, created_at timestamp default now()::timestamp without time zone, last_modified TIMESTAMP DEFAULT now()::timestamp without time zone );
Dalam pangkalan data sasaran, kami akan menukar nama pengguna kepada huruf besar sebelum memasukkannya.
Kami akan menggunakan sambungan Camel Quarkus untuk pelbagai komponen Camel. Khususnya, kami akan menggunakan komponen Camel SQL untuk berinteraksi dengan pangkalan data. Komponen SQL menyokong pelaksanaan pertanyaan SQL, sisipan, kemas kini dan pemadaman.
Mula-mula, buat kelas yang memanjangkan RouteBuilder dan ganti kaedah konfigurasi:
@ApplicationScoped public class UserRoute extends RouteBuilder { @Override public void configure() throws Exception { // your code here } }
Penggunaan anotasi @ApplicationScoped tidak wajib di sini, tetapi saya lebih suka menunjukkan bahawa kelas itu ialah kacang CDI dan harus diuruskan oleh bekas CDI.
Seperti yang saya nyatakan di atas, kami akan menggunakan komponen Camel SQL untuk berinteraksi dengan pangkalan data. Kita perlu mengkonfigurasi komponen Camel SQL untuk menyambung ke pangkalan data sumber dan sasaran. Kami akan menggunakan sambungan Quarkus Agroal untuk mengkonfigurasi sumber data. Sambungan Agroal menyediakan kumpulan sambungan untuk sumber data. Kami akan mengkonfigurasi sumber data dalam fail application.properties.
# # Source Database Configuration quarkus.datasource.source_db.db-kind=postgresql quarkus.datasource.source_db.jdbc.url=jdbc:postgresql://localhost:5001/demo quarkus.datasource.source_db.username=test quarkus.datasource.source_db.password=password1 # # # Target Database Configuration quarkus.datasource.target_db.db-kind=postgresql quarkus.datasource.target_db.jdbc.url=jdbc:postgresql://localhost:6001/demo quarkus.datasource.target_db.username=test quarkus.datasource.target_db.password=password1 #
Kini kami boleh mengkonfigurasi komponen Camel SQL untuk menyambung ke pangkalan data sumber dan sasaran. Kami akan menggunakan komponen sql untuk mencipta titik akhir SQL untuk pangkalan data sumber dan sasaran.
Komponen SQL menggunakan tatatanda URI titik akhir berikut:
sql:select * from table where id=# order by name[?options]
Tetapi kami memerlukan mekanisme untuk menjalankan operasi secara automatik. Kami akan menggunakan komponen pemasa untuk mencetuskan proses ETL setiap saat. Komponen pemasa digunakan untuk menjana pertukaran mesej apabila pemasa menyala. Komponen pemasa menggunakan tatatanda URI titik akhir berikut:
timer:name[?options]
Dalam laluan kami, kami menggunakan konfigurasi seperti berikut:
from("timer://userSync?delay={{etl.timer.delay}}&period={{etl.timer.period}}")
{{etl.timer.delay}} dan {{etl.timer.period}} ialah nilai konfigurasi yang akan kami tentukan dalam fail application.properties.
etl.timer.period=10000 etl.timer.delay=1000
Untuk mengubah data sebelum memasukkannya ke dalam pangkalan data sasaran, kami perlu menyediakan penterjemah kami:
.process(exchange -> { final Map<String, Object> rows = exchange.getIn().getBody(Map.class); final String userName = (String) rows.get("username"); final String userNameToUpperCase = userName.toUpperCase(); log.info("User name: {} converted to upper case: {}", userName, userNameToUpperCase); rows.put("username", userNameToUpperCase); })
Antara muka Pemproses digunakan untuk melaksanakan pengguna pertukaran mesej atau untuk melaksanakan Penterjemah Mesej dan kes penggunaan lain.
Dan voila, kami mempunyai aplikasi ETL ringkas antara dua pangkalan data menggunakan Apache Camel.
Apabila anda menjalankan aplikasi, anda akan melihat output berikut dalam log:
2024-06-09 13:15:49,257 INFO [route1] (Camel (camel-1) thread #1 - timer://userSync) Extracting Max last_modified value from source database 2024-06-09 13:15:49,258 INFO [route1] (Camel (camel-1) thread #1 - timer://userSync) No record found in target database 2024-06-09 13:15:49,258 INFO [route2] (Camel (camel-1) thread #1 - timer://userSync) The last_modified from source DB: 2024-06-09 13:15:49,274 INFO [route2] (Camel (camel-1) thread #1 - timer://userSync) Extracting records from source database 2024-06-09 13:15:49,277 INFO [org.iqn.cam.rou.UserRoute] (Camel (camel-1) thread #1 - timer://userSync) User name: john_doe converted to upper case: JOHN_DOE 2024-06-09 13:15:49,282 INFO [org.iqn.cam.rou.UserRoute] (Camel (camel-1) thread #1 - timer://userSync) User name: jane_smith converted to upper case: JANE_SMITH 2024-06-09 13:15:49,283 INFO [org.iqn.cam.rou.UserRoute] (Camel (camel-1) thread #1 - timer://userSync) User name: alice_miller converted to upper case: ALICE_MILLER
Anda boleh mencari kod sumber penuh aplikasi dalam repositori GitHub.
Dengan persediaan ini, kami telah mencipta aplikasi ETL ringkas menggunakan Apache Camel yang mengekstrak data daripada pangkalan data sumber, mengubahnya dan memuatkannya ke dalam pangkalan data sasaran. Pendekatan ini membantu mengurangkan beban pada pangkalan data operasi dan membolehkan kami melakukan pengekstrakan data semasa waktu luar puncak.
Atas ialah kandungan terperinci Panduan Praktikal untuk Apache Camel dengan Quarkus: Membina Aplikasi ETL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!