MOOON分布式消息结构

 MOOON主要消息结构如下,缺点是消息本身占用字节数较多:

  
  
  
  
  1. // 为何要做IPV4和IPV6区分? 
  2. // 是因为如果只需要支持IPV4,则一个IP地址只需要用一个4字节表示, 
  3. // 这样源和目的IP地址共节省了24字节; 
  4. // 支持IPV6时,同时兼容IPV4,但对于IPV4多浪费24字节; 
  5. // 源和目标IP,要么都为IPV4,要么都为IPV6,不允许交叉出现。 
  6. #ifdef IPV6_SUPPORTED 
  7.     #define IP_BYTES (4*4) // IPV6的地址长度 
  8. #else 
  9.     #define IP_BYTES 4     // IPV4的地址长度 
  10. #endif 
  11.  
  12. //////////////////////////////////////////////////////////////////////////////// 
  13. SCHED_NAMESPACE_BEGIN 
  14.  
  15. /*** 
  16.   * 常量定义 
  17.   */ 
  18. enum 
  19.     INVALID_SERVICE_ID = 0, 
  20.     INVALID_SESSION_ID = 0,  // 无效的SessionId 
  21.     SERVICE_ID_MAX = 100,    // 最大的Service ID值,取值从1开始 
  22.     SESSION_ID_MAX = 10000   // 最大的Session ID值,取值从1开始 
  23. }; 
  24.  
  25. // 按4字节对齐 
  26. #pragma pack(4) 
  27.  
  28. /*** 
  29.   * 分布式消息Flags结构 
  30.   * 为什么Flags要单独定义成一个struct, 
  31.   * 是因为nuint32_t类型不支持位表达方式, 
  32.   * 所以使用struct做一层转换,以达到相同的目的 
  33.   */ 
  34. typedef struct TDistributedMessageFlags 
  35.     // 使用union,方便操作 
  36.     union Flags 
  37.     { 
  38.         uint32_t flags; 
  39.         struct TFlagsBits 
  40.         { 
  41.             uint32_t ip_type:1;      // IP地址类型,取值为net::IP_TYPE_4或net::IP_TYPE_6 
  42.             uint32_t reserved:31;    // 保留用的位 
  43.         }flags_bits; 
  44.     }flags; 
  45.  
  46.     TDistributedMessageFlags(uint32_t v) 
  47.      :flags(v) 
  48.     { 
  49.     } 
  50. }distribted_message_flags_t; 
  51.  
  52. /*** 
  53.   * 分布式消息头结构 
  54.   */ 
  55. typedef struct TDistributedMessage 
  56.     net::common_message_header header;     // 消息头 
  57.     nuint32_t flags;                       // 标志字段 
  58.  
  59.     nuint32_t source_ip[IP_BYTES];         // 消息源的IP地址,如果是IPV4地址,则N值为1,否则为4 
  60.     nuint32_t destination_ip[IP_BYTES];    // 消息目的地的IP地址,如果是IPV4地址,则N值为1,否则为4 
  61.  
  62.     nuint16_t source_port;                 // 消息源的端口号 
  63.     nuint16_t destination_port;            // 消息目的地的端口号 
  64.  
  65.     nuint32_t source_service_id;           // destination_Service ID 
  66.     nuint32_t destination_service_id;      // 消息目的地的Service ID 
  67.  
  68.     nuint32_t source_session_id;           // destination_Session ID 
  69.     nuint32_t destination_session_id;      // 消息目的地的Session ID 
  70.  
  71.     nuint32_t source_sequence_number;      // 序列号,从0开始,依次递增,直到重来,用于解决类似于TCP中的timed_wait问题 
  72.     nuint32_t destination_sequence_number; // 序列号,从0开始,依次递增,直到重来,用于解决类似于TCP中的timed_wait问题 
  73.  
  74.     nuint32_t source_thread_affinity;      // 线程亲和值,为的是和线程建立绑定关系 
  75.     nuint32_t destination_thread_affinity; // 线程亲和值,为的是和线程建立绑定关系 
  76.  
  77.     char data[0];                          // 消息内容 
  78.  
  79.     std::string to_string() const
  80. }distribted_message_t; 
  81.  
  82. #pragma pack() 
  83.  
  84. inline bool is_valid_service(uint32_t service_id) 
  85.     return service_id > 0 
  86.         && service_id <= SERVICE_ID_MAX; 
  87.  
  88. inline bool is_valid_session(uint32_t session_id) 
  89.     return session_id > 0 
  90.         && session_id <= SESSION_ID_MAX; 
  91.  
  92. //////////////////////////////////////////////////////////////////////////////// 
  93. SCHED_NAMESPACE_END 

示意图:

 

你可能感兴趣的:(mooon)