golang 归并回源策略

前言

下面是我根据业务需求画了一个架构图,没有特别之处,很普通,都是我们常见的中间件,都是一些幂等性GET 请求。有一个地方很有意思,从service 分别有10000 qps 请求到Redis,并且它们的key 是一样的。这样一个简单的业务,Redis 就需要承担20000qps,此时监控 redis 我们会发现有一个峰值,如果Redis 没有值,这些流量会穿透到PostgreSQL,监控PostgreSQL也有一个峰值。于是我在想,如果在Service 层我们我们让流量排队阻塞,只需一个流量去请求Redis 获取数据,那么所有的key 不都获取数据了吗?对于Redis 和 PostgreSQL 来说流量就是1,那么流量的收缩比就是20000:2也就是10000:1,这是很高效的。

描述了那么多,这个方案可以用来解决缓存击穿,实际上它超越了这个问题。这个方案这么好,我们该怎么实现了,在这里我们用 Singleflight 去实现。接下来我将着重讲解 Singleflight 。

一、什么是Singleflight

字面解释就是单飞模式,我通常叫它归并回源策略。它的主要目的是确保在任何给定时间内,对昂贵或重复操作的调用只有一次。当多个 goroutine 请求相同资源时,singleflight 可确保函数只执行一次,并且结果由所有调用者共享。这种模式在不适合缓存或结果会经常变化的情况下特别有用。

二、Singleflight是如何工作的

单飞机制非常简单,它提供了一个Group,每个Group 代表一类工作,我们需要做的就是这类工作中,需要防止重复操作。

  1. 首次启动,第一次请求资源时,会初始化Group并且对计算资源函数进行调用

  2. 并发请求处理,如果在初始请求仍在处理过程中,又有其他对同一资源的请求提出,单飞会保留这些调用。

  3. 结构共享,一旦第一个请求完成,结果将返回给原始调用者,并同时与所有其他等待的调用者共享。

  4. 防止重复,整个过程中,要保证一类工作函数只会调用一次,防止重复工作。

三、Singleflight 的优点

  1. 效率:通过确保只有一个请求完成工作,可避免对服务和数据库造成不必要的负载。

  1. 简单:singleflight 抽象了处理对同一资源的并发请求的复杂性,使您的代码更简洁、更易懂。

  1. 资源优化: 它有助于优化内存和 CPU 的使用,因为相同的计算不会重复多次。

