Praktik terbaik untuk menangani komunikasi antar asinkron?

10

Baru-baru ini menyelesaikan sebuah proyek untuk menangani pemrosesan kartu kredit. Salah satu kesulitan yang saya hadapi adalah menangani keterlambatan / kemungkinan kegagalan pesan notifikasi. Contoh paling kompleks adalah:

  • sistem eksternal mengirimkan permintaan pembayaran
  • sistem saya mengubah permintaan itu menjadi permintaan ke gateway pembayaran
  • mengirim pengguna ke gateway
  • menunggu pengguna untuk melakukan pembayaran
  • pengguna kembali ke sistem saya tetapi ditahan sampai sistem menerima pemberitahuan keberhasilan / kegagalan
  • Mengirim pengguna kembali ke sistem eksternal tergantung pada kegagalan

Yang lebih sulit adalah kenyataan bahwa setelah gagal mengirim notifikasi, gateway mencoba mengirim notifikasi setiap 15 menit selama beberapa jam.

Saya memecahkannya menggunakan catatan basis data dari transaksi yang tertunda dan kemudian mendeteksi keberhasilan dan kegagalan dari pengembalian ditambah pendengar waktu yang terlambat untuk pemberitahuan dan penanganan transaksi ...

Sangat sulit!

Tapi ini pasti sudah dipecahkan trilyun kali sebelum jadi apa praktik terbaik?

Saya bisa melihat masa depan saya akan menulis penanganan antara semua sistem ini dan mengelola penundaan waktu dan kemungkinan kegagalan jaringan, jadi saya ingin mengikuti praktik terbaik.

Rekomendasi buku / artikel akan sangat bagus.

Terima kasih sebelumnya!

pengguna86928
sumber

Jawaban:

13

Ketika membangun sistem terdistribusi, perbedaan antara sistem 'sinkron' dan sistem 'asinkron' adalah sebagai berikut: Sistem sinkron telah mengetahui batas atas pada waktu penghitungan dan pengiriman pesan. Jadi: Anda memiliki sistem asinkron di mana peristiwa-peristiwa tertentu tidak memiliki batas atas yang diketahui ini. Bagaimana kamu menanganinya?

  1. Jika proses asinkron ini memiliki batas atas probabilistik maka Anda dapat menggunakan batas waktu untuk membuat sistem Anda bertindak seperti sistem sinkron parsial . Jika waktu respons persentil ke-98 gateway pembayaran adalah 5 detik, maka batas waktu 5 detik akan membuat 98% permintaan Anda berhasil dan 2% lainnya hanya akan gagal. Ini berarti bahwa Anda sekarang memiliki batas atas yang diketahui tentang berapa lama proses ini akan berhasil atau gagal. Deteksi kegagalan probabilistik ini adalah alat penting untuk mengubah sistem asinkron menjadi sistem sinkron.

  2. Simpan catatan yang tahan lama dari peristiwa ini sehingga Anda dapat memulihkan kondisi sistem Anda jika terjadi kegagalan sistem. Jika pengendali gateway pembayaran Anda menyimpan peristiwa-peristiwa ini dalam memori yang tidak menentu dan crash maka Anda kacau.

  3. Setiap transaksi yang kompleks pada dasarnya adalah serangkaian transformasi negara berdasarkan pengiriman dan penerimaan pesan (peristiwa) dalam sistem. Sepertinya Anda memodelkan ini secara informal menggunakan "catatan transaksi yang tertunda", tetapi saya sarankan Anda melangkah lebih jauh: Untuk setiap transaksi yang perlu Anda kelola, buat mesin keadaan formal yang menggambarkannya dan simpan catatan yang tahan lama dari kondisi saat ini . Anda akan menemukan bahwa mesin negara ini mudah dipahami, mudah diuji, dan memberikan visibilitas yang sangat dibutuhkan ke dalam proses ini baik untuk Anda dan pengguna Anda.

Semakin asinkron sistem Anda, semakin formal dan eksplisit yang Anda perlukan saat mengelola transformasi keadaan kompleks yang terjadi. Waktu tunggu, pencatatan kejadian yang tahan lama, dan mesin negara adalah praktik terbaik di sini. Inilah sebabnya mengapa Erlang OTP mendasarkan banyak perilaku aplikasinya pada model mesin negara, misalnya.

Sebagai referensi, saya belum menemukan yang lebih baik daripada Pengantar Pemrograman Terdistribusi yang Aman dan Andal . Ini akan memberi Anda dasar algoritmik yang kuat untuk memahami sistem sinkron dan asinkron dari prinsip pertama.

Rein Henrichs
sumber