自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(166)
  • 资源 (1)
  • 收藏
  • 关注

原创 各类排序算法及go实现

常见排序算法及go语言实现

2022-06-08 18:17:45 197 1

原创 循环队列原理及实现

循环队列是 队列的一种特殊形式。首先介绍队列,然后引申出循环队列。 队列又称为“先进先出”FIFO线性表 限定插入操作只能在队尾进行,而删除操作只能在队首进行 队列也可以采用顺序存储结构或链表结构来实现,分别称为顺序队列和链队列 队列的顺序表示—顺序队列 用一组连续的存储单元依次存放从队首到队尾的元素,附设两个指针head和tail分别指向队首元素和队尾元素的位置, (有的地方用front 和 rear 表示)当head = tail = 0时表示空队列当插入新元素到队尾时,ta.

2022-05-23 09:08:15 1384

原创 promethues最小化demo示例

Prometheus以scrape_interval(默认为1m)规则周期,从监控目标上收集信息。其中scrape_interval可以基于全局或基于单个metric定义;然后将监控信息持久存储在其本地存储上。Prometheus以evaluation_interval(默认为1m)另一个独立的规则周期,对告警规则做定期计算。其中evaluation_interval只有全局值;然后更新告警状态。type Group struct { name string // prome

2022-05-17 16:42:06 395

原创 多活灾备架构

在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的?这些疑问,想必是每个程序看到异地多活这个名词时,都想要搞明白的问题。有幸,我曾经深度参与过一个中等互联网公司,建设异地多活系统的设计与实施过程。所以今天,我就来和你聊一聊异地多活背后的的实现原理。认真读完这篇文章,我相信你会对异地多活架构,有更加深刻的理解。这篇文章干货很多,希望你可以耐心读完。01

2021-12-31 10:16:31 1001

原创 GMP中为什么要有P?

上图是Go 1.2前的调度器实现。GM 调度模型的问题:单一全局互斥锁(Sched.Lock)和集中状态存储 导致所有 goroutine 相关操作,比如:创建、结束、重新调度等都要上锁。 Goroutine 传递问题 M 经常在 M 之间传递”可运行”的 goroutine,这导致调度延迟增大以及额外的性能损耗(刚创建的 G 放到了全局队列,而不是本地 M 执行,不必要的开销和延迟)。 Per-M 持有内存缓存 (M.mcache) 每个 M 持有 mcache...

2021-08-03 10:46:05 962

原创 golang defer中err的坑

func main() { err := outerFunc(1) if err != nil { fmt.Println("print err in main:", err) } fmt.Println("Done")}func outerFunc(param int) (err error) { defer func(err *error) { fmt.Println("test 1 print err in defer func:", (*err).Error()) }(&.

2021-05-18 15:45:09 675

原创 grpc在k8s中负载均衡失效事故排查

Kubernetes 的默认负载平衡通常不能与 gRPC 一起使用,在不使用 LoadBalance service 的情况下,因为 HTTP/2 链接复用特性,导致客户端的所有请求都发往同一个 Pod,导致负载不均衡。具体原因可见此文:gRPC Load Balancing on Kubernetes without Tears。原文中对 gRPC 失效的原因的摘抄如下:However, gRPC also breaks the standard connection-level load bala

2021-04-28 13:59:30 981

原创 golang copy-on-write思想应用

copy-on-write 是计算机领域相当经典的优化思想,当然你如果问一个Java 开发者 copy-on-write 有什么作用?他们往往第一反应就是:优雅地解决读多写少场景下的并发问题。确实,众所周知,多线程环境下会出现 data race 的问题,我们以 Java 中的 ArrayList 为例,ArrayList 本身是不保证线程安全的,通常情况,要保证多线程环境下不出问题,就要给 ArrayList 加上读写锁,读要读锁,写要写锁,读与读之间不互斥,读与写之间要互斥,写与写之间也要互斥。

2021-04-26 23:33:52 1711

原创 Go json使用进阶技巧

数字转字符串因为前端 js 对 int64 的处理可能会因为溢出导致无法准确处理,因此我们期望可以返回字符串类型。package maintype A struct { B int `json:",string"`}定制Marshaler/Unmarshal在很多 case 中,我们需要对结构体进行一些定制,比如枚举类型和 string 的转换,比如一些属性的预处理,这个时候我们就需要实现自己的Marshal/Unmarshal方法了。 举一个很常见的例子,在 w...

2021-04-26 22:27:36 822 1

原创 i/o timeout ?希望你不要踩到这个http包的坑

问题我们来看一段日常代码。package mainimport ( "bytes" "encoding/json" "fmt" "io/ioutil" "net" "net/http" "time")var tr *http.Transportfunc init() { tr = &http.Transport{ MaxIdleConns: 100, Dial: func(netw, addr string) (net.Conn, error) {

2021-04-26 21:50:03 4550

原创 http/net源码阅读,goroutine泄漏个数分析

问题package mainimport ( "fmt" "io/ioutil" "net/http" "runtime")func main() { num := 6 for index := 0; index < num; index++ { resp, _ := http.Get("https://www.baidu.com") _, _ = ioutil.ReadAll(resp.Body) } fmt.Printf("此时goroutine个数= %d

2021-04-26 21:47:41 298 1

原创 【随记】golang 设置 http response 响应头与坑

今天在二开B站kartos框架时,发现怎么设置http的response Header都无法生效。故发现了设置 http response 响应头与坑。1、 设置WriteHeader的顺序问题w.WriteHeader(201)w.Header().Set("Name", "my name is smallsoup")用 golang 写 http server 时,可以很方便可通过 w.Header.Set(k, v) 来设置 http response 中 header 的内容。但是需

2021-04-26 21:17:48 556

原创 一台Linux服务器最多能支撑多少个TCP连接?

困惑很多人的并发问题在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。很多同学看到这个问题的第一反应是65535。原因是:“听说端口号最多有65535个,那长连接就最多保持65535个了”。是这样的吗?还有的人说:“应该受TCP连接里四元组的空间大小限制,算起来是200多万亿个!”如果你对这个问题也是理解的不够彻底,那么今天讲个故事讲给你听!一次关于服务器端并发的聊天".

2021-04-24 20:24:50 3178

原创 redis连接池运转流程

redis连接池运转流程本文主要介绍redis-pool的PoolSize与MinIdleConns的参数配置对pool中连接数conns以及空闲连接数idleConns的影响PoolSize默认为 10 * runtime.NumCPU()连接池对象: p := &ConnPool{ conns: make([]*Conn, 0, opt.PoolSize), idleConns: make([]*Conn, 0, opt.PoolSize), }在一开始NewPoo

2021-04-16 16:41:37 842

原创 grpc实现流量染色

什么是流量染色流量染色是指根据流量协议设置对应的流量染色规则,对指定的流量进行染色标记,并在整个调用链中携带该标记。通过染色流量可以对特定的流量进行跟踪和路由,所以流量染色功能常被用于灰度发布的场景。在业务系统迭代过程中会不断有新版本发布,在正式发布前,可以使用流量染色控制先进行小规模验证,通过收集使用体验的数据,对应用新版本的功能、性能、稳定性等指标进行评判,然后再全量升级。即使某个新版本出现问题,也只会影响已染色流量,不会将问题蔓延至整个系统,保证整个系统的正常运行。同理,流量染色功能还可以用于

2021-04-08 16:09:12 4720

原创 使用go build 进行条件编译

当我们编写的go代码依赖特定平台或者cpu架构的时候,我们需要给出不同的实现C语言有预处理器,可以通过宏或者#define包含特定平台指定的代码进行编译但是Go没有预处理器,他是通过 go/build包 里定义的tags和命名约定来让Go的包可以管理不同平台的代码这篇文章将讲述Go的条件编译系统是如何实现的,并且通过实例来说明如何使用1. 预备知识:go list命令的使用在讲条件编译之前需要了解go list的简单用法go list访问源文件里那些能够影响编...

2020-10-22 15:41:19 2508

原创 The Power of Two Random Choices

1. 介绍常见的Load balance算法想必大家都不陌生,Random、Round-robin、Least connection、Consistent hash等应该都耳熟能详,这些算法都在实践中有广泛的应用,例如Nginx、Haproxy等负载均衡模块都有相应算法的实现。本文将和大家分享一种全新的Load balance算法:Power of Two Random Choices[1],也算是Fast 2019 best paper解读《Distcache: Provable load balan

2020-10-21 23:01:00 817 2

原创 什么是一致性 Hash 算法?面试又被问到怎么办?

01数据分片✔︎ 先让我们看一个例子吧我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力。当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了;当数据量变大,并发量也增加的时候,把全部的缓存数据放在一台机器上就有些吃力了,毕竟一台机器的资源是有限的,通常我们会搭建集群环境,让数据尽量平均的放到每一台 Redis 中,比如我们的集群中有 4 台Redis。那么如何把数据尽量平均地放到这 4 台Redis中呢?最简单的就是取模算法:hash(

2020-10-18 20:20:26 110 2

原创 聊聊一致性哈希

既然有一致性哈希,就肯定还有不一致哈希,为啥平时没人说不一致哈希呢?因为常见的哈希都是不一致的,所以就不修饰了,到了一致性哈希才特殊加个描述词修饰一下。哈希一般都是将一个大数字取模然后分散到不同的桶里,假设我们只有两个桶,有 2、3、4、5 四个数字,那么模 2 分桶的结果就是:这时我们嫌桶太少要给哈希表扩容加了一个新桶,这时候所有的数字就需要模 3 来确定分在哪个桶里,结果就变成了:可以看到新加了一个桶后所有数字的分布都变了,这就意味着哈希表的每次扩展和收缩都会导致所有条目..

2020-10-18 20:09:26 129

原创 B站的fail fast原则

首先,超时控制是全链路的超时控制,如果上游刚开始设置5s的context,经过一系列的业务后,如消耗了2s,再到另一个服务,那么此服务的context就只剩3s。其次是fail fast 原则,如果上游已经失败,那么下游需要迅速结束,避免资源的浪费。mysql,tidb等的fail fast做法是每次执行相应操作时,判断当前context是否done,如果已经done,那么不再处理。func ctxDriverExec(ctx context.Context, execerCtx dri

2020-10-16 17:24:09 242 1

原创 B站价值60亿跨年晚会背后的微服务治理

B站价值60亿跨年晚会背后的微服务治理 大家都知道微服务有两个痛点,一个是如何拆分微服务,微服务的边界怎么划分制定;二是微服务上了规模之后如何管理,因为只要上了规模,任何小小的问题都可能会被放大,最后导致雪崩效应。 一、微服务化带来的挑战 上图是我们 B 站全链路追踪的一个截图,这只是其中一个拓扑图的调用链路,就已经非常复杂了。可以想象一下,如果是整个公司所有的调用链路,会有多么复杂。 这就带来了微服务治理的复杂性问题:如何保证注册和发...

2020-10-16 10:09:19 219 1

转载 bilibili技术总监毛剑:B站高可用架构实践

https://zhuanlan.zhihu.com/p/139258985

2020-10-16 10:03:57 1520

原创 go-zero的全链路追踪与超时

目前分布式链路追踪系统基本都是根据谷歌的《Dapper大规模分布式系统的跟踪系统》这篇论文发展而来,主流的有zipkin,pinpoint,skywalking,cat,jaeger等。论文链接:https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36356.pdfgo-zero框架全链路追踪思路一.httpServer实现TracingHandlerfunc TracingHandler(next ht

2020-10-10 13:24:03 3780

原创 深入理解Golang之context

前言这篇文章将介绍Golang并发编程中常用到一种编程模式:context。本文将从为什么需要context出发,深入了解context的实现原理,以及了解如何使用context。为什么需要context在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作。熟悉channel的朋友应该都见过使用done channel来处理此类问题。比如以下这个例子:func main() { messages := make(chan int, 10)

2020-10-06 15:18:13 373

原创 6种延时队列的实现方案

延时队列的应用什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说可以指定队列中的消息在哪个时间点被消费。延时队列在项目中的应用还是比较多的,尤其像电商类平台:订单成功后,在30分钟内没有支付,自动取消订单 外卖平台发送订餐通知,下单成功后60s给用户推送短信。 如果订单一直处于某一个未完结状态时,及时处理关单,并退还库存 淘宝新建商户一个月内还没上传商品信息,将冻结商铺等 ……上边的这些场景都可以应用延时队列解决。延时队列的实现我个

2020-09-30 20:45:47 647

原创 新版本chrome浏览器带来的跨域请求cookie丢失问题

今天线上业务的跨域接口请求莫名的出现问题,经深入排查,发现新版本的chrome浏览器(80版本之后)对cookie的校验更加严格,SameSite属性默认值由None变为Lax,因此可能会对线上业务带来问题特此与大家同步一下今天的发现,存在跨域接口调用业务的小伙伴可能需要关注。chrome升级到80版本之后(准确的说是78版本之后,灰度测试,如上图,即也可能存在同一版本不同人的浏览器表现不同),cookie的SameSite属性默认值由None变为Lax,该问题的讨论可参考:https://githu

2020-09-27 22:04:20 4375

原创 高效大数据开发之 bitmap 思想的应用

数据仓库的数据统计,可以归纳为三类:增量类、累计类、留存类。而累计类又分为历史至今的累计与最近一段时间内的累计(比如滚动月活跃天,滚动周活跃天,最近 N 天消费情况等),借助 bitmap 思想统计的模型表可以快速统计最近一段时间内的累计类与留存类。一、背景数据仓库的数据统计,可以归纳为三类:增量类、累计类、留存类。而累计类又分为历史至今的累计与最近一段时间内的累计(比如滚动月活跃天,滚动周活跃天,最近 N 天消费情况等),借助 bitmap 思想统计的模型表可以快速统计最近一段时间内的累计类与留存类。二、

2020-09-08 09:50:25 277

原创 Redis命令时间复杂度查询表

String类型命令 时间复杂度 set 0(1) get 0(1) del 0(k),k是键的个数 mset 0(k),k是键的个数 mget 0(k),k是键的个数 incr 0(1) decr 0(1) incryby 0(1) decryby 0(1) incrybyfloat 0(1) append 0(1) strlen 0(1) setrange 0(n)

2020-09-01 21:51:33 1253

原创 从零开始搭建etcd分布式存储系统+web管理界面

目录什么是ETCD 一.安装 二.搭建单机版 三.搭建集群版 四.监听功能-watch 五.使用rest api 六.可视化界面 etcd-browser etcdkeeper 什么是ETCD随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建.

2020-06-29 23:07:40 947

原创 etcd docker安装

docker安装拉镜像:docker pull quay.io/coreos/etcd启动:docker run -it -d -p 2379:2379 -p 2380:2380 --name etcd quay.io/coreos/etcd查询:docker exec -it etcd etcdctl member list

2020-06-29 16:55:05 710

原创 Git 常见工作流介绍(Git Flow/GitHub Flow/GitLab Flow)

git 工作流的问题首先来看常见的 git 工作流:git 工作流主要的问题是:一、默认的 master 分支只是用于发布,开发都在其他分支上。二、对于多数应用来说过于复杂,特别是 release 和 hotfix 分支的不可部署导致使用上的复杂。Git flow是最早倡导使用git分支策略的方案之一,它引起了很多关注。它提倡应该有一个主干分支和一个独立的开发分支,并支持特性、发布和补丁分支。开发在开发分支上,之后移动到发布分支并最终合并到主干分支中。 Git flow是一个定义良好的标准,但其

2020-06-18 18:02:10 2768

原创 单体仓库与多仓库——两种源码组织模式介绍

我在去年和前年主导了公司两个产品后端的技术选型和整体架构,并分别尝试了两种源码组织模式:多仓库和单体仓库。对两种仓库的利弊也有了很大程度上的感受,基于这个前提对这两种模式做个总结。阅读本文后你会明白:什么是单体仓库?为什么 Google 采用单体仓库?单体应用和微服务应用在介绍单体仓库和多仓库前,先来说说什么叫单体应用和微服务应用。微服务相比单体应用最大的好处是可以独立的开发测试部署和扩展。单体应用一般采用单体仓库,但是微服务的代码仓库该如何组织呢?一定是每个服务一个仓库吗?其实也不.

2020-06-17 14:49:40 1565

原创 git-flow 工作流程简介

Git主要优点有分布式存储 , 本地仓库包含了远程仓库的所有内容 . 安全性高 , 远程仓库文件丢失了也不怕 优秀的分支模型 , 创建/合并分支非常的方便 方便快速 , 由于代码本地都有存储 , 所以从远程拉取和分支合并时都非常快捷当分支过多时 , 如何管理这些分支呢 ? 我们团队采用了Git Flow的模式GitFlow的常用分支master主分支 , 产品的功能全部实现后 , 最终在master分支对外发布 该分支为只读唯一分支 , 只能从其他分支(release/hotfix)

2020-06-02 14:23:35 380

原创 Golang 性能优化实战

项目背景网关服务作为统一接入服务,是大部分服务的统一入口。为了避免成功瓶颈,需要对其进行尽可能地优化。因此,特别总结一下 golang 后台服务性能优化的方式,并对网关服务进行优化。技术背景: 基于 tarsgo 框架的 http 接入服务,下游服务使用 tarsgo 协议进行交互 性能指标网关服务本身没有业务逻辑处理,仅作为统一入口进行请求转发,因此我们主要关注下列指标...

2020-05-07 21:08:54 1070

原创 Cache Aside Pattern

什么是“Cache Aside Pattern”?答:旁路缓存方案的经验实践,这个实践又分读实践,写实践。对于读请求 先读cache,再读db 如果,cache hit,则直接返回数据 如果,cache miss,则访问db,并将数据set回缓存 如上图:(1)先从cache中尝试get数据,结果miss了(2)再从db中读取数据,从库,读写...

2020-05-07 11:30:26 183

原创 [典藏版]Golang三色标记、混合写屏障GC模式图文全分析

https://mp.weixin.qq.com/s/G7id1bNt9QpAvLe7tmRAGw

2020-04-28 22:36:22 559

原创 Go 语言为什么需要泛型?

Go:为何带来泛型介绍[这是在Gophercon 2019上发表的演讲版本。视频链接可供使用。]这篇文章是关于向Go添加泛型的意义,以及为什么我认为我们应该这样做。我还将介绍为Go添加泛型的设计可能的改变。Go于2009年11月10日发布。不到24小时后,我们看到了关于泛型的第一条评论。(该评论还提到了我们在2010年初以panic和recover的形式添加到语言中的情况。)在...

2020-04-28 22:28:31 870

原创 Go 为什么这么“快”

本文主要介绍了 Go 程序为了实现极高的并发性能,其内部调度器的实现架构(G-P-M 模型),以及为了最大限度利用计算资源,Go 调度器是如何处理线程阻塞的场景。怎么让我们的系统更快随着信息技术的迅速发展,单台服务器处理能力越来越强,迫使编程模式由从前的串行模式升级到并发模型。并发模型包含 IO 多路复用、多进程以及多线程,这几种模型都各有优劣,现代复杂的高并发架构大多是几种模型协同使...

2020-04-28 22:26:33 186

原创 Twitter雪花算法SnowFlake改造: 兼容JS截短位数的53bit分布式ID生成器

前言  众所周知, 在分布式全局唯一ID生成器方案中, 由Twitter开源的SnowFlake算法对比美团Leaf为代表的需要部署的发号器算法, 因其有性能高, 代码简单, 不依赖第三方服务, 无需独立部署服务等优点, 在一般情况下已经能满足绝大多数系统的需求, 原生SnowFlake, 百度UidGenerator这类基于划分命名空间原理的算法已经积累了大量用户;  使用原生的雪花算法...

2020-03-13 19:06:31 1578

原创 Docker 安装 Redis

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 的 NoSQL 数据库,并提供多种语言的 API。1、查看可用的 Redis 版本访问 Redis 镜像库地址:https://hub.docker.com/_/redis?tab=tags。可以通过 Sort by 查看其他版本的 Redis,默认是最新版本redis...

2020-03-06 16:46:20 245

51单片机 18B20

51单片机 18B20温度显示,内有许多程序,带有不同效果,上下限报警等

2015-08-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除