高性能 Golang 并发包 -- ant
高性能 Golang 并发包 – ant
接触了很多比较热的并发包和小工具,比如之前我写到的Tunny,Machinery等等,我觉得设计的最好的还是 ant,当然Tunny更轻便,Machinery主打分布式并发处理各自有自身优势,但如果你要选一个单服务进行的生产消费的并发处理包,那一定是 ant。
ant 把很多性能优化都做到了很好,在高并发种容易出现的内存泄露,GC压力等问题都在设计上进行了很好的规避,让性能做到起飞。
下面我通过源码来和大家一起学习下它的一些精彩设计。
程序流程:ant 的主体是pool结构 ,pool结构管理着worker队列,worker是执行任务的最小单位。
生产者不断提交任务给pool,pool 进行任务的调度处理。
下面是整个包工作的流程图:
主体架构整个包设计的主体分为三层最上层是pool 接够,中层是queue结构,底层是worker结构。
处理任务的最小单位是worker 结构,queue其实就一个worker的队列,负责worker的调度和清理等工作,pool是最上层的结构也就是我们接触到的使用结构,pool主要负责并发数量控制,task发 ...
使用 Maxwell 订阅 MySQL binlog 同步至 Kafka
使用 Maxwell 订阅 MySQL binlog 同步至 Kafka
Maxwell 是一款开源的 MySQL binlog 数据同步工具,它可以实时解析 MySQL binlog,将数据变更事件转换为 JSON 格式,然后推送至 Kafka 等消息队列中。
它是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。实时读取MySQL 二进制日志 Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。
这篇文章尽量简单的描述关键步骤,具体的实践小例子我通过代码来给大家呈现了,我的代码用golang编写包括简单数据插入mysql到触发Maxwell生产信息并通过Kafka消费解析binlog数据代码中都有详细的说明哦
我的代码在这里
Mysql主从复制过程
Master 主库将改变记录,写到二进制日志(binary log)中
Slave 从库向 mysql master 发送 dump 协议,将 master 主库的 bin ...
程序员如何为女朋友做迪士尼攻略
程序员如何为女朋友做迪士尼攻略
身为一个程序员,我们每天大多时间对着计算机没有交际应酬,更不懂得浪漫与体贴。我能为女朋友做点什么呢?我是不是能用我的专业来帮女票做点事情。刚好女票生日计划去迪士尼玩,做攻略的重任就落到了我的身上。
我利用数据和逻辑科学的帮助女友生成了一份攻略,代码在这里
前言我在苦思冥想该怎么做攻略的时候看了很多小红书,视频,还有直播,我发现他们都会给出游玩攻略。但很可惜他们清一色的就是告诉你该以什么顺序去玩却不告诉你形成攻略的具体逻辑是什么,他们形成攻略的说辞基本就是靠经验,这对于我一个逻辑至上的程序员来说是不能忍受的。所有的up主都千篇一律的就是第一个冲翱翔地平线,第二个小矮人矿车。。。
我知道他们通过经验形成的逻辑点就是在最早的时间冲最火的项目,这样在主观感受上确实是可以节省更多时间。但最火的项目在早上不也一样是最火的?不也一样等的时间比其他的久,在所有项目都接近排队时长最短的黄金早晨时间项目排队耗费时间也是能否玩更多项目的关键。
我觉得可以根据多日的单项目不同时间点平均等待时间辅以一些算法来获取一个项目游玩优先级权重。
攻略思路在早8:00 - 9:00 时间 ...
深入理解 Docker
深入理解 Docker
随着云计算技术的发展,容器技术应运而生,他解决了大家在本地,测试,线上等不同环境下进行构建,部署的环境不统一的蛋疼问题,随之而来的是Kubernetes、微服务架构等新技术新思想这些技术不仅将各种繁琐的构建,部署环境问题完全隔离,我们的服务也向高可用, 可拓展的方向精进。
容器是如何解决环境统一性的问题的?有是如何做到统一环境的快速复制迁移的?带着这些问题我们来深入了解些容器(Docker)。
本文章为张磊老师的《深入剖析Kuernetes》容器部分的整合
Docker 是什么容器其实是一种沙盒技术。它可以让开发者将应用程序和依赖项打包成一个可移植的容器,从而实现快速部署、可移植性和可伸缩性。Docker 技术基于 Linux 容器(LXC)技术,通过隔离应用程序和依赖项的运行环境,使得应用程序在不同的计算机环境中能够保持一致的运行效果。
所谓 Docker 镜像,其实就是一个压缩包。但是这个压缩包里的内容,比 PaaS 的应用可执行文件 + 启停脚本的组合就要丰富多了。实际上,大多数 Docker 镜像是直接由一个完整操作系统的所有文件和目录构成的,所以这个 ...
Tunny 库源码深度解读
Tunny 库源码深度解读
Tunny 库是一个用于生成和管理goroutine池的Golang库,制定一个方法可以限制该方法并发量及控制生命周期。这是一个设计简单但功能强大且通用易用的库,之前我们说过 Machinery 库,该库功能当然强大的多,他支持分布式且支持不同任务的编排,Tunny就没有这种功能,但Tunny库异常简单轻量如果不是大型的事件推动型项目,那么Tunny就足够支持其场景。
本文解读一下Tunny库的源码并且对比 Machinery 库来总结下两位作者在设计通用场景功能时的不同思路。
源码解读架构我们先来看看Tunny 库的大体架构:
主体pool:123456789101112// Pool is a struct that manages a collection of workers, each with their own// goroutine. The Pool can initialize, expand, compress and close the workers,// as well as processing jobs with the w ...
Go 语言使用定时调度任务大杀器 — XXL-JOB
Go 语言使用定时调度任务大杀器 — XXL-JOB
XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
本文将以一个 gopher 的视角教你跳过 java 环境,做到仅仅使用 golang 也可以开箱即用,玩转 XXL-JOB。
XXL-JOB 使用文档
为什么要用XXL- JOB 在我看来可以替代我们系统中所有定时任务调度,因为定时任务的不可掌控,尤其是在分布式集群中。如果一个任务失败了那么我们首先无法即时发现,其次我们就算发现了也没法去重新触发他来解决问题,解决问题只能靠重启服务,但有的服务又不能随便重启,打个比方:行情服务,他一直在不断的接收数据流,重启势必造成数据丢失,丢失都还是好的重启服务还会造成数据堆积,消息队列阻塞,数据更新延迟,所以一旦这种服务的定时任务出现问题你只有任他发展。这个时候 XXL- JOB 这个应用就成了解决问题的大杀器。
定时及手动调度支持
它帮你承担了调度的任务,支持 cron 方式定义任务的定时调度,同时支持手动出发任务。
多种任务注册模式
主 ...
用 ETCD + NSQ 实现分布式数据分片处理(Golang)
用 ETCD + NSQ 实现分布式数据分片处理(Golang)
数据分片处理是提高服务数据处理速度的重要手段,而多服务分布式数据分片处理则在现代的云服务时代优势性更大,你不但可以通过这样的处理减少单体服务压力,提高数据处理速度,还可以进行服务的 动态横向拓展,在你的服务处理数据有压力时再不进行暂停当前服务的同时对服务进行动态扩展,从而提高处理性能,避免出现数据积压服务处理不及时的重大问题。
为什么要做分布式数据分片处理主要是因为可以动态扩容,试想一个大数据量高并发而且数据量会动态变化的项目你设计的服务不支持横向扩容会出现什么样可怕的问题,数据积压,丢失数据,你这个时候要进行纵向扩容将会导致一段时间数据缺失,用户无法访问,这个是不可容忍的,如果你的服务可以动态扩容,那么你发现数据量过大服务器压力过大时你只要增加一个Pod是不是很开心。
为什么使用ETCD + NSQETCD 本身是一个高可用的集群,保证数据的高可用和一致性。本身提供watch方法快速发现k v 变动从而及时响应且本身效率高广泛使用于服务注册发现等场景。下面是etcd的优势:
完全复制:集群中的每个节点都可以使用完整 ...
Go 语言分布式缓存 Groupcache -- 用法,源码深度解读
Go 语言分布式缓存 Groupcache – 用法,源码深度解读
groupcache是memcached作者Brad Fitzpatrick的另一kv cache项目,由于作者转 go 并对go语言情有独钟,所以作者本着‘intended as a replacement for memcached in many cases’ 的设计初衷设计了groupcache 。Redis等其他常用cache实现不同,groupcache并不运行在单独的server上,而是作为library和app运行在同一进程中。所以groupcache既是server也是client。
为什用,怎么用?还是老样子,我们先搞清楚为什么要用Groupcache,
Groupcache是一个轻量级的分布式缓存库,他的逻辑非常简单所以保证了他的轻量,但它却可以满足各种缓存中间件的功能,如防击穿,防穿透,防雪崩。我们之后会通过源码来解释他是如何做到这些的。同时因为其简单的逻辑保证其在消耗极少资源的情况下保持高性能。
有利一定会有弊,他在应用上会受一些限制,接下来我们讨论怎么用比较好。
要搞清楚这一点我们需要看下 ...
Go 语言分布式任务处理器 Machinery -- 架构,源码详解篇
Go 语言分布式任务处理器 Machinery – 架构,源码详解篇
你是否因为一个复杂的分布式并发场景且需要进行任务编排而写了一个逻辑复杂,各种耦合,又臭又长的代码?代码跑起来各种bug 浪费时间精力,其他人也看不懂没法接手?
其实 Go 语言有现成的轮子来辅助你实现复杂的逻辑,让你的代码优美,低耦合,鲁棒性强,少bug。这个就是分布式队列Machinery
本文深度结合源码讲解Machinery的使用方法和需要注意的坑位,让你从根上掌握Machinery的使用方法。
优势我们为什么要使用任务处理器?其实引入一个轮子之前想清楚他的优势是十分必要的,如果不充分了解他的优势那么很可能就为了用而用,很多场景可能使用它反而浪费了系统性能。我们就先来看下Machinery 的优势:
Machinery 支持定义串行,并行 ,延迟,重试,定时等各种任务执行方式,并且你可以在定义好任务执行方式后对多个任务进行编排,调任务整先后完成顺序,他还对数据处理结果进行缓存,处理结果出错可以再次处理,增加程序的鲁棒性。访问结果可以直接查询缓存,提高响应速度:
简化代码:其实简化代码是引入 Machin ...
K8s编排对象 -- POD
K8s编排对象 – POD
Pod,是 Kubernetes 项目中最小的 API 对象。如果换一个更专业的说法,我们可以这样描述:Pod,是 Kubernetes 项目的原子调度单位。
引入POD的意义“Namespace 做隔离,Cgroups 做限制,rootfs 做文件系统”这样的“三句箴言”可以朗朗上口了,为什么 Kubernetes 项目又突然搞出一个 Pod 来呢?
要回答这个问题,我们要先弄清一个问题:容器的本质到底是什么?
容器的本质是进程!没错。容器,就是未来云计算系统中的进程;容器镜像就是这个系统里的“.exe”安装包。那么Kubernetes 呢?Kubernetes 就是操作系统!
弄清这些后,就让我们登录到一台 Linux 机器里,执行一条如下所示的命令:
1pstree -g
这条命令的作用,是展示当前系统中正在运行的进程的树状结构。
123456789101112131415161718systemd(1)-+-accounts-daemon(1984)-+-{gdbus}(1984) | `-{gm ...