Em đang thử build một Web chat sử dụng Spring Webflux và WebSocket, nhưng đang vướng một vài vấn đề về bộ nhớ.
Khi em sủ dụng WebSocket trong Webflux thì có sử dụng Sinks.Many để lưu lại sự kiện sau đó sẽ gửi tới những người đã đăng ký những sự kiện mới. Có một vấn đề ở đây là khi em chạy stress tess tầm 2000 kết nối trong vòng 1 phút chương trình thì lượng RAM bị tiêu thụ rất lớn, ngay cả khi không còn connection nào được kết nối cả. Sau đó một khoảng thời gian thì lượng RAM lại được giảm khá nhiều.
VD:
– Lúc bắt đầu chạy: 161 MB
Stress test lần 1:
– Sau khi có 2000 kết nối: 854 MB
– Khi không còn kết nối nào: 592 MB
Stress test lần 2:
– Tiếp tục 2000 kết nối: 592 MB -> 1290 MB
– Khi không còn kết nối nào: 1012 MB
Sau tầm 15-20 phút thì lượng RAM giảm về 686 MB
Còn một điều nữa là mặc dù không có kết nối nào, nhưng RAM vẫn cứ tăng nhẹ 0,1MB/1s sau khi stress test(đóng hết kết nối và server vẫn chạy)
Dưới đây là đoạn code của em. Không biết có cách nào để giải phóng RAM khi các kết nối đã ngắt không ạ?
Em xin đặt code ở link dưới cho nó dễ nhìn ạ
Link code
Để anh dựng thành chương trình rồi chạy đã em nhé, việc này sẽ tương đối mất thời gian em ạ
Em cảm ơn anh rất nhiều ạ. Em vừa bổ sung thêm câu hỏi để anh có thể dễ hình dung.
Anh thử trên máy anh chạy bình thường em ạ: https://github.com/tvd12/java-examples/tree/master/spring-websocket
Em cảm ơn project của anh ạ. Anh có gợi ý nào cho em trong việc xây dựng Web chat sử dụng Webflux không ạ?
anh thì không thể khuyên em được, nhưng với cá nhân anh thì anh sẽ không dùng webflux và websocket của spring, vì bản chất nó cũng đi wrap lại các thư viện khác thôi chứ nó chẳng làm gì hơn cả, các vấn đề của socket vẫn còn nguyên và chưa được giải quyết triệt để.
Em xin cảm ơn sự chia sẻ của anh. Chúc anh buổi tối tốt vui vẻ ạ