Xây dựng hệ thống website đáp ứng hàng nghìn, trăm nghìn người... như thế nào

Mình làm 1 ứng dụng nhỏ thông thường thì shared host là đủ đáp ứng nhu cầu dù sử dụng gói rẻ tiền
Nhưng khi chuyển qua vps ( mình dùng ubuntu 14 ) thì mình gặp 1 số rắc rối

  1. Kết nối xshell thì bình thường. Kết nối winscp và sqlyog thì rất hay bị hiện tượng mất kết nối phải chờ khoảng 10s mới kết nối lại. Mỗi lần như vậy cộng lại rất tốn time và ức chế. Trong khi sử dụng shared host thì sqlyog không bị mất kết nối bao giờ
  2. Mình thử xây dựng hệ thống live chat. Mặc dù rất ít người dùng như nó làm die ngay server
    Cụ thể mình sử dụng database để làm live chat. php để kết nối đến database. Do ngu học nên mình sleep 2s 1 lần rồi check database xem có tin nhắn mới không thì đẩy về cho người dùng
  • Nhưng máy chủ của mình đã die ngay sau đó. Sau đó mình sửa file php bằng cách thêm vào đầu nhằm vô hiệu hóa file này
    While(true)
    Sleep(100);
    Nhưng hệ thống vẫn không chạy nổi. Cứ 1 lúc là die. Mình nghĩ nếu chỉ sleep cái file php đó thì có ảnh hưởng gì lớn đâu mà khiến die server. Và cách cuối cùng của mình là đổi tên file thì sv lại chạy bình thường
  • Mình thắc mắc là chỉ 1 file php với 2 dòng lệnh với 1 lượng ít kết nối mà làm die server thì có phải là do mình thiếu cài đặt gì cho vps ubuntu không ( mình đã kiểm tra rất kỹ. reboot sv liên tục. chỉ đến khi đổi tên file sv mới hoạt động bình thường )
  • Làm cách nào để winscp và sqlyog không bị đứt kết nối như sử dụng shared host
  • Vấn đề live chat có lẽ nhiều người giỏi lý thuyết nhưng thực hành thì ít người biết. Mình lấy ví dụ điển hình như Zalo không lưu lịch sử tin nhắn như FaceBook. Hoặc đến ngay như ông lớn Skype hồi đầu có xóa tin nhắn cũ hơn 1 tuần và hình như bây giờ không còn hiện tượng xóa nữa
  • Ai có tài liệu gì về việc xây dựng 1 hệ thống lớn không. Xin lỗi vì trình độ hạn hẹp mà mình thích tìm tòi. Mục đích chính của mình cũng chỉ muốn xây dựng 1 cái live chat thôi ( đừng bảo mình dùng api của bên thứ 3 nhé )

không hiểu sao chữ nó bị in đậm. để mh xem chỉnh lại

Vấn đề ở đây là bạn phải dùng công cụ dạng monitor để giám sát xem cái gì đang chạy. Từ đó tìm ra đích xác thủ phạm tiêu tốn tài nguyên server hoặc bị đứt quãng gì đó do tường lửa của nhà cung cấp hosting (phải chỉnh access list, policy, mở port,…) rồi mới tính tiếp.

Bạn xài Ubuntu thì nên khai thác trước hết các lệnh trong bộ net-tools (một package có thể dễ dàng cài đặt với lệnh apt của Ubuntu). Sử dụng các lệnh/ công cụ để xem cái gì đang hoạt động / tình trạng mạng mẽo như netstat, atop, htop, ps, iptables, nmap,… Nếu thích khám phá server thì vọc Nagios.

Việc lý luận “chỉ có thế nọ/ thế kia mà làm die server” có khi nguyên nhân lại nằm ngoài cái file PHP của bạn.

Tiêu đề chủ đề hỏi về hệ thống website, nhưng nội dung lại là ứng dụng chat. Bạn cần làm rõ là bạn đang muốn hỏi cái gì.

Cũng trả lời luôn là bạn làm sao giả lập được 1000 người truy cập vào chatroom trước => từ đó bạn sẽ suy nghĩ tìm ra giải pháp nên làm gì để đáp ứng hàng ngàn người đó.

Hạ tầng của những ứng dụng chat lớn là một kiến trúc được xây dựng khá tốn nhiều chất xám do một nhóm lập trình viên giỏi lập nên. Và thường sử dụng những ngôn ngữ lập trình duyên dụng cho việc gửi message.

