All Products
Search
Document Center

ApsaraMQ for RocketMQ:Pesan transaksional

Last Updated:Jul 02, 2025

ApsaraMQ for RocketMQ mendukung pesan transaksional terdistribusi, yang berlaku untuk skenario di mana konsistensi akhir diperlukan. Topik ini menjelaskan konsep, manfaat, skenario, proses interaksi, catatan penggunaan, dan contoh kode pesan transaksional ApsaraMQ for RocketMQ.

Istilah

  • Pesan transaksional: ApsaraMQ for RocketMQ menyediakan fitur pemrosesan transaksi terdistribusi serupa dengan X/Open XA untuk memastikan konsistensi transaksi dalam ApsaraMQ for RocketMQ.

  • Pesan setengah: Pesan setengah adalah pesan yang sementara tidak dapat dikirim. Jika produsen mengirim pesan ke broker ApsaraMQ for RocketMQ, tetapi broker tidak menerima pengakuan kedua (ACK) dari produsen, pesan tersebut ditandai sebagai "sementara tidak dapat dikirim". Pesan dalam keadaan ini disebut pesan setengah.ApsaraMQ for RocketMQ

  • Pemeriksaan status pesan: Pengakuan kedua untuk pesan transaksional mungkin hilang jika terjadi gangguan jaringan sementara atau aplikasi produsen di-restart. Ketika broker ApsaraMQ for RocketMQ menemukan bahwa pesan tetap sebagai pesan setengah untuk waktu lama, broker mengirim permintaan ke produsen untuk memeriksa apakah status akhir pesan adalah Commit atau Rollback.

Manfaat

ApsaraMQ for RocketMQ menggunakan pesan transaksional terdistribusi untuk memisahkan aplikasi dan memastikan konsistensi akhir data. Transaksi besar tradisional dapat dibagi menjadi transaksi yang lebih kecil, meningkatkan efisiensi serta memastikan ketersediaan sistem inti ketika terjadi pengecualian dalam aplikasi. Jika suatu aplikasi tetap tidak dapat menerima pesan, Anda hanya perlu melengkapi atau memperbaiki data untuk aplikasi tersebut tanpa perlu melakukan rollback semua pesan.

Skenario

Ketika pengguna menambahkan item ke keranjang belanja mereka di aplikasi e-commerce, sistem keranjang belanja dan sistem perdagangan terlibat. Pesan transaksional terdistribusi dapat diproses secara asinkron, memastikan konsistensi akhir antara kedua sistem. Dalam skenario ini, sistem perdagangan sangat penting, dan fitur pemrosesan transaksi terdistribusi harus memastikan bahwa pesanan berhasil ditempatkan. Sistem keranjang belanja dapat berlangganan topik terkait pesanan dari ApsaraMQ for RocketMQ dan kemudian menjalankan transaksi yang sesuai. Dengan cara ini, fitur pemrosesan transaksi terdistribusi memastikan konsistensi akhir antara kedua sistem.

Proses interaksi

Gambar berikut menunjukkan proses interaksi pesan transaksional. Transactional messages

Prosedur untuk mengirim pesan transaksional mencakup langkah-langkah berikut:

  1. Produsen mengirim pesan setengah ke broker ApsaraMQ for RocketMQ.

  2. Broker ApsaraMQ for RocketMQ mengonversi pesan menjadi pesan persisten dan mengirim ACK ke produsen untuk mengonfirmasi bahwa pesan telah diterima. Dalam kasus ini, pesan tersebut adalah pesan setengah.

  3. Produsen menjalankan transaksi lokal.

  4. Produsen mengirim ACK kedua ke broker untuk menyerahkan hasil eksekusi transaksi lokal. Hasil eksekusi mungkin Commit atau Rollback.

    • Jika status pesan yang diterima oleh broker adalah Commit, broker menandai pesan setengah sebagai dapat dikirim dan mengirim pesan ke konsumen.

    • Jika status pesan yang diterima oleh broker adalah Rollback, broker melakukan rollback transaksi dan tidak mengirim pesan setengah ke konsumen.

  5. Jaringan terputus atau aplikasi produsen di-restart. Dalam kasus ini, jika broker tidak menerima ACK kedua atau status pesan setengah adalah Tidak Diketahui, broker menunggu beberapa saat dan mengirim permintaan ke produsen dalam kluster produsen untuk memeriksa status pesan setengah.

