2011-11-17 4 views
5

Tôi có một ứng dụng đang chạy với:Có phải nginx/node.js/postgres là một kiến ​​trúc có khả năng mở rộng không?

  • một ví dụ của nginx như front-end (phục vụ tập tin tĩnh)
  • một cụm ứng dụng Node.js cho backend (sử dụng cụm và expressjs module)
  • một ví dụ của Postgres như DB

là kiến ​​trúc này đủ nếu ứng dụng cần khả năng mở rộng (điều này chỉ cho HTTP/yêu cầu REST) ​​cho:

  • 500 yêu cầu mỗi giây (mỗi yêu cầu chỉ tìm nạp dữ liệu từ DB, những dữ liệu đó có thể là một số ko và không cần tính toán lớn sau khi tìm nạp).

  • 20000 người sử dụng kết nối đồng thời

đâu có thể là trở ngại?

+0

Bạn đang sử dụng mô-đun nodej nào? Bạn chỉ cần làm HTTP hoặc cũng sử dụng socket.io hoặc dnode hoặc nowjs hay như vậy? – thejh

+0

Tôi chỉ sử dụng nó cho các yêu cầu HTTP/REST. Tôi chủ yếu sử dụng các mô-đun expressjs và cluster node.js. – Luc

+0

Nó phụ thuộc ...Số lượng yêu cầu/giờ, số người dùng hoạt động mỗi giờ, yêu cầu của bạn phức tạp đến mức nào, bạn có đang sử dụng bộ nhớ đệm không, bạn có cơ chế phân vùng dữ liệu hay chỉ một phiên bản DB không? – beny23

Trả lời

4

Đối với tải được chỉ định (500 yêu cầu đơn giản/giây), tôi sẽ không nghĩ rằng đây sẽ là quá nhiều vấn đề. Và dự đoán của tôi là một nhóm các trường hợp nút sẽ không cần thiết.

Tuy nhiên, vì bạn chỉ có một trường hợp duy nhất, khi nói đến mở rộng quy mô, rất có thể sẽ là nút cổ chai của bạn. Bạn cũng gặp vấn đề thêm rằng đây sẽ là điểm thất bại duy nhất của bạn (tôi không quen thuộc với Postgres, ở đây đã làm việc với một cụm Oracle và dataguard có nghĩa là chúng tôi có một cụm cơ sở dữ liệu sao lưu để giảm thiểu điều đó) .

Nếu bạn không yêu cầu mô hình dữ liệu quan hệ, thì MongoDB có thể là lựa chọn có khả năng mở rộng hơn.

Một điều khác cần nhớ là cơ sở hạ tầng mạng của bạn. Nếu bạn định thêm cụm/nút, hãy đảm bảo rằng mạng có thể xử lý tải được phân phối. Một điều cuối cùng: Nói chung, không thể xác định liệu một ứng dụng trên một kiến ​​trúc có thể xử lý một tải cụ thể mà không có kiểm tra hiệu suất/khối lượng/căng thẳng hay không, vì vậy câu trả lời là một "có thể" vang dội.

+0

cảm ơn bạn đã giải thích tốt. Tôi nhớ có một số rắc rối một số lần trước đây khi tôi đã thử Mongo bởi vì tôi đã có mô hình quan hệ trong tâm trí và không thể di chuyển nó để định dạng tài liệu theo định hướng. – Luc

0

Bạn nên ở mức 500 ops/giây. Thiết kế lại nếu bạn mong đợi để đi vào hàng ngàn ops/giây.

Nếu không biết nhiều dữ liệu hơn từ bạn, đĩa I/O sẽ là nút cổ chai của bạn nhiều khả năng nhất. Điều này sẽ xảy ra trong cơ sở dữ liệu PostgreSQL của bạn vào khoảng 10k ops/sec nếu bạn là I/O'ing từ ổ đĩa cứng trên phần cứng chứng khoán và cũng làm chậm nếu bạn đang thực hiện lệnh JOIN trên lệnh SQL. Điều này cũng sẽ làm chậm người dùng đồng thời hơn bạn đang cố gắng truy cập vào một ổ đĩa đơn. Ổ đĩa của bạn tìm kiếm thời gian là sẽ freak ra, như bạn sẽ liên tục được ngẫu nhiên truy cập vào ổ đĩa.

Bạn nên nghiên cứu cấu trúc dữ liệu của mình và nếu cần có cơ sở dữ liệu quan hệ (bạn có phải thực hiện JOIN không?). Một giải pháp noSQL có thể là cách để đi. Luôn luôn cố gắng để có được đĩa I/O của bạn như phân phối và tuần tự càng tốt.