@yuisofull chỗ này thì có 2 cái limit, 1 là số opened file, 2 là số ephemeral port của haproxy khi trỏ tới 1 ip + port backend. Nên để tăng số lượng ws connection thì ngoài việc cấu hình lại opened file và ephemeral port range thì nếu full sẽ cần 1 là thêm backend server, 2 là thêm IP cho con HAproxy để có thể mở nhiều connection hơn.
cho mình hỏi là 1 proxy server hay 1 backend server cũng có số port giới hạn, vậy muốn mở nhiều websocket connection thì phải có nhiều proxy server và backend server nhỉ
được bạn. mục đích của mapping tự động là đỡ phải viết code thủ công. ví dụ bạn có 5 lớp thì sẽ rất tốn thời gian để (.setOne, .setTwo) và dễ gây nhầm lẫn.
vì đây là bài hướng dẫn cơ bản nên mình không thêm các chi tiết đó vào. Bạn xem phầm mapping có phần map từ dto sang entity. thì id của dto sẽ không được mapping qua. và còn một số tính năng như mapping với tùy chọn tên trường giữa 2 bảng khác nhau. mapping từ id sang class của một thực thể. Ví dụ Category và product và mỗi cái đều có dto -> có 4 class. ở productId bạn chỉ lưu id của category thôi. thì bạn vẫn mapping từ ProductDto(name, price, categoryId) sang một thực thể product với category đúng của nó. Và còn nhiều tính năng hay ho hữa + lý do dùng Mapstruct là hiệu suất của nó nhanh trong top 2. so với các các lib mapping khác như ModelMapper (tuy nhiên modelMapper dễ dùng hơn). Nhưng quan trọng nhất là chúng ta nên biết mấy món đồ chơi này dùng thế nào. chứ không thì viết bằng tay cho chắc nhé.
lỗi của bạn như kia là ko kết nối được tới reverb luôn ấy:
check lại cấu hình nginx đoạn location của reverb nhé
check docker compose xem service reverb đã lên chưa? check logs của nó xem có lỗi ko?
như trong bài mình note, ở lần start đầu tiên, lúc chưa có DB, reverb nó có thể gặp lỗi vì nó cố gắng connect tới db ngay khi start, vậy nên sau khi bạn chạy migrate --seed thì có thể bạn sẽ cần docker compose down rồi up lại nha
Bài viết hay quá!
Mình cũng đã update giá trị cho file .env như sau:
VITE_REVERB_PORT=8000
VITE_REVERB_PATH="/reverb"
Nhưng có vẻ websocket vẫn không kết nối và update real time được.
Mình thấy biến VITE_REVERB_APP_KEY có dùng trong reverb nhưng trong file .env vẫn đang set giá trị là "my-app-key".
Bạn cho mình hỏi có cần update giá trị cho biến VITE_REVERB_APP_KEY ko ạ?
@dieptv_dev Các thông tin và giải pháp đưa ra cần phải chính xác. Sẽ có nhiều bạn đọc bài viết này và với các bạn mới, có thể sẽ định hướng sai và ghim vào đầu những ý tưởng không đúng.
Kiến thức đơn thuần chỉ là đúng - sai. Trong môi trường chia sẻ kiến thức mong bạn hiểu cho những phản biện này.
sharding theo user_id có đúng không? shard có giới hạn của nó còn user_id thì quá nhiều.
Vụ lưu bản sao thì không đúng. Các hệ thống ổ cứng tự nó có giải pháp Raid để backup rồi. Người ta chỉ clone data theo region để tối ưu tốc độ truy cập thôi.
DB thiết kế quá sơ sài và không đúng. Cốt lõi trong Social network là các post. news feed cũng là các post. img - user - follower nó còn thiển cận quá.
Thiết kế newsfeed cũng quá sơ sài, không ý nghĩa gì. Newsfeed là phần khó nhất cả về thuật toán lần hiệu năng. Một câu hỏi đơn giản như là làm sao để tin lên newsfeed không bị lặp lại cũng đau đầu rồi. (Youtube làm vụ này rất dở, xem bị lặp suốt).
Nói chung, đặt yêu cầu 500tr người dùng là quá lớn. Với cỡ đó thì chỉ cần đi vào giải quyết 1 vde trong đấy là đủ, 1 bài thế này quá loãng và ít thông tin. Đơn giản như photo_id cũng tốn không ít giấy mực rồi.
THẢO LUẬN
Dạ đúng rồi. Cảm ơn b nhiều ạ
Co đc dùng thử k bạn nhỉ, hay dùng thì mất phí từ đầu luôn?
chí mạng luôn bro ạ 😂
@yuisofull chỗ này thì có 2 cái limit, 1 là số opened file, 2 là số ephemeral port của haproxy khi trỏ tới 1 ip + port backend. Nên để tăng số lượng ws connection thì ngoài việc cấu hình lại opened file và ephemeral port range thì nếu full sẽ cần 1 là thêm backend server, 2 là thêm IP cho con HAproxy để có thể mở nhiều connection hơn.
cho mình hỏi là 1 proxy server hay 1 backend server cũng có số port giới hạn, vậy muốn mở nhiều websocket connection thì phải có nhiều proxy server và backend server nhỉ
được bạn. mục đích của mapping tự động là đỡ phải viết code thủ công. ví dụ bạn có 5 lớp thì sẽ rất tốn thời gian để (.setOne, .setTwo) và dễ gây nhầm lẫn. vì đây là bài hướng dẫn cơ bản nên mình không thêm các chi tiết đó vào. Bạn xem phầm mapping có phần map từ dto sang entity. thì id của dto sẽ không được mapping qua. và còn một số tính năng như mapping với tùy chọn tên trường giữa 2 bảng khác nhau. mapping từ id sang class của một thực thể. Ví dụ Category và product và mỗi cái đều có dto -> có 4 class. ở productId bạn chỉ lưu id của category thôi. thì bạn vẫn mapping từ ProductDto(name, price, categoryId) sang một thực thể product với category đúng của nó. Và còn nhiều tính năng hay ho hữa + lý do dùng Mapstruct là hiệu suất của nó nhanh trong top 2. so với các các lib mapping khác như ModelMapper (tuy nhiên modelMapper dễ dùng hơn). Nhưng quan trọng nhất là chúng ta nên biết mấy món đồ chơi này dùng thế nào. chứ không thì viết bằng tay cho chắc nhé.
Mình vừa đăng ký trên Locker nhưng ko thấy có bảng giá. Mình dùng dự án cá nhân có 1 dev là mình thôi.
VITE_REVERB_APP_KEY giữ mặc định nhé bạn,
lỗi của bạn như kia là ko kết nối được tới reverb luôn ấy:
như trong bài mình note, ở lần start đầu tiên, lúc chưa có DB, reverb nó có thể gặp lỗi vì nó cố gắng connect tới db ngay khi start, vậy nên sau khi bạn chạy
migrate --seedthì có thể bạn sẽ cầndocker compose downrồiuplại nhaVới điều kiện bạn thấy lead của bạn đủ thân nhé
Bài viết hay quá! Mình cũng đã update giá trị cho file .env như sau:
Nhưng có vẻ websocket vẫn không kết nối và update real time được. Mình thấy biến VITE_REVERB_APP_KEY có dùng trong reverb nhưng trong file .env vẫn đang set giá trị là "my-app-key". Bạn cho mình hỏi có cần update giá trị cho biến VITE_REVERB_APP_KEY ko ạ?
@cuongvnb cần add URL của frontend vào springboot, xem ví dụ http://localhost:4200 là frontend
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration public class WebConfig implements WebMvcConfigurer {
}
Cảm ơn chủ thread có bài viết bổ ích, mình cũng muốn góp 1 chút ạ 🎁
https://drinking-game.web.app/
https://play.google.com/store/apps/details?id=com.stark.drinking
@dieptv_dev Các thông tin và giải pháp đưa ra cần phải chính xác. Sẽ có nhiều bạn đọc bài viết này và với các bạn mới, có thể sẽ định hướng sai và ghim vào đầu những ý tưởng không đúng.
Kiến thức đơn thuần chỉ là đúng - sai. Trong môi trường chia sẻ kiến thức mong bạn hiểu cho những phản biện này.
Bài viết chỉ đưa ra 1 cách suy nghĩ tổng quan về một hệ thống, chứ kp là đưa ra thiết kế chi tiết. Bạn thông cảm
js tự tạo thêm array null cho tới đúng số key id được thêm vào, thật là nguy hiểm
sharding theo user_id có đúng không? shard có giới hạn của nó còn user_id thì quá nhiều.
Vụ lưu bản sao thì không đúng. Các hệ thống ổ cứng tự nó có giải pháp Raid để backup rồi. Người ta chỉ clone data theo region để tối ưu tốc độ truy cập thôi.
DB thiết kế quá sơ sài và không đúng. Cốt lõi trong Social network là các post. news feed cũng là các post. img - user - follower nó còn thiển cận quá.
Thiết kế newsfeed cũng quá sơ sài, không ý nghĩa gì. Newsfeed là phần khó nhất cả về thuật toán lần hiệu năng. Một câu hỏi đơn giản như là làm sao để tin lên newsfeed không bị lặp lại cũng đau đầu rồi. (Youtube làm vụ này rất dở, xem bị lặp suốt).
Nói chung, đặt yêu cầu 500tr người dùng là quá lớn. Với cỡ đó thì chỉ cần đi vào giải quyết 1 vde trong đấy là đủ, 1 bài thế này quá loãng và ít thông tin. Đơn giản như photo_id cũng tốn không ít giấy mực rồi.
Dạ em cảm ơn tác giả của bài viết vì đã bỏ ra nhiều tâm huyết, diễn đạt logic và dễ hiểu lắm ạ
Có web đấy bạn, Locker.io 👍️
Bên này có web hay gì để xem thêm ko b ?