EVENT-DRIVEN EVENT-VERSIONING SCHEMA-EVOLUTION DATA-CONSISTENCY MICROSERVICES ARCHITECTURE DATA-PIPELINE COMPATIBILITY BEST-PRACTICES BACKEND SOFTWARE-DEVELOPMENT

Strategi Event Versioning di Sistem Event-Driven: Menjaga Kompatibilitas Saat Perubahan Tak Terhindarkan

⏱️ 7 menit baca
👨‍💻

Strategi Event Versioning di Sistem Event-Driven: Menjaga Kompatibilitas Saat Perubahan Tak Terhindarkan

Di dunia pengembangan perangkat lunak modern, Arsitektur Event-Driven (EDA) telah menjadi pilihan populer untuk membangun sistem yang responsif, skalabel, dan terdistribusi. Dengan EDA, berbagai layanan berkomunikasi satu sama lain melalui event, yaitu fakta-fakta yang terjadi di sistem Anda.

Namun, seiring waktu, kebutuhan bisnis akan berubah. Anda mungkin perlu menambahkan informasi baru ke event, mengubah struktur data yang ada, atau bahkan menghapus field yang tidak lagi relevan. Di sinilah tantangan besar muncul: bagaimana kita bisa melakukan perubahan pada skema event tanpa merusak layanan lain yang mengonsumsi event tersebut?

Inilah inti dari Event Versioning. Ini adalah strategi vital untuk mengelola evolusi skema event Anda, memastikan sistem tetap berjalan mulus meskipun ada perubahan. Artikel ini akan membawa Anda menyelami berbagai strategi praktis untuk mengimplementasikan event versioning, menjaga kompatibilitas, dan menghindari drama di sistem event-driven Anda.

1. Pendahuluan: Kenapa Event Versioning Itu Penting?

Bayangkan Anda memiliki aplikasi e-commerce. Ketika seorang pengguna baru mendaftar, layanan UserService mungkin akan memancarkan event UserRegistered. Event ini berisi informasi dasar seperti userId, email, dan registrationDate.

// Event: UserRegistered_v1
{
  "userId": "usr_123",
  "email": "john.doe@example.com",
  "registrationDate": "2023-10-26T10:00:00Z"
}

Event ini kemudian dikonsumsi oleh berbagai layanan lain:

Beberapa bulan kemudian, tim pemasaran memutuskan bahwa mereka juga ingin melacak sumber pendaftaran (misalnya, dari mana pengguna menemukan aplikasi Anda). Mereka meminta Anda untuk menambahkan field referralSource ke event UserRegistered.

Jika Anda langsung mengubah skema event tersebut menjadi:

// Event: UserRegistered_v2
{
  "userId": "usr_123",
  "email": "john.doe@example.com",
  "registrationDate": "2023-10-26T10:00:00Z",
  "referralSource": "Google Ads" // Field baru
}

…apa yang akan terjadi pada EmailService, AnalyticsService, dan LoyaltyService yang masih mengharapkan skema UserRegistered_v1? ⚠️ Kemungkinan besar, mereka akan error!

Inilah masalah yang dipecahkan oleh event versioning. Ini adalah cara kita untuk memastikan bahwa:

Tanpa strategi versioning yang jelas, evolusi sistem event-driven Anda akan menjadi mimpi buruk yang penuh dengan breaking changes dan downtime.

2. Mengapa Event Berubah? Keniscayaan dalam Sistem Modern

Perubahan adalah satu-satunya hal yang konstan dalam pengembangan perangkat lunak. Event, sebagai representasi fakta bisnis, tidak luput dari dinamika ini. Beberapa alasan umum mengapa event Anda perlu berubah:

Memahami bahwa event akan berubah adalah langkah pertama. Langkah selanjutnya adalah memiliki strategi yang solid untuk mengelola perubahan tersebut.

3. Prinsip Dasar Kompatibilitas Event

Sebelum masuk ke strategi, mari kita pahami dua pilar utama dalam event versioning:

✅ Kompatibilitas Mundur (Backward Compatibility)

Ini berarti konsumen lama harus bisa membaca dan memproses event yang dipancarkan oleh produsen versi baru.

Skenario:

Contoh Praktis: Jika Anda menambahkan field baru (referralSource) ke event UserRegistered, konsumen v1 harus bisa mengabaikan field ini tanpa error. Ini biasanya dicapai dengan membuat field baru bersifat opsional atau memberikan nilai default.

✅ Kompatibilitas Maju (Forward Compatibility)

Ini berarti konsumen baru harus bisa membaca dan memproses event yang dipancarkan oleh produsen versi lama.

Skenario:

Contoh Praktis: Jika konsumen v2 mengharapkan field referralSource, dan menerima event UserRegistered_v1 yang tidak memiliki field tersebut, konsumen v2 harus bisa menangani kasus ini (misalnya, dengan menggunakan nilai default atau menandainya sebagai null).

🎯 Tujuan utama kita adalah mencapai kedua jenis kompatibilitas ini sebanyak mungkin untuk meminimalkan breaking changes dan memudahkan deployment.

4. Strategi Event Versioning Praktis

Ada beberapa pendekatan untuk mengelola versi event, masing-masing dengan kelebihan dan kekurangannya. Pemilihan strategi seringkali tergantung pada tingkat perubahan dan toleransi sistem Anda terhadap kompleksitas.

a. Versioning di Nama Event atau Topik (Major Versioning)

Ini adalah strategi paling sederhana namun paling kaku. Setiap kali ada perubahan skema yang tidak kompatibel mundur atau maju (breaking change), Anda membuat event baru dengan nama yang berbeda atau mempublikasikannya ke topik yang berbeda.

// Produsen v1
producer.send("user-events-v1", new UserRegisteredV1(...));

// Produsen v2 (setelah breaking change)
producer.send("user-events-v2", new UserRegisteredV2(...));

Kapan Digunakan: Ketika perubahan skema sangat besar dan tidak mungkin diakomodasi dengan kompatibilitas (misalnya, mengubah tipe data fundamental, menghapus field wajib).

Kelebihan:

Kekurangan:

b. Versioning Melalui Skema Event (Minor/Patch Versioning)

Ini adalah strategi yang paling umum untuk perubahan non-breaking yang menjaga kompatibilitas mundur dan maju. Anda mempertahankan nama event atau topik yang sama, tetapi memodifikasi skema event itu sendiri.

// Event v1
{ "userId": "usr_123", "email": "john.doe@example.com" }

// Event v2: menambah "referralSource" sebagai opsional
{ "userId": "usr_123", "email": "john.doe@example.com", "referralSource": "Google Ads" }

Kapan Digunakan: Untuk sebagian besar perubahan inkremental yang tidak merusak kontrak fundamental event.

Kelebihan:

Kekurangan:

c. Envelope Pattern (Pembungkus Event)

Strateg