項目地址:https://github.com/wlgq2/orcagit
orca是一個基於C++11/14風格的輕量級actor庫,ping-pong測試顯示性能較爲優異。本文主要介紹orca的消息封裝及類型。
github
orca經過REGISTER_MESSAGE_TYPE宏定義消息類型。orca的消息類型能夠是std::string,也能夠是自定義消息類型,可是須要實現相應接口。
例:網絡
REGISTER_MESSAGE_TYPE(std::string);//定義string爲消息傳送類型。
由於orca網絡消息的傳輸以字節流的形式,因此若是使用自定義消息類型,則須要實現如下接口函數
例: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(); }