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 ...
K8s的设计理念与架构
K8s的设计理念与架构设计理念Kubernetes 项目的理论基础则要比工程实践走得靠前得多,这当然要归功于 Google 公司在 2015 年 4 月发布的 Borg 论文了。Borg 系统,一直以来都被誉为 Google 公司内部最强大的“秘密武器”。虽然略显夸张,但这个说法倒不算是吹牛。因为,相比于 Spanner、BigTable 等相对上层的项目,Borg 要承担的责任,是承载 Google 公司整个基础设施的核心依赖。在 Google 公司已经公开发表的基础设施体系论文中,Borg 项目当仁不让地位居整个基础设施技术栈的最底层。
Kubernetes 项目在 Borg 体系的指导下,体现出了一种独有的“先进性”与“完备性”,而这些特质才是一个基础设施领域开源项目赖以生存的核心价值。
为了更好地理解这两种特质,我们不妨从 Kubernetes 的顶层设计说起。
首先,Kubernetes 项目要解决的问题是什么?编排?调度?容器云?还是集群管理?实际上,这个问题到目前为止都没有固定的答案。因为在不同的发展阶段,Kubernetes 需要着重解决的问题是不同的。但是,对于大多数 ...
Go 语言玩转Redis (二):数据结构与应用--字符串
Go 语言玩转Redis (二):数据结构与应用–字符串
第二到十一章节介绍Redis的数据结构与用法,包括上节说的字符串、散列、列表、集合、有序集合、HyperLogLog、位图、流、地理坐标等,我都会介绍其本身的基本命令及如何通过Go语言来调用。在详细介绍完后,我会带入一些使用场景并使用Go语言来实现,帮助大家和我更好的理解该数据结构。
其中Go语言的部分都会对应我github的链接,Go语言客户端的建立在(一)中有解释。
字符串字符串(string)键是Redis最基本的键值对类型,这种类型的键值对会在数据库中把单独的一个键和单独的一个值关联起来,被关联的键和值既可以是普通的文字数据,也可以是图片、视频、音频、压缩文件等更为复杂的二进制数据。
Redis为字符串键提供了一系列操作命令,通过使用这些命令可以:
为字符串键设置值。
获取字符串键的值。
在获取旧值的同时为字符串键设置新值。
同时为多个字符串键设置值,或者同时获取多个字符串键的值。
获取字符串值的长度。
获取字符串值指定索引范围内的内容,或者对字符串值指定索引范围内的内容进行修改。
将一些内容追加到字符串 ...
Go语言玩转Redis (一):聊聊 Redis 的学习体系
Go语言玩转Redis (一):聊聊 Redis 的学习体系
Redis 是一个开源内存数据结构存储器,经常用作数据库、缓存以及消息代理等。为什么要写一个Go使用的Redis的专题呢?因为Redis 我们平时经常用,但很多时候使用姿势不对,或是突然忘记某种场景该如何使用Redis实现。当需要程序快速响应的时候使用Redis做数据存储获取是不二的选择,这个专题就是想记录下Redis的框架体系,使用方式,场景,正确使用姿势等,便于之后的查询及逻辑构建
这个专题主要是基于 黄建宏老师的 《Redis 使用手册》一书,基于该书的讲解框架,结合Go语言的调用代码实例,及我自己的一些使用场景积累及说明写下。
Redis 的学习框架及特色
学习框架数据结构与应用Redis核心的9种数据结构,列举了操作这些数据结构的众多命令及其详细信息,融合 Golang 调用 Redis命令构建应用示例。通过这些示例,进行场景经验的积累。
附加功能Redis在数据结构的基础上为用户提供的额外功能,包括管理数据结构的数据库管理功能和自动过期功能,将数据结构持久化至硬盘从而避免数据丢失的持久化功能,提高多条命令执行效 ...
Go 流水线设计模式
Go 流水线设计模式
该文章为微信公众号 微服务实践 中的一篇文章,作者主要对 java 的流式处理进行了 Go 语言的实现及解释,流式处理可以说是模仿了工厂的流水线,数据抽象成原料,将不同的数据处理抽象成了流水线上的每一个操作。Rob Pike 在讲解 Go 语言为什么要引入语言级别的并发控制时说唯有引入并发才能描述现实世界上的种种行为。当时我就大受启发,发现代码确实是现实生活一种抽象。这篇文章可以说是对流水线行为的代码实现了。作者对于 Go 语言的数据流处理,功能架构等的理解都非常透彻,我把这篇文章收录进来希望对大家有帮助。
什么是流处理如果有 java 使用经验的同学一定会对 java8 的 Stream 赞不绝口,极大的提高了们对于集合类型数据的处理能力。
1234int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight()) .sum();
Stream 能让我们支持 ...