[REDIS] 어떻게 인스턴트 메시징 시스템 레디 스 펍 / 하위를 설계?
REDIS어떻게 인스턴트 메시징 시스템 레디 스 펍 / 하위를 설계?
나는 레디 스 펍 / 하위에 새로운 오전. 나는 IM처럼 시스템의 채팅 기능을 가지고있다. 나는 레디 스 펍 / 하위를 사용하고 싶습니다 그래서. 내가 샘플을 조사 것처럼 그들의 대부분은 설계 대화방을 기반으로합니다. 내 시스템에서 내가 좋아하는 사용자들 사이에 여러 개의 대화방이있을 것이다;
A:B
A:C
D:C
E:F
그래서, 줄 위의 객실입니다. 그리고는 다음과 같은 Node.js를 사용하여 서버를 구현;
var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
var sub = redis.createClient();
sub.on("message", function(pattern, data){
data = JSON.parse(data);
socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
}
});
socket.on('message', function (messageData) {
store.incr("messageNextId", function(e, messageId) {
var room = ""
var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;
room = from + ":" + to;
var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {
pub.publish(room, JSON.stringify(message))
});
});
});
당신은 내가 각 연결에 대한 새로운 레디 스 가입자를 만드는 오전 볼 수 있듯이. 다른 대화방 샘플 레디 스 가입자 클라이언트에서 세계적으로 작성됩니다. 게시자가 메시지를 게시 할 때 연결된 모든 클라이언트가 그것을 얻을해야하기 때문에이 해결할 수있는 문제를 자신의 문제가 세 개의 연결을 항상 존재합니다. 하지만 여기에 제약이있다. 나는 두 명의 사용자 만이 사용자가되어야 가입자 사이에 채팅 세션을 열고 자. 내가 싶습니다하지만 확인을 경우 레디 스 각 연결에 대한 새 가입자 클라이언트를 작성하는 내가 아는하지 않는 작품 위의 코드입니다.
당신의 제안을 듣고 좋은 것입니다. 미리 감사드립니다.
해결법
-
==============================
1.언제나처럼, 당신은 당신의 자신의 사용의 경우이 같은 벤치 마크 일 필요 - 그것은 일반적인 조언을 줄 수 없습니다. 당신도 시스템 전체 또는 레디 스 사용자를 위해, 시스템에 열려있는 파일의 최대 수를 늘려야 할 수도 있습니다. 이것은 또한 물론, 웹 서버를 실행하는 사용자에게 적용됩니다.
언제나처럼, 당신은 당신의 자신의 사용의 경우이 같은 벤치 마크 일 필요 - 그것은 일반적인 조언을 줄 수 없습니다. 당신도 시스템 전체 또는 레디 스 사용자를 위해, 시스템에 열려있는 파일의 최대 수를 늘려야 할 수도 있습니다. 이것은 또한 물론, 웹 서버를 실행하는 사용자에게 적용됩니다.
말했다, 당신은 레디 스 가입자 사용자 잎) (socket.on을 수신 할 수 있는지 확인합니다 ( '분리')하고 종료한다. 당신은 또한 socket.io는 레디 스 백엔드, 레버리지 레디 스 펍 / 서브를 가지고 알고 관심이있을 수 있습니다, 당신은 이미 소켓에 따라하고 있기 때문에 것을 사용하여 자신에게 약간의 수고를 덜 수 있도록 또한, 객실의 개념이 .io.
편집 : 빠른 검사 후, 나는 991 가입자 후 레디 스에서이 오류 메시지가 :
Ready check failed: Error: Error: ERR max number of clients reached
여기에 기본 redis.conf에서이다 :
# Set the max number of connected clients at the same time. By default # this limit is set to 10000 clients, however if the Redis server is not # able ot configure the process file limit to allow for the specified limit # the max number of allowed clients is set to the current file limit # minus 32 (as Redis reserves a few file descriptors for internal uses). # # Once the limit is reached Redis will close all the new connections sending # an error 'max number of clients reached'. # # maxclients 10000
내 빠른 테스트는 테스트의 권리에 관한 것 (992)에 연결된 클라이언트, 후 실패 때문에 내 시스템 (우분투 11.11), 1024 제한 NOFILE 기본 제공됩니다 (또한 게시자에 대한 하나 개의 클라이언트를 가지고). 당신에게 나의 제안은 당신의 NOFILE 제한을 검사하는 것입니다 (내 시스템에이 /etc/security/limits.{conf,d/*에있어}와 레디 스의 MaxClients의를 설정하고 벤치 마크, 벤치 마크, 벤치 마크!
from https://stackoverflow.com/questions/10142246/how-to-design-redis-pub-sub-for-an-instant-messaging-system by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 127.0.0.1:6379에서 레디 스에 연결할 수 없습니다 : 연결 사제와 거부 (0) | 2020.01.10 |
---|---|
[REDIS] 연관 배열을 저장하는 방법 레디 스? 설정 또는 해시 또는 목록? (0) | 2020.01.10 |
[REDIS] 레디 스 : 설정 레디 스에 대한 암호를 (0) | 2020.01.10 |
[REDIS] 나는 직렬화를 구현하고 노드 JS + 여권 + RedisStore를 역 직렬화합니까? (0) | 2020.01.10 |
[REDIS] 스택 오버플로, 레디 스 및 캐시 무효화 (0) | 2020.01.10 |