四、Singleflight 的redis 请求

  wg := &sync.WaitGroup{}wg.Add(10)for i := 0; i < 10; i++ {go func() {defer wg.Done()v, _, _ := group.Do("key1", func() (interface{}, error) {client := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"},)a := client.Get(context.Background(), "a")return a, nil})fmt.Println(v)}()
​}wg.Wait()

output:

用wireshark 抓包可以看到

只有一个客户端发起了请求,所有的客户端都返回了数据

五、Singleflight 方法讲解

  1. Do:这个方法执行一个函数,并返回函数执行的结果。你需要提供一个 key,对于同一个 key,在同一时间只有一个在执行,同一个 key 并发的请求会等待。第一个执行的请求返回的结果,就是它的返回结果。函数 fn 是一个无参的函数,返回一个结果或者 error,而 Do 方法会返回函数执行的结果或者是 error,shared 会指示 v 是否返回给多个请求。

  2. DoChan:类似 Do 方法,只不过是返回一个 chan,等 fn 函数执行完,产生了结果以后,就能从这个 chan 中接收这个结果

  3. Forget:告诉 Group 忘记这个 key。这样一来,之后这个 key 请求会执行 f,而不是等待前一个未完成的 fn 函数的结果。

Do 和 DoChan 最终都会调用 doCall,只不过 Do 是同步,如果一个key 处理的很慢就可能造成阻塞,DoChan 是异步调用的,这个地方一定要注意不同的key 的数据,每个不同的key 都要开一个goroutine  ,数量多的话就会造成系统的内存OM掉了。这个地方大家一定要注意了,建议用协程池。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LTD269次升级 | 新增在线提货功能 • 兑换码在线售卖 • 小程序可内嵌跳转其他小程序•新增微信体系入站访客数据与轨迹

1、 新增兑换码在线提货功能&#xff1b; 2、 新增兑换码/卡密在线售卖功能&#xff1b; 3、 入站访客新增微信浏览器渠道访问数据显示&#xff1b; 4、iOS App问题修复与优化&#xff1b; 5、 其他已知问题修复与优化&#xff1b; 01 商城 1) 新增兑换码在线提货功能 在…

2024Spring> HNU-计算机系统-实验2-datalab-导引

前言 datalab考验对于位运算以及浮点数存储的理解&#xff0c;如果真的肯花时间去搞懂&#xff0c;对计算机系统存储的理解真的能上一个台阶。与课程考试关联性上来说不是很大&#xff0c;但对于IEEE的浮点数表示一定要熟练掌握。 导引 ①实验工具包 要完成的是bits.c中的15个…

【智能算法】混合蛙跳算法(SFLA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2003年&#xff0c;MM Eusuff等人受到青蛙觅食行为启发&#xff0c;提出了混合蛙跳算法&#xff08;Shuffled Frog Leaping Algorithm&#xff0c;SFLA&#xff09;。 2.算法原理 2.1算法思想 SF…

《神经网络入门》神经网络的思想 (一)

文章目录 生物神经元的结构如何用数学建模神经元的工作模式神经网络的结构 我们知道神经网络是一个模拟人脑的数学建模&#xff0c;首先我们来了解一下生物神经元是怎么工作的。 人的大脑是由非常多神经元相互连接形成的网络构成的。一个神经元&#xff0c;可以从其他神经元接…

第45期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

萨科微半导体

萨科微半导体的产品包括二极管三极管、功率器件、电源管理芯片等集成电路三大系列&#xff0c;可以平替换英飞凌、安森美、意法半导体、富士、三菱、科锐cree等品牌的产品。在宋仕强总经理的带领下&#xff0c;萨科微半导体&#xff08;www.slkoric.com&#xff09;将加速实现“…

水泥5G智能制造工厂数字孪生可视化平台,推进水泥行业数字化转型

水泥5G智能制造工厂数字孪生可视化平台&#xff0c;推进水泥行业数字化转型。水泥5G智能制造工厂数字孪生可视化平台&#xff0c;是水泥行业数字化转型的关键推手。数字孪生平台运用先进的信息技术和数字化手段&#xff0c;实现水泥生产过程的数字化模拟、可视化监控和智能化管…

全自动ai生成视频MoneyPrinterTurbo源码 在线ai生成视频源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 现在短视频这么火爆&#xff0c;流量就是金钱。 如果能全自动的生成短视频&#xff0c;是不是很容易带来流量&#xff0c;赚到马内。 MoneyPrinter 这个开源项目就可以自动生成短视…

数据库引论:3、中级SQL

3.中级SQL 一些更复杂的查询表达 3.1 连接表达式 拼接多张表的几种方式 3.1.1 自然连接 natural join&#xff0c;自动连接在所有共同属性上相同的元组 join… using( A 1 , A 2 , ⋯ A_1,A_2,\cdots A1​,A2​,⋯):使用括号里的属性进行自然连接&#xff0c;除了这些属性…

mfc140u.dll丢失的解决方法,解决mfc140u.dll丢失的弹窗问题

在使用电脑的时候是不是遇到过mfc140u.dll文件丢失的错误弹窗的情况&#xff0c;出现这样的问题时什么情况&#xff0c;有什么办法解决&#xff0c;今天这篇文章将带着大家去了解mfc140u.dll丢失的解决办法。帮助大家快速有效的解决mfc140u.dll文件。 一.解决mfc140u.dll丢失的…

visual studio 2017开发QT框架程序

1. 配置开发环境 首先创建项目 进入到项目后&#xff0c;右键点击项目点击属性&#xff0c;配置如下&#xff1a;

dockerhub右键快速搜索脚本

Chrome 浏览器扩展的后台脚本&#xff0c;用于创建右键菜单项&#xff0c;并根据用户的操作在新的标签页中打开 Docker Hub 网站或者进行搜索。 // 创建右键菜单项&#xff0c;用于打开 Docker Hub 网站 chrome.contextMenus.create({id: search-home, // 菜单项的唯一标识符t…