限流器系列(2) -- Token Bucket 令牌桶

关注HHF技术博客公众号 上一篇说到 Leaky Bucket 能限制客户端的访问速率, 但是无法应对突发流量, 本质原因就是漏斗桶只是为了保证固定时间内通过的流量是一样的. 面对这种情况, 本篇文章继续介绍另外一种限流器: Token Bucket -- 令牌桶 什么是 Token Bucket 漏斗桶的桶空间就那么大, 其只能保证桶里的请求是匀速流出, 并不关心流入的速度, 只要桶溢出了就服务拒绝, 这可能并不符合互联网行业的使用场景. 试想这样的场景, 尽管服务器的 QPS 已经达到限速阈...阅读全文

简书 2020-07-05 14:32:49 HHF技术博客

go并发的那些事

思考:go为什么那么擅长并发? 答:从设计理解上来讲我觉着golang的CSP并发模型与GMP调度器是基石。你看虽然一个goroutine的创建才4kb,低成本golang可以做到海量实体(goroutine)并发,但并发的协程光并发不通讯意义其实就不大了,CSP就是管高效通讯的,高在哪?用golang社区里面的话就是 通讯才共享内存,而不是共享内存去通讯。好了,海量并发与通讯能力都没问题了,但一个个的实体最终是需要被cpu拿去执行的,必须对cpu足够友善才能表现更大能力啊,GMP就出来了,首先...阅读全文

简书 2020-07-05 14:32:47 Best博客

golang 条件变量&发送通知&接受通知&广播

