Cậu cần transaction để làm việc này.
Mô tả ngắn gọn của nó như thế này:
- Tạo 1 transaction, trong đó lưu/sửa dữ liệu vào database và gọi tới 3rd party API để cập nhật dữ liệu.
- Nếu việc lưu/sửa dữ liệu trên DB thất bại => cậu khỏi cần gọi 3rd party API.
- Nếu việc lưu/sửa dữ liệu trên DB thành công:
- Nếu 3rd party API trả về lỗi, cậu rollback transaction tùy theo ý nghĩa của mã lỗi mà bên API trả về.
- Nếu 3rd party API bị timeout, cậu có 2 lựa chọn, hoặc gọi 3rd party API rollback transaction bên họ (nếu họ có support), hoặc cậu đưa ra alert và thực hiện manual operation nếu cần thiết (lựa chọn này tốt hơn, vì khi bên cậu bị timeout 1 lần, lần tiếp theo gọi khả năng cao vẫn bị timeout). Cả 2 lựa chọn đều theo sau với việc rollback transaction bên cậu.
- Nếu 3rd party API báo thành công, commit transaction bên cậu.
Nếu như cậu không có yêu cầu quá nghiêm ngặt về mặt thời gian đồng bộ, cũng như không quá khắt khe việc phải rollback transaction bên cậu nếu bên 3rd party thất bại trong việc lưu model, cậu cũng có thể cân nhắc asynchronous operation:
- Cậu lưu database bên mình trước, và đưa 1 message vào message queue để đánh dấu task đồng bộ với 3rd party API.
- Worker bên cậu sẽ nhặt message từ message queue, và thực hiện gọi tới 3rd party API để đồng bộ dữ liệu.
Cậu nên design hệ thống worker này sao cho cậu có thể thực hiện việc retry message vài lần, trước khi đưa ra alert để manual operation.
Về cơ bản, đồng bộ dữ liệu kiểu này không thể tránh được manual operation, đặc biệt trong TH cậu gặp vấn đề về network. Do đó, cậu sẽ thấy cả 2 cách đều chừa ra TH đó.
Hope it helps!