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

示意图:

本文出自 “飞月” 博客,请务必保留此出处 http://mooon.blog.51cto.com/1246491/948302

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索线程
, ipv4
, 地址
, 字节
, 消息
32
分布式消息中间件、分布式消息队列、分布式消息系统、java 分布式消息队列、分布式事务 消息队列,以便于您获取更多的相关知识。

时间: 2024-08-07 12:52:42

MOOON分布式消息结构的相关文章

OSSIM中分布式消息队列应用

 OSSIM中分布式消息队列应用   1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以下系统),无法满足海量日志分析要求.在OSSIM 4.4以后的系统中增加了中间件RabbitMQ,可通过RabbitMQ将系统中各组件解除耦合,避免了系统中运行模块的影响(例如MySQL的写操作等),这样设计可实现分布式日志分析平台的要求. OSSIM中使用RabbitMQ后,可以利用消息队列耦

C#分布式消息队列 EQueue 2.0 发布啦

前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地址:https://github.com/tangxuehua/equeue EQueue相关文档:http://www.cnblogs.com/netfocus/category/598000.html EQueue Nuget地址:http://www.nuget.org/packages/eq

【双11背后的技术】万亿级数据洪峰下的分布式消息引擎

选自<不一样的技术创新--阿里巴巴2016双11背后的技术>,全书目录:https://yq.aliyun.com/articles/68637 本文作者:冯嘉.誓嘉.尘央.牟羽  前言 通过简单回顾阿里中间件(Aliware)消息引擎的发展史,本文开篇于双11消息引擎面临的低延迟挑战,通过经典的应用场景阐述可能会面临的问题 - 响应慢,雪崩,用户体验差,继而交易下跌.为了应对这些不可控的洪峰数据,中间件团队通过大量研究和实践,推出了低延迟高可用解决方案,在分布式存储领域具有一定的普适性.在此

万亿级数据洪峰下的分布式消息引擎

前言 通过简单回顾阿里中间件(Aliware)消息引擎的发展史,本文开篇于双11消息引擎面临的低延迟挑战,通过经典的应用场景阐述可能会面临的问题 - 响应慢,雪崩,用户体验差,继而交易下跌.为了应对这些不可控的洪峰数据,中间件团队通过大量研究和实践,推出了低延迟高可用解决方案,在分布式存储领域具有一定的普适性.在此基础上,通过对现有有限资源的规划,又推出了分级的容量保障策略,通过限流.降级,甚至熔断技术,能够有效保障重点业务的高吞吐,成功的支撑集团包括海外业务平缓舒畅地度过双11高峰.与此同时,

分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

一.分布式消息总线以及基于Socket的实现      在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.NET Socket Tcp 技术实现的分布消息总线,也是一个简单的发布订阅框架:     并且以案例的形式为大家演示了如何使用这个分布式消息总线架构发布订阅架构模式的应用程序,在得到各位同仁的反馈的同时,大家也非常想了解订阅者离线的情况,即支持离线构发布订阅框架. 二.离线架构     

解读OpenMessaging开源项目,阿里巴巴发起首个分布式消息领域的国际标准

10月14日,阿里巴巴2017杭州·云栖大会,Linux 基金会Leadship团队 CNCF 执行总裁 Dan Kohn和阿里巴巴集团研究员蒋江伟共同宣布了分布式消息领域的国际标准OpenMessaging开源项目正式入驻Linux基金会,这也是国内首个在全球范围发起的分布式计算领域的国际标准. 据悉,OpenMessaging项目由阿里巴巴发起,与雅虎.滴滴出行.Streamlio公司共同参与创立,项目意在创立厂商无关.平台无关的分布式消息及流处理领域的应用开发标准.据发起人介绍,随着标准的

大型网站架构系列:分布式消息队列(一) (转)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要

大型网站架构系列:分布式消息队列(一)

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统). 本次分享大纲 消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务(见第二篇:大型网站架构系列:分布式消息队列(二)) 常用消息队列(见第二篇:大型网站架构系列:分布式消息队列(二)) 参考(推荐)资料(见第二篇:大型网站架构系列:分布式消息队列(二)) 本次分享总结(见第二篇:大型网站架构系列:分布式消息队列(二)) 一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要

EQueue - 一个C#写的开源分布式消息队列的总体介绍

前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue.这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本.一方面可以通过写这个队列让自己更深入的掌握消息队列的一些常见问题:另一方面也可以用来和enode集成,为enode中的command和domain event的消息传递提供支持.目前在.net平台,比较好用的消息队列,最常见的是微软的MSMQ了吧,还有像rabbitmq也有.net的client端.这