项目地址:https://github.com/wlgq2/orca
关于orca
orca是一个基于C++11/14风格的轻量级actor库,ping-pong测试显示性能较为优异。本文主要介绍orca的消息封装及类型。
消息类型定义
orca通过REGISTER_MESSAGE_TYPE宏定义消息类型。orca的消息类型可以是std::string,也可以是自定义消息类型,但是需要实现相应接口。
例:
REGISTER_MESSAGE_TYPE(std::string);//定义string为消息传送类型。
因为orca网络消息的传输以字节流的形式,所以如果使用自定义消息类型,则需要实现以下接口
- const unsigned long size();//消息长度
- const char* enter();//消息入口
- 构造函数(char* str, int size);//消息构造函数
例:
#include <orca/orca.h>
class MyMessage
{
public:
MyMessage(char* str, int size)
{
if (size > Size)
size = Size;
std::copy(str, str+size,message);
}
~MyMessage()
{
}
const unsigned long size()
{
return Size;
}
const char* enter()
{
return message;
}
private:
static const int Size = 1024;
char message[Size];
};
//registet messge type.注册自定义消息类型。
REGISTER_MESSAGE_TYPE(MyMessage);
因为orca需要支持std::string或自定义消息类型,所以萃取了消息类型特性,如果string类型则调用c_str()函数,否则调用enter函数。在orca/core/MessageTraits.h文件下实现如下:
namespace orca
{
namespace core
{
template<typename T>
struct MessageTraits
{
static const char* Enter(T& object)
{
return object.enter();
}
};
template<>
struct MessageTraits<std::string>
{
static const char* Enter(std::string& object)
{
return (object.c_str());
}
};
}
}
消息的封装与发送
为了在本地消息发送实现zero-copy,orca对消息做了一层简单封装,即MessagePack类。
通过create接口创建消息,原型为:
template<class... _Types >
std::shared_ptr<MessageType>& create(_Types&&... _Args)
creat函数会创建一个消息的引用计数指针,以达到消息通信zero-copy目的。
完整的例子如下:
int main(int argc, char** args)
{
//actor framework.
orca::Framework framework;
//arctor object.
orca::Actor actor1(&framework);
orca::Actor actor2(&framework);
//message pack.
orca::MessagePack message;
message.create("hello world!");
//actor1->actor2 send message.
actor1.send(message,actor2.getAddress());
framework.loop();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。