Dùng redis cũng là một ý tưởng tốt em ạ, nhưng dùng redis đúng như em nói khi cluster bị down thì tin nhắn từ server A có thể không broadcast đến B, C được dẫn đến những client kết nối đến B, C không nhận được tin nhắn.
Vậy nên giải pháp đưa ra là tin nhắn vẫn phải được lưu ở trong cơ sở dữ liệu nữa. Khi client kết nối với bất kỳ server nào thì nó sẽ đồng bộ tin nhắn (tính từ tin nhắn cuối cùng mà nó nhận được), server cũng sẽ gửi các tin nhắn cho client tính từ tin nhắn lần cuối nó gửi cho các client, ví dụ:
- Server A: Nhận được tin nhắn thứ 100, nó cần broadcast đến B để gửi cho client X, nhưng cluster down, vậy B sẽ vẫn còn trạng thái là last message id = 99.
- Trường hợp cluster không kịp sống lại và client disconnect sau đó kết nối vào A thay vì B thì client sẽ đồng bộ lại toàn bộ tin nhắn tính từ 99.
- Trường hợp cluster sống lại thì B sẽ lại tiếp tục lấy tin nhắn từ 99 và gửi cho các client bao gồm cà X, client vẫn giữ kết nối đến B nên tiếp tục nhận được tin nhắn.
Nhìn chung vẫn phải kết hợp nhiều thứ chứ không chỉ Redis hay DB là đủ em ạ, DB cung cấp giải pháp lưu trữ bền bỉ, còn redis cung cấp giải pháp thông báo cho các websocket server biết có tin nhắn mới để mà vào DB lấy ra rồi gửi đi và cập nhật trạng thái.