【发布时间】:2016-10-25 02:45:13
【问题描述】:
我们公司正在用 C++11 重写大部分遗留的 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) 现在有点hack,这个消息应该被发送到其他线程进行繁重的处理。为了避免再次在向量中查找,在消息中添加了一个指向 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 个向量 + 虚函数调用来创建消息。对处理程序有两个尊重,我猜从缓存的角度来看这不是很好。
【问题讨论】:
-
无意冒犯 我认为您没有清楚地描述您的用例然后这么快就跳到您的设计......至少您可能需要解决对什么样的负载的性能期望?你介意写一篇关于这个的简介吗?
-
我不知道你说的负载是什么意思。在我们的系统中,我们必须每秒处理 200k 条消息。无需深入了解实际的产品细节。服务器向客户端发送简短的配置消息。配置消息带有类型、子类型和数据。有一个很大的数字。类型/子类型组合 - 说大约 1000。这些由不同的编号消耗。的模块。因此,为所有模块注册和接收消息提供一个干净的接口非常重要。
-
你希望什么时候调用'create'方法?返回的 'Message*' 是什么?您将使用已解析的数据填充它会是一条空消息吗?
标签: performance c++11 handler message