2013-08-07 25 views
13

Có một vài câu hỏi về chủ đề này, nhưng không có vấn đề gì về vấn đề này.Scaling Engine.IO với một Redis Store (so với Socket.IO)

Tôi đang sử dụng Socket.IO với một cửa hàng redis và tôi đang chuẩn bị cho một sự cố trong giao thông. Công ty lưu trữ của tôi nói, "Bạn cần sử dụng Engine.IO thay vì Socket.IO vì nó hiệu quả hơn" nên tôi đang xáo trộn để tìm ra ý nghĩa của nó.

Questions like this có câu trả lời dường như mâu thuẫn:

Vì vậy, con đường tôi nhìn thấy nó:

  • Socket.IO 0,9 thoái hóa
  • Engine.IO tăng cường
  • Socket.IO 1.0 sẽ sử dụng Engine.IO
  • Nếu bạn muốn chạy Engine.IO trên nhiều trường hợp, bạn phải viết các redis lưu trữ cho mình

Nhưng sau đó Engine.IO cho biết đó là "cân bằng tải thân thiện" nhưng không nói gì về redis. Nó phải có một số loại cửa hàng bên ngoài, phải không? Nhưng nếu nó có nhiều phương tiện giao thông và một cửa hàng, điểm của Socket.IO là gì?

Sau đó, tôi thấy rằng Socket.IO might be abandonedhigh profile companies are moving đến Primus.

Tôi làm cách nào để mở rộng quy mô Engine.IO? Tôi có phải tự viết cửa hàng không?

+0

Nếu bạn đi với Engine.IO, có bạn sẽ phải viết riêng một cửa hàng. Tôi biết nó không phải là mát mẻ để phàn nàn về việc thiếu cập nhật về các dự án mã nguồn mở, nhưng tôi cảm thấy như họ đã bỏ bóng trên Socket.IO. Có nhiều câu hỏi trôi nổi xung quanh như thế này và 1.0 đã được chỉ quanh góc trong hơn nửa năm nay. Có hàng trăm vấn đề mở được nhiều tháng tuổi trên socket.io vì vậy nó mang lại cho tất cả các lần xuất hiện của unmaintained vào thời điểm này. –

+0

Nếu bạn muốn sử dụng engine.io thì bạn sẽ phải viết thêm nhiều thứ. Tôi sẽ tưởng tượng socket.io đang đối mặt với một số rào chắn thích ứng với lõi mới. Socket.io là engine.io những gì thể hiện để kết nối. Nó ẩn các chi tiết cấp thấp của engine.io và linh hoạt và thân thiện với người dùng. Nhưng tôi sẽ yêu cầu bạn không xây dựng cửa hàng trên đầu trang của nó, vì lý do tương tự. socket.io 1.0 được xây dựng theo lời hứa của engine.io. Với tình trạng của socket.io 1.0, bất cứ ai có thể đảm bảo engine.io sẽ thành công. Nếu 1.0 là trong đường ống chờ đợi cho nó, bởi vì nó sẽ được tốt hơn so với những gì bạn có thể làm, nếu nó đến. – user568109

Trả lời

-1

Vâng, như bạn đã đề cập đến chính mình, tôi nên xem Primus. Scaling đạt được bằng cách sử dụng HAProxy. Khi giao tiếp cơ bản, bạn vẫn có thể sử dụng Socket.io, nhưng cũng có engine.io. Bằng cách sử dụng Primus, bạn có thể thử nghiệm với các thư viện khác nhau. Có một bài viết thú vị về mở rộng Redis tại http://pusher.com/docs/server_libraries.

+0

Hãy nhớ rằng nó giới thiệu HAProxy cho các phiên dính của nó có nghĩa là nó luôn luôn nên chuyển hướng một người nào đó với cùng một phiên để cùng một máy. Nó thực hiện điều này thay cho một cửa hàng chung cho thông tin kết nối. Có một số ưu và khuyết điểm đối với mỗi phương pháp tiếp cận để đảm bảo bạn hiểu những điều đó trước khi quyết định nhảy. http://stackoverflow.com/questions/1553645/pros-and-cons-of-sticky-session-session-affinity-load-blancing-strategy –

+0

Tôi không quyết định. Tôi chỉ cố gắng giúp đỡ và chỉ ra OP cho một số bài báo mà người khác viết. Cảm ơn bạn đã hạ cấp. –

