Đồng bộ database khi có 2 bên cùng xử lý dữ liệu

Chào các bác, em gặp một trường hợp như sau:

đầu tiên nhận 1 hồ sơ em sẽ lưu hồ sơ ở db 1
sau đó gửi qua một bên khác, họ sẽ lưu ở db 2
tuy nhiên khi gửi thì nhiều lúc api của bên khác bị lỗi nên sẽ gặp tình trạng dữ liệu 2 bên không đồng nhất

mong các bác tư vấn ạ

Theo như mình hiểu câu hỏi của bạn là:

  • User sử dụng API để POST dữ liệu
  • Dữ liệu POST sẽ được xử lý và save vô database_01, đồng thời cũng gửi POST request qua bên nào đó để save vô database_02
  • Save database_01 xong sẽ response cho user là xử lý xong

Nếu mình hiểu đúng, thì khi user gửi call API để gửi data lên, bạn chỉ cần check status (check cái gì cần check) của data ở database 1 và database 2 là xong. Nếu ok thì process tiếp, nếu không ok thì response về cho user biết tình trạng là xong.

Theo mình là cái này là vấn đề của business analyst (quy trình) chứ không phải vấn đề kỹ thuật.

4 Likes

Kiêu bên kía sữa nêú lỗi bên đó.
Thêm retryfunction nếu bị lỗi network… thử call 3 lần nếu call không ok thì lưu thông tin fail lại cho record đó để có thể chạy lại khi cần thiết.

3 Likes

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!

5 Likes

dạ em cảm ơn bác <3 bác hướng dẫn hi tiết quá ạ

1 Like

dạ em cảm ơn bác nhiều ạ

1 Like

em cảm ơn bác nhiều nhé

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?