Lewati ke konten utama

SIMRS Sync — dari Sekali Jalan ke Resumable


❌ Alur LAMA

Satu lintasan penuh. Kalau gagal di tengah, semua progres hilang dan run berikutnya mulai dari awal.

Masalahnya


✅ Alur BARU

Kolom sync_states.cursor menyimpan checkpoint per chunk. Run berikutnya melanjutkan dari titik itu.


Perbandingan berdampingan

Aspek❌ Lama✅ Baru
Kalau job timeoutProgres hilang totalDilanjutkan dari chunk terakhir
Batch yang matiTertinggal running selamanyaDitandai failed oleh run berikutnya
Status di UIBisa berbohongJujur
Backfill tabel besarPraktis mustahilSelesai bertahap lintas beberapa run
Timeout jobDefaultDinaikkan sampai 6 jam
WatermarkMaju hanya kalau selesaiSama — tidak berubah
Kolom barusync_states.cursor
Watermark dan cursor itu dua hal berbeda
  • Watermark (last_watermark): sampai kapan data sudah tersinkron. Hanya maju kalau seluruh lintasan selesai.
  • Cursor: sampai baris mana lintasan yang sedang berjalan sudah sampai. Dikosongkan begitu lintasan selesai.

Keduanya harus ada. Watermark saja tidak cukup — ia hanya maju di akhir. Cursor saja juga tidak cukup — ia tidak tahu data mana yang berubah sejak sinkronisasi terakhir.


Ilustrasi pemulihan


Perbaikan kompatibilitas PostgreSQL yang menyertai

Perubahan ini datang bersama serangkaian perbaikan agar data SIMRS (MySQL) bisa masuk ke PostgreSQL.

Semua ini adalah kelas masalah yang sama: SIMRS adalah MySQL longgar, CRM adalah PostgreSQL ketat. Data yang lolos di sisi sumber belum tentu diterima di sisi tujuan.


Perbaikan lain yang menyertai

PerbaikanAlasan
Timeout job dinaikkan ke 6 jamBackfill besar butuh waktu; cursor jadi jaring pengamannya
Paginasi database standar di halaman PasienPenggabungan hasil API di memori menyebabkan OOM saat jumlah pasien besar
simrs_patient_id ditampilkan sebagai kolom "No. RM"Petugas mencari pasien dengan nomor rekam medis, bukan ID internal

Yang TIDAK berubah

Bagian ini tetap sama antara alur lama dan baru:

Rollback pun ikut menyesuaikan: kalau batch yang di-rollback adalah batch terakhir entitas tersebut, cursor ikut dikosongkan bersama pemunduran watermark.