2017-03-13 6 views
7

Socket based event push architecture 내가 노드 JS에 작성된 소켓 서버 응용 프로그램, 아마존 EBS (탄성 콩 줄기)에서 호스팅을 소켓에 연결하고 지정된 ID, 예를 들어 event_id를 전달합니다. 내 응용 프로그램은 "event_ event_id"이름의 회의실을 만들고 회의실에 참여합니다. 다른 클라이언트는 다른 "EVENT_ID"가소켓 IO, 애플리케이션 서버의 모든 인스턴스에 연결해야하는 부하 분산</p> <p>클라이언트에 의해 관리되는

람다 기능은 EVENT_ID

필요한 데이터와 응용 프로그램에 "event_push"라는 이벤트를 소켓에 연결하고 방출 할 때마다 하나의 인스턴스 내 소켓 응용 프로그램 (의 EBS가) event_id와 푸시 이벤트를 감지, 그것은로드 밸런서에 의해 결정

클라이언트가 서버 중 하나를 연결할 수 있습니다 따라서 모든 멤버가 이벤트의 통지됩니다 방 "event_ event_id"의 모든 구성원에 밀려 데이터를 방송 끈적한 세션이 연결을 유지할 수 있습니다.

이제 내 문제 : 서버의 모든 인스턴스에에 이벤트를 방출 할 수있는 방법이 있나요 : 는 "event_ event_id"

QN라는 이름의 방을 가진 경우에만 서버에 "event_push"를 방출하는 방법이 있나요 EBS? 또는 Qn : 다른 해결책이 있습니까?

+0

가능한 해결책 : 일정 세부 정보를 수신 할 수있는 영구 연결을 가질 수있는 중앙 구독/게시 서버. 소켓 서버는 중앙 서버에 가입 할 수 있으므로 이벤트가 발생하면 영구 연결을 통해 모든 가입 된 소켓 서버로 푸시됩니다. – Ima

답변

0

당신이 할 수있는 일은 Redis 또는 mongoDb를 사용하여 귀하의 사례 인 event_event_id에 대한 일부 정보를 저장할 수 있다는 것입니다. 당신은 무엇을이 할 것입니다 것은 당신이 어떤 이벤트가 어떤 서버에 속하는 정보를해야합니다 지금 예를 샘플 문서

{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 1 
}, 
{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 2 
} 

의 데이터 저장이 정보를 저장할 수 있습니다. 이제 loadbalancer가 server1의 요청을 서버 2에 보내고 서버 2가 해당 요청을 인식하지 못하면 서버간에 통신 채널을 만들 수 있습니다 (socketio, microservice 또는 기타를 사용할 수 있음). 서버 1에 해당 요청을 리디렉션하여 특정 소켓을 트리거 할 수 있습니다. 행사.

연결 해제 이벤트가 발생하면 mongo 또는 redis에서 소켓 ID를 삭제해야합니다.

+0

1. 내 서버가 Elastic Bean Stalk에 의해 시작 되었기 때문에 어떤 서버가 작동 중인지, 어떤 서버가 작동 중지되었는지 또는 새 서버가 초기화되었는지 알 수 없습니다. 따라서이 시나리오에서는 서버 간 통신이 문제가되지 않습니다. – Ima

+0

2. 어떤 사용자가 어떤 서버에 연결되어 있는지는 알 수 없습니다. 이는 브라우저에서 서버로의 소켓 연결에 관한 것이며 연결은 지속되며 두 가지 이유 때문에 클라이언트 (브라우저)가 특정 서버에 연결할 수 없습니다. a) 서버가 항상 작동하지는 않지만 EBS가 관리하고 클라이언트 (브라우저)는 서버에 대한 정보를 가지고 있지 않습니다. b) 연결은 ELB (Elastic Load Balancer) – Ima

+0

에 의해 결정됩니다. 이벤트는 사용자 또는 다른 엔티티로 제한되지 않으므로 제안한대로 바인딩 할 수 없습니다. – Ima