2012-11-13 43 views
6

Giả sử tôi cần triển khai ứng dụng web sẽ có lượng người dùng đồng thời cao. Tôi quyết định sử dụng node.js vì nó có độ phân giải rất tốt, nó có hiệu suất tốt, cộng đồng nguồn mở, v.v. Sau đó, để tránh tắc nghẽn vì tôi có thể có các gazillions của người dùng trong cùng một vòng lặp sự kiện, tôi quyết định sử dụng một cụm các quy trình để tận dụng lợi thế của CPU đa lõi. Hơn nữa, tôi có 3 máy (main + 2) vì tôi cần thao tác dữ liệu lớn với Cassandra. Tuyệt vời, điều này có nghĩa là tôi có các quy trình 3 * n node.js trong đó n là số lõi của cpu (các máy giống nhau).Cách thiết kế máy chủ web node.js phân tán

Ok, sau đó tôi bắt đầu một nghiên cứu và tôi kết thúc với giản đồ sau:

  • Nginx lắng nghe trên cổng 80 và chỉ được sử dụng để phục vụ nội dung tĩnh (img, css, js, vv).
    Chuyển tiếp lưu lượng truy cập động tới haproxy. Tôi biết cách cấu hình nginx nhưng tôi vẫn phải xem xét haproxy, vì vậy tôi sẽ nói rằng haproxy đang lắng nghe trên cổng 4000. Nginx và haproxy được cài đặt trong máy chính (điểm vào).
  • Cân bằng tải Haproxy giữa 3 máy. Nó chuyển tiếp lưu lượng tới cổng 4001, có nghĩa là, các quá trình Node.js đang nghe 4001.
  • Mỗi Node.js đã một cụm của các quá trình n nghe 4001.

Nếu tôi đúng một đơn Yêu cầu http sẽ được chuyển tiếp đến một quá trình node.js duy nhất.

Tạo phiên là khá bình thường, phải không? Một phiên chỉ là một bản đồ, và bản đồ này là một đối tượng, và đối tượng này sống trong một quá trình node.js. Haproxy sẽ được cấu hình với một bộ lập lịch vòng tròn, vì vậy cùng một người dùng có thể được chuyển tiếp đến các tiến trình node.js khác nhau. Làm thế nào tôi có thể chia sẻ cùng một đối tượng phiên trên tất cả các tiến trình node.js? Làm thế nào tôi có thể chia sẻ một đối tượng toàn cầu (điều này bao gồm trong cùng một máy (cụm node.js) và trên mạng)? Tôi nên thiết kế một ứng dụng web phân tán với node.js như thế nào? Có bất kỳ mô-đun nào dễ dàng thực hiện tác vụ đồng bộ hóa không?

+1

haproxy có nhiều cách xử lý các phiên dính, http: // stacko verflow.com/questions/6498030/load-balancing-haproxy-or-other-sticky-sessions. Đối với một đối tượng toàn cầu, sử dụng redis hoặc một cái gì đó. – numbers1311407

+0

Tương tự như http://stackoverflow.com/questions/5398209/scaling-node-js-across-multiple-cores-servers Cũng chỉ có 3 máy chủ. –

Trả lời

1

Bạn có thể sử dụng memcache hoặc redis để lưu trữ đối tượng phiên. Nó khá hữu ích trong trường hợp các quá trình nút khởi động lại (nếu dữ liệu phiên được lưu trữ trong quá trình 'bộ nhớ nó sẽ bị mất).

Ngoài ra, bạn có thể kiểm tra pm2 danh sách tính năng và có thể một số trong số đó sẽ hữu ích cho bạn.

Xây dựng kiến ​​trúc vi dịch vụ sẽ tạo khả năng mở rộng tốt.

1

Như Ivan đã chỉ ra, bạn lưu trữ các đối tượng phiên của bạn trong memcache hoặc redis hoặc thậm chí Couchbase (nhóm memcache). Tôi cũng muốn thêm vào, nếu bạn muốn xây dựng một hệ thống có thể mở rộng, mục tiêu của bạn phải là xây dựng hệ thống theo cách mà bạn có thể mở rộng tuyến tính để tăng thông lượng dựa trên nhu cầu. Theo ý tôi, bạn sẽ có thể thêm nhiều máy chủ hơn bất cứ lúc nào (tốt nhất là trong thời gian cao điểm) đến các tầng khác nhau trong cơ sở hạ tầng của bạn để xử lý các yêu cầu.

Vì vậy, bạn phải rất cẩn thận về công nghệ bạn chọn và các quyết định thiết kế mà bạn thực hiện trong quá trình phát triển.

Giả sử tôi cần triển khai ứng dụng web sẽ có lượng người dùng đồng thời cao.

Một điều tôi muốn thêm, nếu bạn không thể đo lường, bạn không thể quản lý nó. Một khởi đầu tốt sẽ xác định "lượng người dùng đồng thời cao" có nghĩa là gì đối với bạn?Có phải đó là loại facebook hoặc whatsApp của khối lượng/đồng thời không? Xác định những điều này trước tiên bằng cách làm việc với các bên liên quan của bạn (nếu có), sau đó bạn có thể bắt đầu thực hiện các quyết định thiết kế và chọn công nghệ.

Bài kiểm tra ngữ pháp tốt trong khi xây dựng hệ thống có thể mở rộng là tự hỏi: "Có một điểm nào không?" nếu có thì hệ thống của bạn sẽ không mở rộng.

0

Khi người dùng khác đề xuất; sử dụng Redis là một giải pháp hoàn toàn có thể chấp nhận được cho vấn đề này.

Điểm yếu của nó là sử dụng dịch vụ để lưu trữ các đối tượng phiên và để phần mềm trung gian xử lý mọi thứ khác. Như đã đề cập trước đó, nó rất hữu ích trong các trường hợp của quá trình nút khởi động lại, crashing, vv Lưu trữ dữ liệu phiên trong quá trình nút mang rủi ro. Một trong những lợi ích của việc sử dụng các dịch vụ Micro (như Redis), là những rủi ro đó được giảm thiểu.

Giả sử bạn sử dụng Express cho phần mềm trung gian của mình, bạn có thể sử dụng tên gọi là Session store. Có rất nhiều mô-đun tận dụng lợi thế của tính năng này.

Một mô-đun như vậy là connect-redis

Cài đặt dễ dàng như bình thường:

npm install connect-redis express-session 


Sau đó, bạn sẽ sử dụng nó như vậy:

var session = require('express-session') 
var RedisStore = require('connect-redis')(session) 

app.use(session({ 
    store: new RedisStore(options), 
    secret: 'keyboard cat' 
})) 

Bây giờ bạn sử dụng đối tượng session của bạn, giống như bình thường. (req.session)


Ví dụ:

Để thiết lập thông tin phiên (từ một hình thức POST, ví dụ):

req.session.email = req.body.email 


Để lấy thông tin phiên:

console.log(req.session.email) 
Các vấn đề liên quan