C++ Actor庫orca簡介(一):消息封裝及類型

項目地址:https://github.com/wlgq2/orcagit

關於orca

orca是一個基於C++11/14風格的輕量級actor庫,ping-pong測試顯示性能較爲優異。本文主要介紹orca的消息封裝及類型。
orca消息性能測試github

消息類型定義

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);//消息構造函數

例:oop

#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目的。
完整的例子以下:spa

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();

}
相關文章
相關標籤/搜索