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 

示意图:




    本文转自eyjian 51CTO博客,原文链接:http://blog.51cto.com/mooon/948302如需转载请自行联系原作者


相关文章
|
网络协议
MOOON分布式消息结构
MOOON主要消息结构如下,缺点是消息本身占用字节数较多: 点击(此处)折叠或打开 /***   * 分布式消息头结构   */ typedef struct TDistributedMessage {     net::common_me...
744 0
|
1月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
154 0
|
1月前
|
NoSQL 关系型数据库 MySQL
分布式锁(redis/mysql)
分布式锁(redis/mysql)
58 1
|
3月前
|
NoSQL Java 测试技术
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
161 1
|
3月前
|
存储 缓存 NoSQL
【分布式】Redis与Memcache的对比分析
【1月更文挑战第25天】【分布式】Redis与Memcache的对比分析
|
3月前
|
监控 NoSQL Linux
【分布式】Redis的持久化方案解析
【1月更文挑战第25天】【分布式】Redis的持久化方案解析
|
29天前
|
NoSQL Java Redis
如何通俗易懂的理解Redis分布式锁
在多线程并发的情况下,我们如何保证一个代码块在同一时间只能由一个线程访问呢?
37 2
|
1月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
60 0
|
1月前
|
人工智能 监控 NoSQL
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
81 4
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统

热门文章

最新文章