Chào mọi người
Mình đang có một hệ thống gửi mail, dùng winservice (đang để trên server 1, cứ 3s chạy 1 lần) lấy dữ liệu trong database để gửi mail đến người nhận, sau khi gửi thì update trạng thái gửi từ 0 -> 1(Mỗi lần lấy 30 dòng, dùng Parallel
để chạy).
Hiện tại hệ thống vẫn đang chạy tốt, tuy nhiên gần đây nhu cầu gửi mail tăng cao nên mình muốn clone cái service đó lên server 2 và server 3 (nếu sau này tăng trưởng mạnh hơn có thể sẽ clone ra 4 con server khác) để tăng performance của hệ thống.
Tuy nhiên nếu clone ra như vậy sẽ gặp trường hợp 1 con server bất kỳ nào vào lấy thông tin để gửi nhưng chưa kịp update trạng thái gửi về bằng 1 thì server khác đã vô lấy đúng thông tin row đó để gửi tiếp, dẫn đến 1 khách hàng nhận đến 2 mail
Hiện tại mình đang có 2 hướng xử lý như sau:
-
Tạo thêm 1 colum flag, khi 1 server vô database lấy lên 30 dòng thì ngay lập tức update cột falg lên 1 để các server khác thấy và ko lấy các dòng có falg =1. Tuy nhiên mình sợ nếu sau này số lượng server tăng thì chưa kịp cập nhật flag =1 thì đã có server khác vô lấy dòng đấyđể gửi mail => vẫn bị trùng
-
Vẫn tạo thêm cột flag (1,2,3 tương ứng với số server chạy service), nhưng là để đánh dấu cho từng con server, server nào thì chạy vào lấy đúng flag của server đó để gửi. Cách này mình thấy ổn, chạy độc lập ko dẫm chân nhau nhưng nếu server nào bị lỗi thì các dữ liệu thuộc flag của server đấy cũng sẽ ko đc xử lý
Nhờ mọi người nhận xét hoặc có giải pháp nào hay hơn góp ý giúp mình với nhé
Mình cám ơn ạ