2011-09-20 18 views
5

Tôi không thực sự nói về ứng dụng trò chuyện chung, nhưng đặc biệt là về việc thực hiện phòng chat.Thảo luận: Cách tốt nhất để triển khai phòng trò chuyện với node.js/socket.io?

Vì vậy, trong Node.js/socket.io, tôi nghĩ đến hai cách tiếp cận

  1. Tạo một mảng cho mỗi phòng chat, tin nhắn quảng bá đến tất cả người dùng trong mảng

  2. Chương trình phát sóng tất cả các tin nhắn đến tất cả người dùng, trên máy tính của khách hàng xác định xem họ có thuộc về phòng chat hay không, nếu có, hãy chấp nhận tin nhắn.

Điểm yếu trong 1 là cuối cùng bạn mở rộng bộ nhớ của máy chủ với các đối tượng mảng và tôi chỉ sử dụng khoảng 80MB khi lưu trữ.

Điểm yếu trong 2 là phát sóng tới mọi người là tốn kém và cuối cùng làm ngập lụt máy của khách hàng sẽ không khiến họ hài lòng.

Tôi chắc chắn có cách tiếp cận tốt hơn về cách triển khai phòng trò chuyện, vì vậy đó là lý do tôi yêu cầu các bạn giúp tôi. Tôi đang tìm kiếm hiệu suất ở phía máy chủ đầu tiên sau đó phía máy khách và nó phải có khả năng mở rộng.

+0

Với 80MB, bạn có thể tạo ra rất nhiều chatroom. Các mảng của bạn chỉ cần giữ ID của người dùng. Bạn có chạy bất kỳ kiểm tra tiêu thụ bộ nhớ nào không? – user123444555621

+0

Chúng tôi đã thực hiện một chức năng [phòng chat nhiều phòng] (https://github.com/Raynos/so642). Đó là mã nguồn mở, hãy nhìn. – Raynos

+0

@ pumbaa80 đúng, nhưng 80mb trở thành như 20-30mb sau khi chạy rất nhiều quy trình khác hoặc công việc cron mà tôi có thể cần, cộng với tôi vẫn không nghĩ rằng đó là một cách tốt để tăng quy mô vì bộ nhớ là đắt ... – Derek

Trả lời

1

tôi đã làm một cái gì đó tương tự như ở đây:

http://davidgranado.com/demos/chat_shuffle/

Bạn có thể kiểm tra nó ra bằng cách mở nhiều cửa sổ và trò chuyện với chính mình kể từ khi mỗi trường hợp được coi là một người (đó là ứng dụng nút đầu tiên của tôi).

Cách hoạt động là mọi người được ghép nối với một người khác để trò chuyện. Có hiệu quả, mọi người đều ở trong phòng hai người.

Để nhận tin nhắn trên, tôi đăng ký người dùng đang được liên kết với nhau và chỉ gửi cho người khác trò chuyện. Ý tưởng này có thể dễ dàng được mở rộng ra bất kỳ số lượng người nào để kết hợp các chatters. Bằng cách đó, bạn không phải làm một phát sóng lãng phí cho tất cả mọi người.

+1

để nói rằng bạn có person1, person2, person3, làm thế nào để máy chủ biết gửi tất cả tin nhắn/biết rằng họ đang ở trong phòng trò chuyện mà không khai báo một nhóm để nhóm họ trong phòng trò chuyện như trong cách tiếp cận 1 của tôi? – Derek

+0

Tôi nghĩ rằng bộ não của tôi không sắc bén vào lúc này như tôi nghĩ. Về cơ bản nó giống nhau. Tại thời điểm này, tôi không sử dụng một mảng cho mỗi vì nó chỉ có hai trong số đó. Nhưng để mở rộng ý tưởng, một mảng sẽ là hoàn hảo cho một phòng chat để biết ai sẽ phát sóng. –

5

Socket.IO 0.7+ giới thiệu một khái niệm phòng. Đây có lẽ là điều bạn đang tìm kiếm.

io.sockets.on('connection', function (socket) { 
    socket.join('room name'); 

    // broadcast the message to everybody in the room 
    socket.on('chat message', function (data) { 
    socket.broadcast.to('room name').emit('chat message', data); 
    }); 

    socket.on('leave room', function (room) { 
    socket.leave(room); 
    }); 
}); 

Vì vậy, không cần thiết phải quản lý mảng riêng bạn với người dùng cho phòng cụ thể, socket.io có build này.

+0

không biết điều đó, tôi sẽ xem xét cách chúng triển khai hàm socket.join() sau đó. Nhưng trước tiên, tài liệu socket.io nằm ở đâu? – Derek

+0

của readme: https://github.com/learnboost/socket.io https://github.com/learnboost/socket.io-client Các trang web http://socket.io/ Và trong wiki https://github.com/learnboost/socket.io/wiki – 3rdEden

+0

Tôi đã chuẩn bị một [bản demo đơn giản về trò chuyện nhiều phòng] (https://github.com/jgonera/socket.io-multichat) sử dụng phòng của Socket.IO. Nó đi kèm với một điểm chuẩn cho phép bạn kiểm tra xem nó có thể nhanh như thế nào. –