Langkah-langkah berikut memberikan instruksi untuk memeriksa status pesan transaksional:

  1. Setelah produsen menerima permintaan, produsen memeriksa hasil eksekusi transaksi lokal yang sesuai dengan pesan setengah.

  2. Produsen mengirim ACK lain ke broker ApsaraMQ for RocketMQ berdasarkan hasil eksekusi transaksi lokal. Kemudian, broker memproses pesan setengah sesuai dengan Langkah 4.

Catatan penggunaan

Aturan untuk mengirim pesan

  • Ketika produsen mengirim pesan ke broker dan menjalankan transaksi lokal, salah satu status berikut dikembalikan dalam metode execute:

    • TransactionStatus.CommitTransaction: Transaksi dikomit. Konsumen dapat mengonsumsi pesan.

    • TransactionStatus.RollbackTransaction: Transaksi di-rollback. Pesan dibuang dan tidak dapat dikonsumsi.

    • TransactionStatus.Unknow: Transaksi dalam keadaan tidak diketahui. Setelah beberapa saat, broker ApsaraMQ for RocketMQ mengirim permintaan untuk memeriksa status pesan.

  • Anda harus menentukan kelas implementasi metode LocalTransactionChecker ketika membuat produsen pesan transaksional dengan memanggil ONSFactory.createTransactionProducer. Dengan cara ini, broker dapat memeriksa status pesan transaksional jika terjadi pengecualian.

  • Aturan untuk memeriksa status pesan: Setelah transaksi lokal dieksekusi, broker ApsaraMQ for RocketMQ menerima ACK yang menunjukkan bahwa hasil eksekusi adalah TransactionStatus.Unknow, atau produsen keluar secara tak terduga dan tidak menyerahkan hasil eksekusi transaksi lokal. Dalam kasus ini, broker ApsaraMQ for RocketMQ mengirim permintaan ke produsen untuk memeriksa hasil eksekusi transaksi lokal. Jika broker gagal mendapatkan hasilnya, broker mengirim permintaan pada interval tertentu.

    • Interval pemeriksaan: Secara default, broker mengirim permintaan setiap 30 detik selama 12 jam untuk memeriksa status pesan setengah.

    • Waktu tunggu sebelum memeriksa status pesan setengah yang baru diterima: Parameter ini ditentukan oleh pengguna. Ketika broker perlu memulai pemeriksaan status pesan berkala, tetapi waktu tunggu sebelum status pesan setengah yang baru diterima belum berakhir, broker tidak memeriksa status pesan tersebut.

      Java digunakan dalam contoh berikut. Pengaturan ini menunjukkan bahwa waktu tunggu sebelum status pesan setengah yang baru diterima diperiksa adalah 60 detik.

      Message message = new Message();
      message.putUserProperties(PropertyKeyConst.CheckImmunityTimeInSeconds,"60");
      Catatan

      Namun, waktu aktual sebelum status pesan yang baru diterima diperiksa adalah 0 hingga 30 detik lebih lambat dari waktu yang diharapkan. Hal ini karena broker memeriksa status pesan pada interval default.

      Sebagai contoh, jika Anda mengatur waktu tunggu sebelum status pesan yang baru diterima diperiksa menjadi 60 detik, tetapi broker memulai pemeriksaan berkala pada detik ke-58 setelah pesan setengah baru diterima, pesan tersebut tidak diperiksa. Setelah 30 detik, broker memulai pemeriksaan berkala lainnya pada detik ke-88 setelah pesan setengah baru diterima. Dalam kasus ini, pesan tersebut diperiksa. Waktu ketika pesan diperiksa adalah 28 detik lebih lambat dari waktu yang diharapkan.

Aturan untuk mengonsumsi pesan

  • Pesan transaksional tidak dapat berbagi ID grup dengan pesan jenis lain. Perbedaan antara pesan transaksional dan pesan jenis lain adalah bahwa pesan transaksional menyediakan mekanisme pemeriksaan status pesan. Broker ApsaraMQ for RocketMQ dapat meminta produsen pesan berdasarkan ID grup.

Contoh kode

Contoh kode dalam berbagai bahasa pemrograman untuk mengirim dan berlangganan pesan transaksional disediakan dalam topik berikut: