我們公司正在用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 *);
這看起來不錯,但希望是,這將有助於從工廠單獨的消息處理程序。這是爲了這種情況,當多個類型/子類型想要創建相同的消息,但處理方式不同。
我正在尋找這件事,碰上了:
http://www.drdobbs.com/cpp/message-handling-without-dependencies/184429055?pgno=1
它提供了一種完全的消息從處理程序中分離出來。但我想知道我的上述簡單方案是否會被認爲是可接受的設計。這也是實現我想要的錯誤方式嗎?
速度方面的效率是該應用程序中最重要的要求。我們已經在做一些內存Jumbs => 2個向量+虛擬函數調用創建消息。有兩種方法可以到達處理程序,這從緩存的角度來看並不好,我猜。
沒有冒犯我認爲你沒有清楚描述你的用例,然後跳到你的設計如此之快......至少你可能需要解決對於什麼樣的負載性能的期望?你介意寫一個簡短的介紹嗎? – DAG
我不知道你的意思是加載。在我們的系統中,我們必須每秒處理200k條消息。沒有進入實際的產品細節。服務器將短的配置消息發送到客戶端。配置消息帶有一個類型,子類型和數據。有一個很大的沒有。類型/亞型組合 - 約1000個。這些被不同的編號消耗掉。的模塊。所以爲所有模塊註冊和接收消息提供一個乾淨的界面非常重要。 – MGH
你預計何時會調用'create'方法?什麼是返回的'消息*'?這將是一個空的消息,你會填充解析的數據? – Arunmu