熊喵君的博客

Thinking will not overcome fear but action will.

Golang 并发协程池实现分析(二)

分析 Fasthttp 的 goroutine pool

0x00 前言     FastHTTP 开源项目给出了一个性能极佳协程池的实现。 标准库 net.http 和 fasthttp 最大的不同可能就是 server 在处理连接的时候使用了协程池。在并发量大的时候,goroutine 数量巨大,runtime 层的上下文切换成本对性能有影响。而 fasthttp 用协程池规避了这个问题。fasthttp 并不是 One reque...

Kratos 源码分析:CGI 框架 BM (四)

分析基于 gin 改造的框架 blademaster:路由树构造算法

0x00 前言 本文着重介绍 bm(gin) 框架的路由树构造算法。 从前几篇文章已知,bm(gin) 框架也是使用了压缩的 Trie 树 作为路由 Path 的存储结构,本文分析根据设置的路由请求构建路由压缩 Trie 树的代码实现 细节。 相较于普通的 Trie 树,压缩版本的树能显著减少树的层数,同时因为每个节点上数据存储也比通常的 Trie 树要多。 0x01 HTT...

Golang 并发协程池实现分析(一)

分析一款非常典型的 goroutine pool 实现

0x00 前言 笔者初学 golang 之时,阅读过 Handling 1 Million Requests per Minute with Go 这篇关于协程池实现的文章。这篇文章给出的优化思路及代码实现非常之典型,可以作为一个通用的并发模型参考。本篇文章,简单回顾下其实现。 原文中要解决的问题就是下面这段代码: // Go through each payload and queue...

基于 Golang 实现的负载均衡网关:gobetween 分析(二)

Metrics 采集技巧

0x00 前言 本文分析下 gobetween 的 metrics 采集方式。 0x01 ReadWriteCount 采集 以 ReadWriteCount 采集为例,在 proxy.go 中,封装了类型 io.Copy方法,将入流量 readN、出流量 writeN 通过 channel 向上层发送(需要考虑下性能问题?) func Copy(to io.Writer, from...

Docker 日常实践汇总

工作中的经验总结

0x00 前言 本文介绍下日常工作的一些基础 Docker 使用 0x01 docker 镜像制作和镜像打包 问题 作为一个入门级用户,很有可能写出下面的 Dockerfile: From centos:7 LABEL maintainer="panda<ringbuffer@126.com>" ADD requirements.txt / ADD xxxx...

Kratos 源码分析:CGI 框架 BM (三)

分析 CGI 框架 blademaster:路由

0x00 前言 本篇文章看下 bm 框架的路由注册及搭配拦截器的路由调用的实现细节。先看下路由是如何注册的。 bm 框架的默认生成 模板: bm 默认创建的 Engine 对象及启动 initRouter 初始化路由的方法及路由(Group)的创建 bm 的 handler 方法 ping 和 howToStart 的定义( handler 方法默认传入 bm 的 Co...

gRPC 应用篇之客户端 Connection Pool

连接池的实现分析 && 是否需要 Tcp/gRPC 客户端连接池 ?&& 通用连接池的实现

0x00 连接池 之前分析过 go-redis 的连接池实现:Go-Redis 连接池(Pool)源码分析,在项目应用中,连接池的最大好处是减少 TCP 建立握手 / 挥手的时间,实现 TCP 连接复用,从而降低通信时延和提高性能。 通常一些高性能中间件都提供了内置的 TCP 连接池,如刚才说的 go-redis,go-sql-driver 等等,关于连接池,一个良好的设计是对用户屏...

基于 Golang 实现的延迟队列的设计与分析(一)

分析美图开源的延迟队列 lmstfy:架构与设计思路

0x00 前言 延迟队列(Delay Queue)任务相关的业务场景如下: 场景一: 在订单系统中,一个用户某个时刻下单之后通常有 30 分钟的时间进行支付,如果 30 分钟之内没有支付成功,那么这个订单需要关闭;此外在未过期之前的 N 分钟需要通知用户进行支付 场景二: 用户某个时刻通过手机远程遥控家里的智能设备,设置在指定的时间(后)进行工作。这时就可以将用户指令发送到延时队列...

基于 Golang 实现的延迟队列的设计与分析(二)

分析美图开源的延迟队列 lmstfy:数据结构与实现

0x00 前言 延迟队列(Delay Queue)任务相关的业务场景如下: 场景一: 在订单系统中,一个用户某个时刻下单之后通常有 30 分钟的时间进行支付,如果 30 分钟之内没有支付成功,那么这个订单需要关闭;此外在未过期之前的 N 分钟需要通知用户进行支付 场景二: 用户某个时刻通过手机远程遥控家里的智能设备,设置在指定的时间(后)进行工作。这时就可以将用户指令发送到延时队列...

Kratos 源码分析:CGI 框架 BM (二)

分析 blademaster 中的拦截器实现及设计

0x00 前言 熟悉 gRPC 的开发者对拦截器 interceptor(中间件)不会陌生,gin 框架也提供了这种能力,下面代码默认启用了 Logger() 和 Recovery() 两个中间件。 func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.Stri...