3个指针方法: Wait() 等待goroutine 等待接受通知,Single() Broadcast() 解除阻塞 Single() 发送通知,如果存在多个goroutine,只会任意选择一个 Broadcast() 广播 方法给所有人 下面时wait方法底层执行流程 尝试解锁 wait 尝试解锁,解完锁之后等待其他给发通知,===> 进入了阻塞状态,等待被唤醒: single(),broadcast() 一旦被唤醒后,又会锁定 func (c *Cond) Wait() { c.check...阅读全文

Segmentfault 2020-07-09 11:32:34 code

Go开发中,如何有效控制Goroutine的并发数量 – CTRIP TECH SHOW

相信大家在学习Go的过程中,都会看到类似这样一句话:”与传统的系统级线程和进程相比,协程的最大优势在于其‘轻量级’,可以轻松创建上百万个而不会导致系统资源衰竭”。那是不是意味着我们在开发过程中,可以随心所欲的调用协程,而不关心它的数量呢? 答案当然是否定的。我们在开发过程中,如果不对Goroutine加以控制而进行滥用的话,可能会导致服务程序整体崩溃。 这里我先模拟一下协程数量太多的危害: func main() { number := math.MaxInt64 for i := 0; i <...阅读全文

tech.ctrip.com 2020-07-02 00:00 tech.ctrip.com

Go实践笔记

Go实践笔记 目前在用go写同步对战服务器这块。这门编程语言很久以前虽然学过,不过时间久了也用的较少,时间久了忘了很多。在写服务器过程中,可以享受到go对高性能并发的内置支持,但同时也会遇到一些坑,这里针对go的一些要点和问题,记录一些笔记和坑的解决办法。 1.go语言的异常处理机制不够完善。 (1)go的异常处理通过defer recover来实现,不支持函数局部代码块异常处理。 (2)go的异常不像java那样区分类型,包括官方的标准库也是,更多的是通过运行时错误码来判断。处理异常的时候,代...阅读全文

Segmentfault 2020-07-08 11:32:42 windy

监控聚合器系列之: open-falcon新聚合器polymetric

聚合在监控中的作用 简单来说:需要将分散的大量监控数据按照一定的维度(idc/service)及一定的算法(avg/sum/max/min/quantile分位)得到一个结果值 比如: 想知道服务a下面的100台机器的平均 又比如: 想知道查询接口b的99分位延迟值 open-falcon原版聚合器 aggregator 介绍: aggregator聚合器就是从falcon_portal.cluster表中取出用户在页面上配置的表达式,然后解析后,通过api拿到对应机器组的所有机器,通过api查...阅读全文

Segmentfault 2020-07-08 09:32:37 ning1875

open-falcon 聚合器aggregator代码解析

总结:aggregator聚合器就是从falcon_portal.cluster表中取出用户在页面上配置的表达式,然后解析后,通过api拿到对应机器组的所有机器,通过api查询graph数据算出一个值重新打回transfer作为一个新的点。 定时从db中拿出所有的聚合器配置放到一个map中 第一次启动时遍历聚合器map生成workers map 这两个map的key都是id+updatetime 同时下一次拿出db生成map 对workers这个map进行增量更新 和删除操作删除是通过 work...阅读全文

Segmentfault 2020-07-07 20:32:32 ning1875

Linux系统下编译Go语言(Golang)的github.com/gotk3/gotk3/gtk长时间没反应如何解决

我们在Linux系统中,使用Go语言编写基于GTK的程序时,一般都会使用github.com/gotk3/gotk3这个包,这个包是Go语言(Golang)对GTK3的绑定。但是,实际使用时,编译到github.com/gotk3/gotk3/gtk这个子包的时候(go get或go install的时候),在一些Linux版本中,可能会遇上在编译时长时间没有任何反应的情况。此时可以尝试用下面的方法解决。以Debian系的Ubuntu系统为例,首先要检查GTK开发包的版本,使用下面的命令:apt...阅读全文

简书 2020-07-04 15:32:54 陆满庭

golang的值类型,指针类型和引用类型&值传递&指针传递

一,变量类型 变量分为值类型,指针类型和引用类型。 以如下变量定义和赋值语句为例: package main import( "fmt" ) func main(){ var a int = 1 p := &a fmt.Printf("%v\n", a) fmt.Printf("%p\n", &a) fmt.Printf("%p\n", p) fmt.Printf("%p\n", &p) } output: 1 0xc000092000 0xc000092000 0xc00008c010 值类型...阅读全文

简书 2020-07-04 15:32:53 舒小贱

无重复字符串的排列组合(golang)

原题:无重复字符串的排列组合 关联:有重复字符串的排列组合(golang) 方法一:递归 假设已经得到了除了当前字符之外的其它字符拼接好的字符串,则与当前字符进行拼接。 func permutation(S string) []string { if len(S) == 1 { return []string{S} } // 与拼接得到的各个字符串再进行拼接 ret := []string{} for i, s := range S { // 差了第i个字符的剩余字符串往下传,并将得到的结果进行...阅读全文

简书 2020-07-04 15:32:53 薇清潜

有重复字符串的排列组合(golang)

原题:有重复字符串的排列组合 与无重复字符串的排列组合(golang)类似,只是由于golang没有set,需要把[]string存储改为用map存储,字符串作为map的key存储,map的val用不占用内存空间的bool类型就行,最后将map的key遍历返回即可。 func permutation(S string) []string { // 使用map存储,这样就能排除重复数据,最后遍历map,取出所有的key m := make(map[string]bool) m[S] = true ...阅读全文

两数相加(golang)

原题: 两数相加 关联:两数相加 II(golang) 从低位加起,注意进位,且最后进位完的链表可能比l1,l2中最长的更长。 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { // h表示进位,为低位相加/10的值取整 retHead := new(ListNode) p := retHead h := 0 for l1 != nil || l2 != nil || h > 0{ if l1 != nil { h += l1....阅读全文

简书 2020-07-04 15:32:52 薇清潜

两数相加 II(golang)

原题:两数相加 II 使用栈,其它与两数相加(golang)类似 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { // 使用栈,使用头插法返回链表 ret := new(ListNode) s1 := []int{} s2 := []int{} for l1 != nil || l2 != nil { if l1 != nil { s1 = append(s1, l1.Val) l1 = l1.Next } if l2 != ...阅读全文

简书 2020-07-04 15:32:52 薇清潜

两数之和(golang)

原题:两数之和 关联:两数之和 II - 输入有序数组(golang) 两数之和 IV - 输入 BST(golang) func twoSum(nums []int, target int) []int { // 有一个map记录已经遍历过的数字,如果当前能找到,则返回 visit := make(map[int]int, len(nums)) for curPos,curVal := range nums { if visitPos,ok := visit[target - curVal];...阅读全文

简书 2020-07-04 15:32:51 薇清潜

两数之和 II - 输入有序数组(golang)

原题:两数之和 II - 输入有序数组 关联: 两数之和(golang) 两数之和 IV - 输入 BST(golang) 解法:numbers[l]+numbers[r]>target,则numbers[l+1...r-1]比numbers[i]大,numbers[l+1...r-1]+numbers[r]也会大于target,所以此时r--就行。<target的情况同理。 func twoSum(numbers []int, target int) []int { // 双指针,左右相加小,...阅读全文

简书 2020-07-04 15:32:51 薇清潜

golang.org

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install epel-release yum install golang -y mkdir -p GOPATH/src/golang.org/x git clone https://github.com/golang/net.git git clone https://github.com/golang/net.git...阅读全文

简书 2020-07-04 15:32:50 peterSZW

用go写了一个简单的eventbus

https://github.com/Jun10ng/go... 前几天学习观察者模式时,觉得和pub/sub框架殊途同源,于是用go模仿eventbus写了一个简单的pub/sub。由于go的函数一等公民特性,编写起来很方便,整个例子也只用了一天时间。随后开始逐步考虑并发,异步的问题。(感兴趣的可以看下commit记录)我个人觉得这个例子很适合作为golang观察者模式实践。 希望大家多多提出意见,谢谢。阅读全文

Segmentfault 2020-07-07 15:32:33 Jun10ng

golang取代nginx布置前端项目(vue),mime问题,Resource interpreted as Stylesheet but transferred with MIME type...

前言:某些原因,想直接使用go编译生成的可执行文件+前端编译好的静态文件,直接布置项目,不用依赖于nginx。 想看结果的同学直接拉到最下面看代码和总结 开始探索: 首先想到的是golang路由中指向静态资源 知识点:http中的ServeFile方法和FileServe,这两个很像,这里使用第一个,区分自己去查,这个一般 只需要在你的HandlerFunc中指向你的资源地址,就可以反馈,这里本地使用了一个测试html,结果没问题 http.ServeFile(w, r, "./test.htm...阅读全文

简书 2020-07-04 06:32:48 哆啦在这A梦在哪

gRPC-go服务发现&负载均衡

前言 以下示例基于 https://github.com/grpc/grpc-go v1.30.0,关于proto文件定义,服务生成参考gRPC 官方文档中文版 client grpc使用的是客户端负载均衡模式,每次新建连接的时候会根据负载均衡算法选出服务端的IP然后建立连接。现在grpc默认支持两种算法pick_first(第一次地址) 和 round_robin(轮询) pick_first:pick_first每次都是尝试连接第一个地址,如果连接失败就会尝试下一个,直到连接成功为止,之后的...阅读全文

简书 2020-07-04 06:32:46 l刘言飞语