MOOON分布式消息结构
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, // 无效的SessionId
SERVICE_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
示意图:
分类:
mooon
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义