2012-02-13 34 views
27

Tôi đang cố gắng mở rộng ứng dụng socket.io đơn giản trên nhiều quy trình và/hoặc máy chủ.Ví dụ trong việc sử dụng RedisStore trong socket.io

Socket.io hỗ trợ RedisStore nhưng tôi bị nhầm lẫn về cách sử dụng nó.

Tôi nhìn vào ví dụ này, http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-socket-io

nhưng tôi không hiểu làm thế nào sử dụng RedisStore trong mã đó sẽ là bất kỳ khác nhau từ việc sử dụng MemoryStore. Ai đó có thể giải thích cho tôi?

Ngoài ra sự khác biệt giữa cấu hình socket.io là gì để sử dụng redisstore so với việc tạo ứng dụng khách redis của riêng bạn và thiết lập/lấy dữ liệu của riêng bạn?

Tôi mới sử dụng node.js, socket.io và redis, vì vậy, vui lòng chỉ ra nếu tôi bỏ lỡ điều gì đó hiển nhiên.

+0

Đây là [một mã snip sử dụng RedisStore có nút] (http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html) bạn có thể thấy thú vị; nó không nói sự khác biệt, mặc dù; Tôi đã trớ trêu thay, chỉ đọc về chủ đề này :) – Kato

+0

Các liên kết cho những công việc không còn nữa =/ – qodeninja

Trả lời

26

nhưng tôi không hiểu cách sử dụng RedisStore trong mã đó sẽ khác với việc sử dụng MemoryStore. Ai đó có thể giải thích cho tôi?

Sự khác biệt là khi sử dụng mặc định MemoryStore, bất kỳ thư nào bạn phát ra trong một nhân viên sẽ chỉ được gửi cho khách hàng được kết nối với cùng một nhân viên vì không có IPC giữa người lao động. Sử dụng RedisStore, tin nhắn của bạn sẽ được xuất bản tới một máy chủ redis mà tất cả các nhân viên của bạn đang đăng ký. Do đó, tin nhắn sẽ được tất cả công nhân và tất cả các khách hàng kết nối đón và phát sóng.

Ngoài ra sự khác nhau giữa cấu hình socket.io là gì để sử dụng redisstore so với tạo ứng dụng khách redis của riêng bạn và đặt/nhận dữ liệu của riêng bạn?

Tôi không quen thuộc với RedisStore và vì vậy tôi không chắc chắn về tất cả sự khác biệt. Nhưng tự làm nó sẽ là một thực hành hoàn toàn hợp lệ. Trong trường hợp đó, bạn có thể xuất bản tất cả các tin nhắn đến một máy chủ redis, và lắng nghe những tin nhắn trong trình xử lý socket của bạn. Nó có thể sẽ làm việc nhiều hơn cho bạn, nhưng bạn cũng sẽ có quyền kiểm soát nhiều hơn về cách bạn muốn thiết lập nó. Tôi đã làm một điều gì đó tương tự như bản thân mình:

// Publishing a message somewhere 
var pub = redis.createClient(); 
pub.publish("messages", JSON.stringify({type: "foo", content: "bar"})); 

// Socket handler 
io.sockets.on("connection", function(socket) { 
    var sub = redis.createClient(); 
    sub.subscribe("messages"); 
    sub.on("message", function(channel, message) { 
    socket.send(message); 
    }); 

    socket.on("disconnect", function() { 
    sub.unsubscribe("messages"); 
    sub.quit(); 
    }); 
}); 

Điều này cũng có nghĩa là bạn phải tự quản lý thông điệp nâng cao hơn bằng cách xuất bản/đăng ký các kênh khác nhau. Với RedisStore, bạn sẽ nhận được chức năng đó miễn phí bằng cách sử dụng các kênh socket.io (io.sockets.of("channel").emit(...)).

Hạn chế tiềm năng lớn với điều này là các phiên socket.io không được chia sẻ giữa các nhân viên. Điều này có thể có nghĩa là các vấn đề nếu bạn sử dụng bất kỳ phương tiện vận chuyển bỏ phiếu dài nào.

0

Sự khác biệt là, nếu bạn có một cụm trường hợp node.js đang chạy, memStore sẽ không hoạt động vì nó chỉ hiển thị cho một quá trình.

+1

Và giải pháp là gì? – nalply

+0

Làm việc trên điều này ngay bây giờ-- đây là những gì tôi đã làm cho một cửa hàng ổ cắm (IPC) và cửa hàng phiên (mà bạn có thể chia sẻ với máy chủ khác ... như Express!) Chúng tôi đang thử nghiệm điều này trong một thiết lập cụm bây giờ-- tôi sẽ đăng lại ở đây nếu tôi thấy bất kỳ vấn đề nào. https://github.com/balderdashy/sails/tree/master/session_experiment – mikermcneil

3

Tôi đã thiết lập một dự án github nhỏ để sử dụng redis làm kho dữ liệu.

Bây giờ bạn có thể chạy nhiều quy trình máy chủ socket.io.

https://github.com/markap/socket.io-scale

+0

có vẻ đã lỗi thời, RedisStore không khả dụng nữa trong socket.io – Flion

2

Ngoài ra sự khác biệt giữa việc cấu hình để sử dụng socket.io redisstore vs là gìtạo ứng dụng khách redis của riêng bạn và thiết lập/nhận dữ liệu của riêng bạn?

Sự khác biệt là khi bạn sử dụng 'RedisStore', chính bản thân socket.io sẽ lưu nhịp tim và thông tin phiên vào Redis và nếu bạn sử dụng cụm với node.js, ứng dụng khách có thể làm việc .

Nếu không có lại, khách hàng có thể thay đổi quy trình node.js vào lần tới, vì vậy phiên sẽ bị mất.

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