项目地址:https://github.com/wlgq2/orca

关于orca

orca是一个基于C++11/14风格的轻量级actor库,ping-pong测试显示性能较为优异。本文主要介绍orca的消息封装及类型。
orca消息性能测试

消息类型定义

orca通过REGISTER_MESSAGE_TYPE宏定义消息类型。orca的消息类型可以是std::string,也可以是自定义消息类型,但是需要实现相应接口。
例:

REGISTER_MESSAGE_TYPE(std::string);//定义string为消息传送类型。

因为orca网络消息的传输以字节流的形式,所以如果使用自定义消息类型,则需要实现以下接口

  1. const unsigned long size();//消息长度
  2. const char* enter();//消息入口
  3. 构造函数(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();

}

莫失莫忘
9 声望1 粉丝