MOOON分布式訊息結構

來源:互聯網
上載者:User

MOOON主要訊息結構如下,缺點是訊息本身佔用位元組數較多:

// 為何要做IPV4和IPV6區分?// 是因為如果只需要支援IPV4,則一個IP地址只需要用一個4位元組表示,// 這樣源和目的IP地址共節省了24位元組;// 支援IPV6時,同時相容IPV4,但對於IPV4多浪費24位元組;// 源和目標IP,要麼都為IPV4,要麼都為IPV6,不允許交叉出現。#ifdef IPV6_SUPPORTED    #define IP_BYTES (4*4) // IPV6的地址長度#else    #define IP_BYTES 4     // IPV4的地址長度#endif////////////////////////////////////////////////////////////////////////////////SCHED_NAMESPACE_BEGIN/***  * 常量定義  */enum{INVALID_SERVICE_ID = 0,INVALID_SESSION_ID = 0,  // 無效的SessionIdSERVICE_ID_MAX = 100,    // 最大的Service ID值,取值從1開始SESSION_ID_MAX = 10000   // 最大的Session ID值,取值從1開始};// 按4位元組對齊#pragma pack(4)/***  * 分布式訊息Flags結構  * 為什麼Flags要單獨定義成一個struct,  * 是因為nuint32_t類型不支援位表達方式,  * 所以使用struct做一層轉換,以達到相同的目的  */typedef struct TDistributedMessageFlags{    // 使用union,方便操作    union Flags    {        uint32_t flags;        struct TFlagsBits        {            uint32_t ip_type:1;      // IP地址類型,取值為net::IP_TYPE_4或net::IP_TYPE_6            uint32_t reserved:31;    // 保留用的位        }flags_bits;    }flags;    TDistributedMessageFlags(uint32_t v)     :flags(v)    {    }}distribted_message_flags_t;/***  * 分布式訊息頭結構  */typedef struct TDistributedMessage{net::common_message_header header;     // 訊息頭    nuint32_t flags;                       // 標誌欄位    nuint32_t source_ip[IP_BYTES];         // 訊息源的IP地址,如果是IPV4地址,則N值為1,否則為4    nuint32_t destination_ip[IP_BYTES];    // 訊息目的地的IP地址,如果是IPV4地址,則N值為1,否則為4    nuint16_t source_port;                 // 訊息源的連接埠號碼    nuint16_t destination_port;            // 訊息目的地的連接埠號碼    nuint32_t source_service_id;           // destination_Service ID    nuint32_t destination_service_id;      // 訊息目的地的Service ID    nuint32_t source_session_id;           // destination_Session ID    nuint32_t destination_session_id;      // 訊息目的地的Session ID    nuint32_t source_sequence_number;      // 序號,從0開始,依次遞增,直到重來,用於解決類似於TCP中的timed_wait問題    nuint32_t destination_sequence_number; // 序號,從0開始,依次遞增,直到重來,用於解決類似於TCP中的timed_wait問題    nuint32_t source_thread_affinity;      // 線程親和值,為的是和線程建立綁定關係    nuint32_t destination_thread_affinity; // 線程親和值,為的是和線程建立綁定關係    char data[0];                          // 訊息內容    std::string to_string() const;}distribted_message_t;#pragma pack()inline bool is_valid_service(uint32_t service_id){return service_id > 0&& service_id <= SERVICE_ID_MAX;}inline bool is_valid_session(uint32_t session_id){return session_id > 0&& session_id <= SESSION_ID_MAX;}////////////////////////////////////////////////////////////////////////////////SCHED_NAMESPACE_END

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.