
golang
mingkai_beijing
这个作者很懒,什么都没留下…
展开
-
图解RingBuffer数据结构
本篇介绍一种简单高效的数据缓存结构:RingBuffer, 这种结构实现起来只需要几行代码即可,但使用场景却很广泛,比如在Linux内核中网络数据包的缓存,系统日志的存储等多处使用过该结构。同时它也被广泛的应用于异步通信以及嵌入式设备中,提供高效的数据缓存读写操作。1. 实现原理RingBufferr实现比较简单,基本上只需要一个数组结构,外加两个用于存储位置信息的变量即可。其中的数组采用固定大小容量,便于重用内存,不会出现动态内存不断分配和销毁的情况,这对于一些GC类编程语言来说,大...原创 2020-07-27 22:13:11 · 8301 阅读 · 1 评论 -
图解七大排序算法
“排序是计算机的核心内容。事实上,从很多方面看,如果没有排序,计算机就不会变成现实。”《算法之美:指导工作与生活的算法》排序算法,或许是我们日常最常见也是使用频率最多的算法。比如你在电商网站买东西,推荐商品往往基于相似度或者基于销售量等维度排序。我们每日接收的邮件是程序中按照时间进行排序好的,我们点外卖时候推送的列表是按照评分和地理位置进行排序的。搜索引擎检索内容也是按照一定的相似度算法进行排序好才呈现给你的,所以搜索引擎实际上就是一个排序引擎。本篇文章通过图例的方式逐一讲...原创 2020-07-06 10:46:41 · 4024 阅读 · 1 评论 -
三种字符串查找算法的Go实现
字符串查找就是给定一段文字,查找所有包含特定单词的方式,当我们使用网站浏览信息的时候,用Ctr+F搜索网页, 或在linux上使用grep查询日志文件中的特殊字符串都是属于这类模式。所以算是一种比较常见的算法,本文将总结一些字符串查找算法常见的实现方式,以及如何用Go语言实现该算法。主要的算法分为三种:暴力遍历算法KMP算法BM算法1. 暴力遍历算法暴力遍历算法,简单来说就是通过一...原创 2019-12-02 09:41:00 · 1498 阅读 · 0 评论 -
关于一个子集判断函数的性能分析
最近遇到一个需求,需要做基于日志标签的实时分发,基本原理是一条日志传递到程序后,系统采集该日志的标签属性,跟后台的预定义的多个规则标签集合进行匹配,如果Ok则将规则与该日志绑定,等待后期的处理。比如一条业务日志具有标签: dns, usa, 192.168.0.1, 规则库的当前规则示例:规则1 : dns规则2: dns, usa规则3: dns, usa, 192.168.0.2...原创 2019-11-20 13:08:13 · 347 阅读 · 0 评论 -
谈Go语言中并发Map的使用
最近开发Go语言总是遇到哈希表的使用,在高并发下如何保证读写的安全性尤为重要,假如不了解的情况下,使用原生map的话,性能倒是很高,但在多个goroutine操作下就会遇到并发读写的错误出现。为了并发安全,修改读写访问,每次都写都加入读写锁,又会导致性能的大幅度下降,安全和性能实在是难以同时兼得。这里我们梳理下Go当前访问Map的几种方式,并给出实际的测试实例和性能表现。1. 标准库map结构...原创 2019-09-02 10:51:39 · 1923 阅读 · 1 评论 -
使用textfile收集监控指标
node_exporter本身除了收集系统指标以外,还可以通过textfile模块来采集用户自己生成的指标,这对于系统监控提供了更多的使用空间和场景. 比如我们通过shell脚本采集的数据结果就可以通过该途径传递出去,用于绘图或告警等. 默认情况下node_exporter将启用textfile组建,但是需要设置一个采集的路径,所有的生成的监控指标将放在该目录下,并以.prom文件名结尾. 同...翻译 2018-08-08 14:29:27 · 4880 阅读 · 0 评论 -
Prometheus AlertManager代码阅读笔记 Notify组件
Notify组件定义了路由处理过程中的receiver pipeline(本文不包含Silence和Inhibit部分), 包含等待间隔的WaitState,去重处理DedupStage,重试处理RetryStage和SetNotifyStage,实现上类似于中间件的方式,一层层的顺序处理。创建pipeline的函数定义如下:// createStage creates a pipeline...原创 2018-06-12 11:29:46 · 2739 阅读 · 0 评论 -
Prometheus AlertManager代码阅读笔记
AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户。系统的整体设计图如下面所示,并且支持HA高可用部署。AlertManager接收告警Prometheus或者告警发送系统可以通过API的方式发送给Alertmanager,收到告警后将告警分别存储在AlertProvider中(当前实现是存储在内存中,可以通过接口的方式自行实现其...原创 2018-06-11 16:59:02 · 3357 阅读 · 1 评论 -
blackbox_exporter源码阅读
blackbox_exporter是Prometheus监控系统中用于在agent机器上采集http,DNS,ICMP相关信息,通过prometheus传递的参数和target,映射到对应的agent的web接口上进行处理。比如下面的采集配置来自于prometheus的配置文件 scrape_configs: - job_name: 'blackbox' metrics_path:...原创 2018-04-19 10:59:37 · 3144 阅读 · 3 评论 -
使用golang编写Prometheus Exporter
Exporter是基于Prometheus实施的监控系统中重要的组成部分,承担数据指标的采集工作,官方的exporter列表中已经包含了常见的绝大多数的系统指标监控,比如用于机器性能监控的node_exporter, 用于网络设备监控的snmp_exporter等等。这些已有的exporter对于监控来说,仅仅需要很少的配置工作就能提供完善的数据指标采集。有时我们需要自己去写一些与业务逻辑...原创 2018-04-19 10:32:39 · 26196 阅读 · 1 评论 -
bolt:一个纯Go实现的KV数据库
简介bolt是一个纯go语言实现的键值数据库,支持完全的ACID实务操作,尽管不像SQLite那样有完善的查询语言,但是接口简单易用。bolt本身通过使用一个内存映射的磁盘文件来管理数据,逻辑清晰,接口简单易用。下面代码就是bolt提供的简单的操作接口示例。 db, err := bolt.Open("example.db", 0600, nil) if err != nil { lo翻译 2017-11-24 22:52:26 · 8432 阅读 · 0 评论 -
bufio模块实例及代码分析
bufio模块是golang标准库中的模块之一,主要是实现了一个读写的缓存,用于对数据的读取或者写入操作。该模块在多个涉及io的标准库中被使用,比如http模块中使用buffio来完成网络数据的读写,压缩文件的zip模块利用bufio来操作文件数据的读写等。本篇文章主要是通过两个例子简单的介绍bufio的一些功能和实现方式,供大家参考。复制文件复制一个文件内容到另一个文件中,我们如果直接使用iout原创 2017-01-16 15:00:40 · 890 阅读 · 0 评论 -
使用Go语言完成文件夹的MD5计算
案例需求:我们的监测系统会定期的检查配置文件的变动,这些配置文件放置在一个独立的文件夹下面,我们可以通过对于整个的文件夹内所有文件进行md5的计算来完成监测,本文就通过Go语言实现了一个命令行工具,完成上述的需求。1. 单一文件的md5计算我们首先将需求任务进行分解,既然需要计算文件夹下的所有文件md5值,我们必须先考虑如何实现单一文件的md5值计算。下面就是一个简单的md5求值程序,这里我们通过参原创 2016-12-20 14:14:23 · 4192 阅读 · 0 评论 -
Golang日志库glog源码阅读笔记
glog包是google推出的一个golang的日志库,提供丰富的接口函数,提供不同级别的日志写入和日志文件的轮转,可将日志打印到终端或者写入到指定的路径文件中。本篇blog主要是包含了如何使用glog以及源代码中的一些片段笔记。如何使用glog创建项目目录,使用mkdir创建以下的目录结构/LearningGo$ tree -L 1.├── bin├── pkg└── src3 dire原创 2016-12-28 15:25:48 · 3628 阅读 · 0 评论 -
使用Golang的Context管理上下文
golang 1.7版本中context库被很多标准库的模块所使用,比如net/http和os的一些模块中,利用这些原生模块,我们就不需要自己再写上下文的管理器了,直接调用函数接口即可实现,利用context我们可以实现一些比如请求的声明周期内的变量管理,执行一些操作的超时等等。保存上下文对象这里我们通过一个简单的例子来看一下如何使用context的特性来实现上下文的对象保存,这里我们写了一个简单的原创 2016-12-21 12:00:57 · 20486 阅读 · 2 评论 -
Go语言的包管理
接触go语言之前写了一些nodejs的App,所以对于npm的包管理方式还是觉得挺方便的,但转移到go语言平台后,由于官方并未推出自己的包管理工具,所以只能借助于第三方的一些工具完成,本篇主要介绍一些目前使用的go的包依赖管理工具,用来协助程序的开发.gpmgpm工具使用来完成go依赖库下载的工具,非常的简单,只需要创建自己的一个Godeps文件,并把依赖的包写到文件中,这样我们就可以直接通过命令行原创 2016-11-21 09:17:01 · 1788 阅读 · 0 评论