thảo luận Triển khai microservice cho backend springboot

  • Người tạo chủ đề Người tạo chủ đề Hero Kun
  • Ngày bắt đầu Ngày bắt đầu
ứng dụng có vài ngàn ccu đã.

rồi nghĩ đến bài toán vào chuc, trăm nghìn ccu.

Cái văn mở đầu là nghĩ đến bài toán vài chục triệu user là dự án đó fail chắc
Ko ý mình đang hỏi về kiến trúc của socketio là có phải nó ngậm slot hay port gì của máy chủ ko á
 
Ko ý mình đang hỏi về kiến trúc của socketio là có phải nó ngậm slot hay port gì của máy chủ ko á

Cái này ko rõ lắm, nhưng nghi ngờ là ăn RAM thôi. Nên nếu là mình thì scale out ra chắc ổn.

Trước chạy ứng dụng cho vài k ccu trên socket.io vẫn ngon lành. Mặc dù bắn tứ tung cả multi device các thứ.
 
Bác có hiểu biết gì về performance của socket ko
Kiểu như với ứng dụng vài k vài chục k user thì k sao nhưng lên tới hàng triệu chục tr user thì server nó đáp ứng nổi k nhỉ, vì e hiểu socket nó chỉ có số slot nhất định
Đọc các bài C10K và xem họ giải thích sẽ hiểu hơn.

Về tạo socket có tốn tài nguyên không thì câu trả lời chắc chắn là có.

Trong Java có BlockingIO và NIO vậy ví dụ với websocket đi:

BockingIO: Sử dụng 1thread/connection => 1tr thread thì riêng Mem cho bộ nhớ đã là 1GB rồi chưa tính đến mem cho các phần xử lý khác.

NIO: Với NIO thì mỗi connection thì nó đơn giản chỉ là Object MetaData

Mã:
public class Connection {
       Reader r;
       Writer w;
}

Nhiều connection có thể được xử lý bởi 1 thread được gọi là IO thread hoặc EventLoop thread. Với websocket việc kết nối phải giữ liên tục nhưng dữ liệu trao đổi không nhiều thì NIO đặc biệt hiệu quả. Để dễ hiểu thì IO thread sẽ foreach qua List Connection và check Reader.hasData() thì xử lý còn không thì đi tiếp.

Vậy với NIO thì có thể dùng websocket để xử lý vài triệu connection ok, nhưng về tổng thể ứng dụng thì còn nhiều vấn đề khác nữa.
 
Đọc các bài C10K và xem họ giải thích sẽ hiểu hơn.

Về tạo socket có tốn tài nguyên không thì câu trả lời chắc chắn là có.

Trong Java có BlockingIO và NIO vậy ví dụ với websocket đi:

BockingIO: Sử dụng 1thread/connection => 1tr thread thì riêng Mem cho bộ nhớ đã là 1GB rồi chưa tính đến mem cho các phần xử lý khác.

NIO: Với NIO thì mỗi connection thì nó đơn giản chỉ là Object MetaData

Mã:
public class Connection {
       Reader r;
       Writer w;
}

Nhiều connection có thể được xử lý bởi 1 thread được gọi là IO thread hoặc EventLoop thread. Với websocket việc kết nối phải giữ liên tục nhưng dữ liệu trao đổi không nhiều thì NIO đặc biệt hiệu quả. Để dễ hiểu thì IO thread sẽ foreach qua List Connection và check Reader.hasData() thì xử lý còn không thì đi tiếp.

Vậy với NIO thì có thể dùng websocket để xử lý vài triệu connection ok, nhưng về tổng thể ứng dụng thì còn nhiều vấn đề khác nữa.
Nếu mà sau này có loom thì mem nhẹ gánh hơn không thím?
 
vâng ạ. việc tạo ra trang đăng nhập ko có gì khó khăn ạ. em đang gặp cái vấn đề là khi đăng kí thành công tài khoản thì Keycloak trả về cho springboot là thông tin user nhưng ko chưa token. Hiện cái project của em thì có 2 chat-service và social-service cần sử dụng id của user. em có hai cách giải quyết như này ạ.
1.vì vậy sau khi tạo thành công user thì em lại call api sang api của chat-service và social-service
=> cần token của Keycloak trả vể=> có thể gọi api lấy token về nhưng hơi dài.
2. Dùng kafka bắn sang => em muốn thử nhưng lại mất nhiều time và máy chạy nhiều chậm máy

Nếu lúc tạo thành công tài khoản nhận luôn token thì bắn id sang chat-service và social-service.
Tạo tài khoản xong bạn có user/pass thì bạn call thêm hàm login keycloak nó trả về cho token .
Ngoài socketio có thằng pubnub performance ngon hơn , mỗi tội mất tiền .
 