Trước khi bắt tay làm hệ thống chat/ tin nhắn lớn, cần phải tham khảo các kiến trúc của WhatsApp, Twitter, Zalo. Người ta có chia sẻ trên mạng chứ không giấu. Còn hệ thống website khủng nói chung, bạn nên tham khảo kiến trúc của StackOverflow.

Nếu vẫn chưa thể tìm được mấy bài chia sẻ về hệ thống mình gợi ý trên, việc bạn cần làm là kỹ năng sử dụng Google và đầu tư thêm chút về tiếng Anh.

Trường hợp bạn nghe những thứ trên mình nói quá rối rắm, phức tạp, tốn thời gian vô kể trong khi đó bạn đơn giản là chỉ muốn làm một hệ thống chat để vọc chơi, cứ tìm kiếm php live chat open source đọc sơ qua phần giới thiệu, thấy cái nào gần gũi với mong đợi bạn nhất mang về, cài vào chạy thử, sau đó đọc tài liệu, nghiên cứu souce code của nó để xem “người ta đã làm điều đó như thế nào?”. Trong quá trình như vậy, bạn sẽ có những phát hiện thú vị, từ đó tìm tòi thêm, cải tiến hoặc đưa ra được cách làm tốt hơn.

Thân ái!

3 Likes

Mình không dùng PHP nhưng có một số vấn đề trong cách xử lý của bạn.
Thứ nhất: Bạn quét database lấy tin nhắn đó không phải là giải pháp cho một ứng dụng có nhiều người truy cập nhất là ứng dụng tin nhắn nó sẽ die nhanh chóng. Bạn hãy tham khảo realtime nhé có thể tham khảo websocket. Sẽ có các giải pháp cho bạn.
Thứ hai nếu bạn muốn sử dụng nhiều người truy cập một trên một port bạn sẽ gặp vấn đề trong việc xử lý luồng. Ở đây nếu bạn dùng một server bạn có thể tham khảo docker + nginx. bạn tách ứng dụng của mình thành các microservice thì sẽ giúp bạn sống được lâu hơn trước khi nghĩ đến việc nhiều server.

1 Like

Tks @mituso. Mình sẽ tìm hiểu thêm

Recommend cho những bạn làm website/app có lượng truy cập lớn:

như này là do lỗi thôi chứ không phải do server overload. Overload bạn check ram với cpu là thấy ngay rồi

Mình dùng lệnh top - c rồi
Cpu thì không over còn Ram quên ko để ý

Hi Rem Nolv
Có vẻ như bạn chưa có nhiều kinh nghiệm trong lĩnh vực này. Tốt nhất nên tìm thêm tài liệu trước tránh mất thời gian.

P/S Số lượng socket giữ kết nối thường rất ít (Vài nghìn kể cả với Java) nên nếu bạn muốn làm một hệ thống lớn thì cần một team và leader có kinh nghiệm.

1 Like

Nếu ứng dụng nhỏ thì xài NodeJS + socketio + mongodb.

Nếu lớn hơn bạn sẽ phải giải quyết nhiều trường hợp khác nhau, như: mất connection, load balancing, distributed systems,… Lúc đó bạn có thể cân nhắc sử dụng framework khác, có 2 framework mình khuyến khích. Vì mục đích của nó là giải quyết vấn đề real-time communication, và case study họ ví dụ luôn là voice app hoặc chat app.

Erlang/OTP

Scala/Akka: https://akka.io


Về database, mình khuyến khích sử dụng Cassandra hoặc AWS DynamoDB, vì nó thoã mãn Availability và Partition tolerance trong CAP theorem

Có thể còn DB khác nhưng hiện tại mình chỉ biết có 2 DB đó thôi.


Một số kĩ thuật đằng sau WhatApps
https://www.quora.com/What-technology-is-used-in-WhatsApp

2 Likes

hix, sao dao to búa lớn thế, bạn vào trang chat của mình vibigaba.esy.es nghiên cứu thử xem có thích không? Nó chỉ là codeigniter + firebase:rofl:
ps : Các bạn vào đông đông tí cho nó ngủm luôn đi mình đang lên phương án làm lại cái mới

Bạn có thể tham khảo cái này https://github.com/donnemartin/system-design-primer
Trong đó có vài giải pháp đã được hướng dẫn sẵn, bạn có thể xem xét áp dụng

2 Likes

Hý hý thanh kiu các bạn. Mình đã thử và thành công với websocket khi làm live chat
Có thể do nhiều người connect mà hàm sleep của php dẫn đến số kết nối tối đa

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?