实时监控Cat之旅~分布式消息树的实现原理与测试

简介:

大众点评的老吴在InfoQ上讲了Cat之后,有不少同仁开始关注这个实时监控系统,但学习的文章甚少,在GitHub上也是一言代过,给我们这些开发人员留下了N多个疑问,一时间不知道去哪里问,向谁去问了,通常的百度和谷歌也不好使了,不过,好在经理推荐的QQ群帮了忙,认识了一些cat的前辈,经过他们的努力和我们共同的执着,终于把这块难啃的骨头啃动了!

参考代码:https://github.com/chinaboard/PureCat

完成的分布式消息树

分布式消息树实现的理论

Cat上下文,它与其它数据上下文,Http上下文,文件上下文的意思是一样的,都是指一种对象的封装,在cat里它的上下文由三个ID组成,ROOT,Parent和Child,他们类似于数据库里的联合主键,在让多个消息进行关联时,需要通过这些键值,我们在跨网络记录日志时,也需要把这三个对象传过去,在目标服务器上进行解析,然后这两个消息就组成了一个消息树了。

CatContext上下文内容

    /// <summary>
    /// cat上下文
    /// </summary>
    public class CatContext
    {
        /// <summary>
        /// 消息根ID
        /// </summary>
        public string CatRootId { get; set; }
        /// <summary>
        /// 上级消息ID
        /// </summary>
        public string CatParentId { get; set; }
        /// <summary>
        /// 当前消息ID
        /// </summary>
        public string CatChildId { get; set; }
        public string ContextName { get; set; }

        public CatContext(string contextName)
        {
            ContextName = contextName ?? Environment.MachineName;
        }
        public CatContext()
            : this(null)
        {

        }

    }

在进行分布式调用时,和java版的一样,用到了LogRemoteCallClient和LogRemoteCallServer这两个方法,前者是消息发起者调用,生成context后,将它序列化传到另外一个节点,这个节点在进行事务处理时会将自己包裹到调用方的事务时在,这也就是分布式消息树的实现原理。

需要注意的地方

在Cat里,有域的概念,即domain,我们在分布式消息树的几台服务器,必须处在同一个域下!

代码这样实现的

A节点核心代码

 /* client1 -> catContext -> client2
             * 
             */
            #region Cat实时监控

            PureCat.PureCat.Initialize();
            var context = PureCat.PureCat.DoTransaction("Do", "Test", func: () =>
           {

               PureCat.PureCat.NewEvent("Do", "Test");
               return PureCat.PureCat.LogRemoteCallClient("zzl");
           });

            var url = "http://localhost:4532/home/index";
            var handler = new HttpClientHandler() { };
            using (var http = new HttpClient(handler))
            {
                http.DefaultRequestHeaders.Add("catContext", Lind.DDD.Utils.SerializeMemoryHelper.SerializeToJson(context));
                var response = http.GetAsync(url).Result;
                var staus = response.IsSuccessStatusCode;
            }

            Console.ReadLine();
            #endregion

对于分布式消息树上下文的Name,我们可以使用Guid码生成,避免冲突!

B节点核心代码

       string reusult = Request.Headers.GetValues("catContext").FirstOrDefault();
            var cat = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<PureCat.Context.CatContext>(reusult);
            PureCat.PureCat.DoTransaction("Do", "Add", () =>
            {
                PureCat.PureCat.LogRemoteCallServer(cat);
                PureCat.PureCat.LogEvent("Do", "Add", "0", "hello distribute api123");
                PureCat.PureCat.LogError(new Exception());
            });

本文代码只是大叔的测试DEMO,之后还会对它进行封装与优化,敬请期待!

感谢您的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:实时监控Cat之旅~分布式消息树的实现原理与测试,如需转载请自行联系原博主。

目录
相关文章
|
16天前
|
存储 Dubbo Java
分布式 RPC 底层原理详解,看这篇就够了!
本文详解分布式RPC的底层原理与系统设计,大厂面试高频,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式 RPC 底层原理详解,看这篇就够了!
|
24天前
|
NoSQL Java API
分布式锁的实现原理与应用场景,5 分钟彻底搞懂!
本文详细解析了分布式锁的实现原理与应用场景,包括线程锁、进程锁和分布式锁的区别,以及分布式锁的四种要求和三种实现方式(数据库乐观锁、ZooKeeper、Redis)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
分布式锁的实现原理与应用场景,5 分钟彻底搞懂!
|
5月前
|
监控 NoSQL Java
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
分布式锁实现原理问题之ZooKeeper的观察器(Watcher)特点问题如何解决
|
5月前
|
NoSQL Java Redis
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
分布式锁实现原理问题之使用Redis的setNx命令来实现分布式锁问题如何解决
|
2月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
57 3
|
2月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
48 1
|
2月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
38 1
|
2月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
48 1
|
2月前
|
存储 缓存 数据处理
深度解析:Hologres分布式存储引擎设计原理及其优化策略
【10月更文挑战第9天】在大数据时代,数据的规模和复杂性不断增加,这对数据库系统提出了更高的要求。传统的单机数据库难以应对海量数据处理的需求,而分布式数据库通过水平扩展提供了更好的解决方案。阿里云推出的Hologres是一个实时交互式分析服务,它结合了OLAP(在线分析处理)与OLTP(在线事务处理)的优势,能够在大规模数据集上提供低延迟的数据查询能力。本文将深入探讨Hologres分布式存储引擎的设计原理,并介绍一些关键的优化策略。
115 0
|
7月前
|
存储 分布式计算 监控
Hadoop【基础知识 01+02】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】【分布式文件系统HDFS设计原理+特点+存储原理】(部分图片来源于网络)【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
313 2