Tạo tài khoản xong bạn có user/pass thì bạn call thêm hàm login keycloak nó trả về cho token .
Ngoài socketio có thằng pubnub performance ngon hơn , mỗi tội mất tiền .
em cũng làm lấy token sau đó gửi sang service khác rồi bac. ko biết có custom để ẩn danh đối phương hoặc chat ramdom được ko bác nhỉ.
 
ah, mình muốn làm ứng dụng kiểu hẹn hò. thằng server tạo kết nối map random(user ẩn danh) để hai người có thể nói chuyện mà ko sợ lộ thông tin đó bạn.
Thì cái này lqan j tới keycloak đâu ? Do code xử lý ko show thông tin ra là được :amazed:
 
Thì cái này lqan j tới keycloak đâu ? Do code xử lý ko show thông tin ra là được :amazed:
uhm, thì hai cái đó ko liên quan mà. mình code phần tin nhắn chạy ổn rồi. cảm ơn bác nhé để em test xem tin nhắn thằng pubnub performance ntn.hehe
 
mình quản lý tập trung bạn ah, mình chôm trên mạng thấy cái mô hình này khá ổn. và đang phân vân lúc client tạo user mới nên gọi api của keycloak hay là làm thêm một service kết nối với keycloak . Xem tệp đính kèm 1736419
Tôi khuyên nên làm thêm cái service của mình để gọi API của keycloak nhé.

Quản lý user của keycloak tương đối tù, dùng service của mình sẽ linh hoạt hơn. Ngoài ra có thể có nhiều thông tin hơn về user mình cần quản lý mà không có sẵn trong keycloak. Keycloak có hỗ trợ ở mức nào đó các extra field nhưng dùng bí bách lắm.
 
Tôi khuyên nên làm thêm cái service của mình để gọi API của keycloak nhé.

Quản lý user của keycloak tương đối tù, dùng service của mình sẽ linh hoạt hơn. Ngoài ra có thể có nhiều thông tin hơn về user mình cần quản lý mà không có sẵn trong keycloak. Keycloak có hỗ trợ ở mức nào đó các extra field nhưng dùng bí bách lắm.
Thím nêu các usecase mà keycloak không có sẵn được ko, em cũng đang tham khảo để dùng keycloak xem sao
 
Tôi khuyên nên làm thêm cái service của mình để gọi API của keycloak nhé.

Quản lý user của keycloak tương đối tù, dùng service của mình sẽ linh hoạt hơn. Ngoài ra có thể có nhiều thông tin hơn về user mình cần quản lý mà không có sẵn trong keycloak. Keycloak có hỗ trợ ở mức nào đó các extra field nhưng dùng bí bách lắm.
hiện tại mình chỉ dùng service của keycloack lấy token thôi. còn những thông tin của user mình lưu trong db spring để quản lý cho tiện.
 
Thím nêu các usecase mà keycloak không có sẵn được ko, em cũng đang tham khảo để dùng keycloak xem sao
Dùng keycloak để auth thôi, như thím dưới là chỉ lấy token còn ko nên dùng thêm cái gì khác kể cả có vẻ như được keycloak support.
hiện tại mình chỉ dùng service của keycloack lấy token thôi. còn những thông tin của user mình lưu trong db spring để quản lý cho tiện.
Đó, thì thím đang dùng service của mình để gọi keycloak rồi đấy chứ có dùng keycloak để quản lý user của mình đâu.

Mà nếu thím đang dùng spring rồi, nhu cầu không nhiều thì build luôn 1 con auth server đi hoặc nhúng vào user service của thím. Spring hỗ trợ tận răng rồi https://docs.spring.io/spring-authorization-server/docs/current/reference/html/index.html
 
Dùng keycloak để auth thôi, như thím dưới là chỉ lấy token còn ko nên dùng thêm cái gì khác kể cả có vẻ như được keycloak support.

Đó, thì thím đang dùng service của mình để gọi keycloak rồi đấy chứ có dùng keycloak để quản lý user của mình đâu.

Mà nếu thím đang dùng spring rồi, nhu cầu không nhiều thì build luôn 1 con auth server đi hoặc nhúng vào user service của thím. Spring hỗ trợ tận răng rồi https://docs.spring.io/spring-authorization-server/docs/current/reference/html/index.html
Vâng ạ, em cảm ơn bác. hiện tại em đang dùng tạm thằng KeyCloack thấy nó khá hay chỉ dùng cái giao diện để thằng Ad quản lý user và client lấy token bác ah. còn nhưng cái khác thì em lưu tại server springboot. hơn nữa em ko rành code frontend nên code để quản lý usẻ thì không biết khi nào xong ạ.
 
chủ thớt làm xong chưa, em xin tí kinh nghiệm với, em đang làm project với tech như của bác
 

Thống kê chủ đề

Ngày tạo
Hero Kun,
Người trả lời cuối
thieugiatri4492,
Trả lời
146
Lượt xem
17.523
Quay lại
Lên đầu trang