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 baru—sync_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.