+0

Tôi biết. Điều đó có nghĩa là cho OP. –

10

Chỉ muốn chia sẻ những gì tôi đã học trong tuần trước, nhưng hy vọng một người khác đến và trả lời điều này một cách dứt khoát để tôi có thể kiểm tra cho họ.

1) Không bao giờ sử dụng Socket.IO (tính đến 0.9.16)

máy chủ của tôi đã đúng khi cho tôi biết để sử dụng Engine.IO (hoặc bất cứ điều gì khác). Socket.IO có một số lượng lớn các vấn đề lớn, điều tồi tệ nhất trong số đó là nó sẽ bất ngờ DDoS your server. Tôi đã trải nghiệm bàn tay đầu tiên này với các khách hàng tương đối ít và nó hoàn toàn vô hiệu hóa máy chủ của tôi cho đến khi tôi có thể viết lại Socket.IO. Tôi đã phóng to 25+ máy bay không người lái để hấp thụ đòn và nó không quan trọng. Một khách hàng có thể gửi 1000 yêu cầu mỗi giây.

2) động cơ khác không có Redis Stores

Socket.IO phép bạn chương trình phát sóng trên các nút bằng cách thả trong cửa hàng Redis của họ. Cho đến nay tôi có thể nói, Engine.IO, Primus và SockJS không cung cấp điều này.Vì vậy, khi các công cụ này yêu cầu "cân bằng tải" thân thiện, điều đó không có nghĩa là bạn có thể phát trên các nút. Tôi bắt đầu nghĩ đây thực sự là một điều tốt. Viết pub/sub với redis là tương đối dễ dàng và có nó tách ra đã được tốt đẹp.

Tôi đã sử dụng Primus với Engine.IO, sau đó sử dụng redis pub/phụ để chia sẻ sự kiện giữa các nút. Tôi mất khoảng 5 giờ để tháo Socket.IO, nối dây Primus, viết pub/sub và phát trực tiếp. Cho đến nay nó là một trải nghiệm tốt hơn nhiều.

UPDATE:

Kết thúc lên Engine.IO cũng được trong vòng kết nối lại (một vài per second), vì vậy tôi cuối cùng sử dụng SockJS. Nó cho tôi kết nối tốt nhất với độ ổn định & và Primus now handles the reconnect (mà SockJS không làm).

+0

Bây giờ, bạn đã chuyển từ chế độ động cơ sang sockjs, thanh công cụ redis/sub vẫn hoạt động không? Bạn vẫn có thể mở rộng với redis? – Harry

+1

Để rõ ràng, quán rượu/phụ Redis không được tích hợp vào engineio hoặc sockj. Tôi nối dây đỏ hoàn toàn độc lập. Vì tôi đang sử dụng Primus, việc chuyển đổi không làm thay đổi mảnh redis chút nào. – bendytree

+0

Tại sao không sử dụng Primus + Redis pub/sub và thêm lớp SockJs? – hfcorriez

1

Tôi đồng ý rằng Socket.IO nên tránh cho đến khi v1.0 được phát hành, nó lỗi và trong thử nghiệm của tôi Engine.IO hoạt động tốt hơn (https://medium.com/node-js-javascript/b63bfca0539). Primus chắc chắn là một lựa chọn tốt: có thể bạn sẽ sử dụng Engine.IO ngay bây giờ nhưng khi Socket.IO 1.0 được phát hành, bạn sẽ muốn chuyển sang nó.

Tôi đã triển khai một chương trình tương tự với Engine.IO và Redis và cấu trúc Pub/Sub, nó trông rất thanh lịch. Mã dưới đây đăng ký một khách hàng được kết nối với một phòng/kênh.

io.on('connection', function (socket) { 
    var observerRedisClient = redis.createClient(); 
    observerRedisClient.subscribe(resourceId, redis.print); 

    observerRedisClient.on('message', function(channel, message) { 
     socket.send(message); 
    }); 
}); 

Và nếu bạn cập nhật kênh đó, ví dụ: lưu một số dữ liệu và xuất bản, khi đó tất cả khách hàng đã đăng ký sẽ nhận được dữ liệu đó.

redisClient.set(key, value, redis.print); 
redisClient.publish(key, value); 

Nếu bạn quan tâm đến mã là mã nguồn mở: https://github.com/denizozger/node-engine.io-server

Các vấn đề liên quan