2014-05-15 2 views
2

테스트 목적으로 AWS의 X 번호 ec2 인스턴스 (JXCore, Java 또는 Erlang을 사용하는 node.js로 계속 결정)에 10 백만 이상의 동시 소켓 연결이 포함될 소켓 서버를 만들고 싶습니다. 이 소켓들은 10 초마다 다른 소켓으로 메시지를 무작위로 보낼 것입니다. 나는이 소켓을 효과적으로 저장하고 읽을 수있는 방법을 이해하는 데 어려움을 겪고 있습니다.소켓을 많이 보관하는 가장 좋은 방법은 무엇입니까?

내가 볼 수있는 두 가지 옵션은 응용 프로그램 자체에 맵과 같은 소켓 객체를 저장하거나 소켓을 Redis와 같은 빠른 데이터베이스에 저장하는 것입니다. 응용 프로그램 내부의 데이터 구조에 소켓을 저장하는 문제는 크기를 조정하고 견고하며 수백만 소켓이 서로를 찾아야 할 때 읽기 성능이 어떻게 향상 될 것인지입니다. 그리고 redis와 같은 데이터베이스에 저장하면 Socket A가 소켓 B가 메시지를 보내고있는 위치를 알아야하기 때문에 매번 네트워크를 호출해야합니다. 이 두려움은 성능을 상당히 떨어 뜨릴 것입니다.

저는 인터넷에서이 질문에 답을 찾을 수 없으므로 확장 가능한 소켓 서버에 대한 모범 사례가 무엇인지 궁금합니다. 필자가 온라인으로 찾은 모든 소켓 서버는 특정 소켓을 보유하는 대신 다른 모든 소켓에 간단하게 브로드 캐스트하며 10 개의 소켓 만 포함합니다.

+0

비 차단 IO 솔루션을 조사해야합니다. 아무 것도 당신이 원하는 소켓 연결의 수를 처리 할 것입니다. – spudone

+0

비 차단 솔루션? 서버 팜을 조사해야합니다. –

+0

그는 ec2 인스턴스에 대해 X가 무엇인지 말하지 않았지만 10mil 소켓을 처리하기에 충분한 양을 던지면 아마도 그가 원하는 해결책이 아닐 것입니다. – spudone

답변

0

이 응용 프로그램을 여러 노드에 분산 시키려면 적어도 대상 노드를 결정하는 방법이 필요합니다. 소스 및 현재 패킷의 순수한 기능 일 수있는 경우 중앙 저장소가 필요하지 않으며 가능한 최상의 솔루션입니다.

나머지 경우에는 중앙 저장소가 불가피하지만 일부 최적화는 해당 저장소에 대한 액세스를 줄이기 위해 적용될 수 있습니다. 로컬 소켓은 쉽게 로컬 맵 (erlang의 ets 또는 mnesia, 다른 언어의 공유 싱글 톤 맵)에 저장하고 먼저 점검 할 수 있습니다. 패킷이 필요한 모든 정보를 포함 할 수 있도록 소스에 캐시 대상 주소를 알릴 수 있습니다. 또는 대상 캐시가 클라이언트 동작에 종속되지 않도록 소스 소켓 노드에 저장 될 수 있습니다. 이 캐시는 경로 지정에 사용될 수 있으며, 경로 조작이 실패한 경우에만 중앙 저장소에 액세스 할 수 있습니다.

귀하의 경우 사용할 수있는 것에 따라 다른 최적화가 될 수 있습니다.

관련 문제