2013-02-07 3 views
0

TCP/IP 소켓을 사용하여 여러 대상에 동일한 메시지를 보내는 최상의 방법을 찾고 있습니다. Windows에서 기존 VS 2010 C++ 응용 프로그램으로 작업하고 있습니다. 가능하다면 이미 해결 된 많은 복잡성을 가진 표준 라이브러리/디자인 패턴 접근 방식을 사용하기를 원합니다.소켓을 사용하여 여러 대상에 동일한 데이터를 보내는 최상의 방법 찾기

다음은 내가 생각하고있는 한 가지 접근 방식입니다. 하나의 주 스레드가 데이터베이스에서 메시지를 검색하고이를 일종의 스레드 안전 큐에 추가합니다. 또한 응용 프로그램에는 일부 대상 서버에 대한 각 클라이언트 소켓 연결에 대해 하나의 스레드가 있습니다. 이 쓰레드 각각은 쓰레드 안전 큐에서 읽은 다음 tcp/ip 소켓을 통해 메시지를 보냅니다. 이보다 더 좋고/더 간단 할 수도 있고 더 강력 할 수도 있습니다.

내가 주로 염려해야하는 문제는 대기 시간입니다. 목적지는 어디든지있을 수 있으며 소켓 연결과 소켓 연결간에 상당한 대기 시간이있을 수 있습니다. 메시지는 모든 대상에 대해 정확한 FIFO 순서로 이동해야합니다.

또한 하나의 대상이 기본 대상으로 간주됩니다. 모든 메시지는 예외없이 예외없이이 대상에 도착해야합니다. 기본이 아닌 다른 목적지의 경우 메시지는 단지 사본이며 기본이 아닌 대상이 몇 개의 메시지를받지 않으면 절대적으로 중요하지 않습니다. 어느 시점에서든 기본 대상이 아닌 기본 대상 중 하나가 기본 대상이 될 수 있습니다. 대상 중 하나가 너무 늦게 떨어지면 해당 스레드는 기본 대상을 따라 잡아야하지만 일부 메시지는 건너 뜁니다.

제안 사항을 찾고 있습니다. 지금까지의 예비 연구에서, 나의 상황은 단일 생산자와 다수의 소비자 패턴 또는 Java의 마스터 작업자 패턴과 비슷한 것으로 보인다.

Windows에서이 기능을 C++에서 구현해야하며 응용 프로그램은 기존에 정의 된 프로토콜을 사용하여 TCP/IP 소켓을 사용해야합니다.

아무런 도움을받지 못 하셨다면 큰 도움이 될 것입니다.

+0

[기존의 정의 된 protol]의 의미는 모르지만 [ZeroMQ] (http://zeromq.org)를 살펴보십시오. –

+1

TCP는 이미 많은 것을 수행합니다 : 보장 된 FIFO 순서, 시작 및 길기 기본 대상 (또는 모든 대상)에 대한 연결이 유지되면 해당 대상의 피어는 전송 된 모든 데이터를 수신합니다. 지연이 왜 당신의 설명에서 그런 우려인지는 분명하지 않습니다. 예를 들어 주문에 영향을 미치지 않습니다. – EJP

+0

"기존에 정의 된 프로토콜"은 응용 프로그램이 인터페이스/프로토콜이 이미 정의 된 서버와 통신하고 있다는 것을 의미합니다. TCP/IP의 의미가 필요합니다. –

답변

0

정확히 2 개의 스레드가 필요합니다. 하나는 IO 채널을 데이터베이스에 포화시키고 다른 하나는 IO 채널을 12 개의 서버로 연결되는 네트워크에 포화시키는 스레드입니다. 다중 네트워크 인터페이스 (생각해야 할!)가 없다면 다중 스레드를 사용하여 더 빨리 작업을 보내지 않아도됩니다. 또한 네트워크를 돌보는 다중 스레드가 없기 때문에 네트워크를 동기화 할 필요가 없습니다.

확실히 알아 두어야 할 사항은 select()입니다. WinSock의 경우 WSAEventSelect/WaitForMultipleObjects도 살펴보십시오. 기본적으로 큐에서 메시지를 가져온 다음 준비가되면 모든 클라이언트에게 보냅니다. select()는 일련의 소켓 중 하나가 데이터를 받아 들일 준비가되면 알려주므로 시간을 낭비하거나 데이터 전송을 차단하지 않습니다. 위로 가기 위해 깨진 연결 후에 다시 연결하는 스키마, 지연되는 클라이언트에 메시지를 드롭하는시기 등이 있습니다. 또한 여러 대상에 대한 처리량이 많은 경우 병렬로 여러 메시지를 처리하는 방법을 고려해야합니다. 네트워크 패킷의 페이로드보다 작 으면 오버 헤드를 피하기 위해 어쨌든 결합하는 것이 좋습니다.

이 간단한 개요가 시작하는 데 도움이되기를 바랍니다. 그렇지 않으면 자세한 내용을 자세히 설명 할 수 있습니다.

관련 문제