熊喵君的博客

Thinking will not overcome fear but action will.

golang-LRU 缓存设计与实现(二)

分析 go-zero 中的进程内缓存库 collection.Cache 实现

0x00 开篇 本文分析下 go-zero 框架的 LRU-cache 组件 实现,此库有如下特性: 缓存增删改,自动失效,可以指定过期时间(基于 TimeWheel 时间轮策略实现了 TTL 过期的机制,很精妙);缓存大小限制,可以指定缓存个数 LRU 支持 缓存命中率统计 并发安全,解决缓存击穿问题 解决缓存击穿问题(syncx.SingleFlight 机制...

一种基于 TTY-based 的 kubernetes console 实现思路

如何使用 ssh 协议打通 kubernetes EXEC 登录?

0x00 开篇 网上基于 websocket 打通 kubernetes pod 的实现非常多,但是受限于 webconsole 的不便利性,这边文章来分析下如何使用 SSH 方式打通 kubernetes 的登录 Kubectl exec 的原理简介 通过 kubectl exec 进行容器的数据流如下: 0x01 实现思路 1、remotecommand 暴露的 E...

CAP 分析 && 实战:Gossip 协议

AP 协议:gossip && hashicorp/memberlist 分析

0x00 前言 前文 Etcd 最佳实(踩)践(坑) 中,了解 CAP 定理中,满足 AP 的典型协议就是 Gossip,本文就介绍下该协议。 Gossip protocol 也叫 Epidemic Protocol (流行病协议),是一种 去中心化、容错并保证最终一致性的协议;其基本思想是通过不断的和集群中的节点 Gossip 交换信息,经过 O(log(N)) 个回合, Goss...

分布式链路追踪(OpenTracing)之应用篇

使用 http/gin 构建 OpenTracing 机制

0x00 前言 前文 微服务基础之链路追踪(OpenTracing) 介绍了分布式链路追踪的理论知识,本文基于 net/http、gin 等库来构建客户端到服务端的 OpenTracing 实践(使用 jaeger 接入) APM 就是跟踪一个 traceId 在多个微服务中的传递并记录。在进入第一个服务的时候,就生成一个 traceId,接下来这个 traceId 将跟随整个微服务...

Golang 中的错误处理

如何优雅的处理 Golang 错误以及 gRPC 的错误

0x00 前言 本文总结下如何优雅的处理 golang 的错误: 本地 error gPRC 中的错误 再次明确下,golang 中的 error 只是简单的接口,任何实现了 Error() 方法的 struct 都可以用来处理错误信息。 // The error built-in interface type is the conventional interface ...

数据结构与算法回顾(五):golang 的 container 包

list、heap 和 ring

0x00 前言 golang 的标准库 container 中,提供了 heap/list/ring 的实现。本文简单分析下实现和应用。 0x01 heap 以 minheap 最小二叉堆为例,堆具有以下特性: 任意节点小于它的所有子孙节点,最小节点在堆的根上(堆序性) 堆是一棵完全树(complete tree):即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右...

Golang 的分布式缓存库:GroupCache 分析

分析一个 GroupCache 的应用

0x00 前言 groupcache 是一个分布式缓存库,支持多节点互备热数据,有良好的稳定性和较高的并发性。测试用例,可以参考此文章:Playing with groupcache;此外,还可以参考作者的幻灯片:dl.google.com: Powered by Go 先前讨论缓存更新时,分布式场景下需要解决 缓存更新导致的缓存一致性问题,而 GroupCache 仅支持外部 ge...

数据结构与算法回顾(三):时间轮

一种高效的定时器算法实现(简单时间轮)

0x00 前言 时间轮是用来解决海量百万级定时器(或延时)任务的最佳方案,linux 的内核定时器就是采用该数据结构实现。本文介绍 go-zero 框架中时间轮的实现及使用场景。 应用场景 自动删除缓存中过期的 Key:缓存中设置了 TTL 的 kv,通过把该 key 对应的 TTL 以及回调方法注册到 timewheel,到期直接删除 延时任务,将任务注册到 timewh...

数据结构与算法回顾(八):海量整数排序的分治式解决思路

一道 pingcap 的算法题目

0x00 前言 问题:实现一个 16M 大小的整数 int64 的数组排序,如何实现?采用多路归并方式实现 0x01 多路归并排序 先简单回顾下,多路归并排序(Multi-way merge sort)是归并排序的一种扩展,它可以同时合并多个有序数组。归并排序的基本思想是将两个有序数组合并成一个有序数组,而多路归并排序是将 k 个有序数组合并成一个有序数组。多路归并排序在处理大...

prometheus 查询 && 应用实践(进阶篇)

如何更好的使用 prometheus(With PromQL)

0x00 前言 前文 理解 Prometheus 的基本数据类型及应用(基础篇) 梳理了 Prometheus 的应用基础,本文梳理下 prometheus 查询及指标应用的最佳实践以及 PromQL 使用等 0x01 相关概念回顾 时序数据库 采样样本 Prometheus 会定期去对数据进行采集,每一次采集的结果都是一次采样样本(sample),这些数据会被存储为时间序...