우리 회사는 C++ 11에서 레거시 C 코드의 대부분을 다시 작성하고 있습니다. (또한 C++을 배우는 C 프로그래머입니다.) 메시지 처리기에 대한 조언이 필요합니다.C++의 효율적인 메시지 팩토리 및 핸들러
우리는 분산 시스템을 가지고 있습니다 - 서버 프로세스는 TCP를 통해 압축 된 메시지를 클라이언트 프로세스로 보냅니다.
는 C 코드에서이 이루어지고 있었다 : - 유형/하위 유형 당 하나의 핸들러가 항상 처음 2 개 필드
- call a handler as handler[type](Message *msg)
- handler creates temporary struct say, tmp_struct to hold the parsed values and ..
- calls subhandler[type][subtype](tmp_struct)
있습니다 유형 및 하위 유형에 따라 메시지를 구문 분석합니다.
C++ 11 및 다중 스레드 환경으로 이동. 내가 가진 기본 아이디어는 다음과 같습니다.
1) 각 유형/유형 유형 조합에 대해 프로세서 객체를 등록하십시오. 이것은 실제로 벡터의 벡터
인 - 벡터 < 벡터>
class MsgProcessor {
// Factory function
virtual Message *create();
virtual Handler(Message *msg)
}
이것은 벡터의 벡터로 조회를하여 상기 프로세서를 받기 다른 메시지 프로세서
class AMsgProcessor : public MsgProcessor {
Message *create() override();
handler(Message *msg);
}
2
) 상속 될 . 오버로드 된 create() 팩토리 함수를 사용하여 메시지를 가져옵니다. 실제 메시지와 구문 분석 된 값을 메시지 안에 보관할 수 있습니다.3) 이제 해킹 비트가 발생합니다.이 메시지는 무거운 처리를 위해 다른 스레드로 보내야합니다. 벡터를 다시 검색하지 않으려면 메시지 안에 proc에 대한 포인터를 추가해야합니다.
class Message {
const MsgProcessor *proc; // set to processor,
// which we got from the first lookup
// to get factory function.
};
그래서 다른 스레드, 단지
Message->proc->Handler(Message *);
이 나쁜 보이지만, 희망,이 공장에서 별도의 메시지 핸들러에 도움이 될 것입니다을 할 것입니다. 여러 유형/하위 유형이 동일한 Message를 작성하려고하지만 다르게 처리해야하는 경우입니다.
나는 이것에 대해 검색하고 건너 온되었다
http://www.drdobbs.com/cpp/message-handling-without-dependencies/184429055?pgno=1
그것은 완전히 핸들러에서 메시지를 분리하는 방법을 제공합니다. 그러나 위의 단순한 계획이 수용 가능한 디자인으로 간주되는지 아닌지 궁금합니다. 또한 내가 원하는 것을 성취하는 잘못된 방법일까요?
효율성과 마찬가지로 속도는이 응용 프로그램에서 가장 중요한 요구 사항입니다. 이미 우리는 몇 가지 메모리 Jumbs => 2 벡터 + 가상 함수를 호출하여 메시지를 작성하고 있습니다. 처리기에 도착하는 데 2 가지 견해가 있는데, 캐싱의 관점에서는 좋지 않습니다.
불쾌감을 느끼지 않습니다. 사용 사례를 명확하게 설명하지 않았고 디자인에 빨리 뛰어 들었을 것입니다. 적어도 어떤 종류의 부하에서 성능에 대한 기대치를 충족시켜야합니까? 이것에 대한 간단한 글을 쓰고 싶니? – DAG
로드가 의미하는 바를 모르겠습니다. 우리 시스템에서는 초당 200,000 개의 메시지를 처리해야합니다.실제 제품 세부 사항에 들어 가지 않고. 서버는 짧은 구성 메시지를 클라이언트에 전송합니다. 구성 메시지에는 유형, 부속 유형 및 데이터가 있습니다. 큰 번호가 있습니다. 유형/하위 유형 조합의 - 약 1000라고 말합니다. 이들은 다른 번호로 소비됩니다. 모듈의. 따라서 모든 모듈이 메시지를 등록하고 수신 할 수 있도록 깨끗한 인터페이스를 갖는 것이 중요합니다. – MGH
언제 'create'메서드를 호출 할 것으로 기대합니까? 그리고 반환 된 '메시지 *'는 무엇입니까? 파싱 된 데이터로 채워질 빈 메시지일까요? – Arunmu