熊喵君的博客

Thinking will not overcome fear but action will.

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),这些数据会被存储为时间序...

Mysql 项目应用笔记(二)

Mysql 索引与优化总结 - InnoDB 篇

0x00 前言 本篇介绍下 InnoDB 引擎的索引使用及优化。重点关注几个问题: 索引的原理 如何建索引 如何使用索引 如何调优? 索引的本质 索引就像一本书的目录。而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点。这样就帮助用户有效地提高了查找速度。所以,使用索引可以有效地提高数据库系统的整体性能。 索引分类 从用户使用的角度:单列...

Raft 协议分析与实战:构建自己的分布式缓存

hashicorp/raft的应用实战与分析

0x00 前言 0x01 验证 按照如下组成一个raft集群: raft节点 端口 peer端口 存储目录 Node-1 6000 7000 node0 Node-2 6001 7001...

数据结构与算法回顾(四):环形内存缓冲区 ringbuffer

一种高效进程间通信的机制:环形内存缓冲区

0x00 前言 环形队列是一种 FIFO 数据结构,适合内存 / 共享内存的存储场景,是项目中解耦模块间(进程间)通信的可用手段之一。通常也称为 Ring Buffer、Circular Buffer。下图描绘了一个 A 24-byte keyboard circular buffer: 0x01 实现 ringbuffer 的实现主要依赖于读写指针的移动(head-ReadIndex...

微服务项目中的自适应(Adaptive)技术分析与应用

分析 go-zero 框架中自适应技术的运用

0x00 前言 本篇文章分析下自适应技术在微服务领域的实践,以 go-zero项目 为例,此项目非常值得借鉴。 0x01 背景 自适应解决了什么问题呢?以 circuitbreaker熔断器 而言,可选的配置参数非常多,和系统预期吞吐 / qps 的经验值都会有关系,配置合适的参数是一件很麻烦的事情。所以,通过自适应算法能让我们尽量少关注参数,只要简单配置就能满足大部分场景。 0x02 ...