sniper 一个轻量级 go 业务框架的思考

Sniper 起源于一项新业务。GitHub 主页 <https://github.com/bilibili/sniper>。在转岗之前,我一直在 L 部门写 PHP 代码。 - 基于 TCP 的 RPC 协议,我们都称之为 **Weisai-RPC** - 手工维护 RPC 文档,难以及时更新 - 手写代码处理 RPC 入参,难以保证参数类型,如数字 `1` 和字符串 `"1"` 的区别 - 无法方便地查询一个请求对应的所有日志 - 服务拆分得很细,难以进行调用链路追踪 - 使...阅读全文

2019-06-13 17:02:11 haitao
阅读:1153 评论:0

后端架构设计,如何扛住100亿次请求?

1. 前言前几天,偶然看到了 《扛住100亿次请求——如何做一个“有把握”的春晚红包系统”》一文,看完以后,感慨良多,收益很多。正所谓他山之石,可以攻玉,虽然此文发表于2015年,我看到时已经过去良久,但是其中的思想仍然是可以为很多后端设计借鉴。同时作为一微信后端工程师,看完以后又会思考,学习了这样的文章以后,是否能给自己的工作带来一些实际的经验呢?所谓纸上得来终觉浅,绝知此事要躬行,能否自己实践一下100亿次红包请求呢?否则读完以后脑子里能剩下的东西 不过就是100亿 1400万QPS整流 这...阅读全文

阅读:2862 评论:0

Go Vet 命令:超出预期的强大

!["Golang 之旅"插图,由 Go Gopher 的 Renee French 创作](https://raw.githubusercontent.com/studygolang/gctt-images2/master/go-vet-command-is-more-powerful-than-you-think/go-vet.png) Go `vet` 命令在编写代码时非常有用。它可以帮助您检测应用程序中任何可疑、异常或无用的代码。该命令实际上由几个子分析器组成,甚至可以与您的自定义...阅读全文

2019-09-19 08:07:17 TomatoAres
阅读:4681 评论:0

今日头条在消息服务平台和容灾体系建设方面的实践与思考

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。 业务背景 今日头条的服务大量使用微服务,容器数目巨大,业务线繁多, Topic 的数量也非常多。另外,使用的语言比较繁杂,包括 Python,Go, C++, Java, JS 等,对于基础组件的接入,维护 SDK 的成本很高。 引入 RocketMQ 之前采用的消息队列是 NSQ 和 kafka , NSQ 是纯内存的消息队列,缺少消息的持久性,不落盘直接写到 Golang 的 cha...阅读全文

阅读:1411 评论:0

golang实现的bitmap:缓存并快速判断一组数字型id的有效状态,可用于判断优惠码是否有效类似的业务

需求:有一些连续的id,几十万,要检查其是否存在,且把状态缓存在内存里面如何存储可以使占用的内存最少,如何快速判断id对应的状态可用于校验优惠码类似的业务bitmap.gopackage util import ( "strconv" ) type Bitmap struct { //按64*i取模后得到的值(i为数组元素下标) modValues []uint64 length int } func (bitmap *Bitmap) IsExist(nu...阅读全文

2020-04-17 18:19:38 yanglikai
阅读:2585 评论:0

Golang 高并发编程使用Goroutine容易犯的错误

Golang goroutine是Go语言强大的特性之一,合理的利用它才能发挥最大的价值 1、经调查 发现初学者一般会犯以下错误使用goroutine func goroutineRun(values []int) { for value := range values { go value.test() } } 或者使用闭包调用 func goroutineRun(values []int) { for value := range values { go func() { fmt.Print...阅读全文

2020-04-26 09:32:34 阿俊
阅读:801 评论:0

数据库大表优化全攻略!!

作者:低至一折起来源:juejin.im/post/5b7d52afe51d453885030b91当MySQL单表记录数过大时,增删改查性能都会急剧下降单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候 MySQL 单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量。字段尽量使用 TINYINT、 SMALLINT、 MEDIUM_I...阅读全文

2020-05-26 17:36:29 逆风_c69c
阅读:1037 评论:0

25. 学习 Go 协程:详解信道/通道

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime Go 语言之所以开始流行起来,很大一部分原因是因为它自带的并发机制。 如果说 goroutin...阅读全文

2020年06月02日 王一白
阅读:495 评论:0

29. Go 语言中的 select 用法

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 前面写过两节关于 switch-case 的文章,分别是: 流程控制:switch...阅读全文

2020-06-08 13:32:35 Python编程时光
阅读:564 评论:0

项目结构设置

1.概述 实际项目业务功能和模块会很多,我们不可能把所有代码都写在一个go文件里面或者写在一个main入口函数里面;我们需要对项目结构做一些规划,方便维护代码以及扩展。 Gin框没有对项目结构做出限制,我们可以根据自己项目需要自行设计。 2.项目结构 有视图模板 ├── conf #项目配置文件目录 │ └── config.toml #大家可以选择自己熟悉的配置文件管理工具包例如:toml、xml等等 ├── controllers #控制器目录,按模块存放控制器(或者叫控制器函数),必要的时...阅读全文

2020-06-09 22:32:33 潇尘渊
阅读:1019 评论:0

golang socket连接复用 - smux

今天来介绍一个socket连接复用的包 https://github.com/xtaci/smux 如图所示,多个channel输入通过smux合并在一个连接中,后端服务将连接中的channel分离出来进行处理 smux.jpg 场景分析 假设一个简单的使用场景,一个apiservice网关服务对外提供HTTP接口,后面还有一个rand随机数服务,对内提供随机数TCP接口。 客户端访问apiservice接口,apiservice连接randservice服务获取数据并返回。如果不做多路复用的话...阅读全文

2020-06-10 10:32:59 写个代码容易么
阅读:1504 评论:0

小姐姐用动图展示 10 大 Git 命令,包你看完过目不忘!

git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗?如果你还有些分不清楚,那千万不能错过这篇文章。在本文中,熟知 JavaScript、TypeScript、GraphQL、Serverless、AWS、Docker 和 Golang 的 21 岁年轻软件顾问 Lydia Hallie 通过动图形式直观地介绍了这些常用 git 命令的工作过程,包你过目不忘...阅读全文

2020-06-16 17:32:49 吃井不忘挖水人呢
阅读:993 评论:0

golang领域模型-六边形架构

困惑: 在分层架构中是否困惑过某些逻辑处理或某些数据处理该放在哪一层? 在分层架构中是否困惑过该分多少层? 在分层架构中是否困惑过平层和跨层调用是否合理? 六边形架构 Alistair Cockburn 提出了一种具有对称特征的架构风格。在这种架构中,不同的客户通过平等的方式与系统交互。比如HTTP客户,MQ客户,它们平等对系统提供输入。Redis和DB也平等的提供输出。每个客户都拥有自己的适配器,去理解输入,比如gin、iris、echo就是http的适配器。那么内部是业务系统(领域模型),外...阅读全文

2020-06-22 20:32:43 八叉树
阅读:3380 评论:0

从零学习 Go 语言(21):一文了解 Go语言中编码规范

![](http://image.iswbm.com/20200607145423.png) 在线博客:http://golang.iswbm.com/ Github:https://github.com/iswbm/GolangCodingTime --- 每个语言都有自己特色的编码规范,学习该语言的命名规范,能让你写出来的代码更加易读,更加不容易出现一些低级错误。 本文根据个人编码习惯以及网络上的一些文章,整理了一些大家能用上的编码规范,可能是一些主流方...阅读全文

2020-06-23 08:32:12 hello_wbm
阅读:952 评论:1

为什么Go语言不允许循环引入?

每当Go程序编译出现循环引入报错的时候就非常让人头疼。 那么,为什么Go不允许循环引入呢? 我觉得原因如下: 搞清楚package包的定位 首先,搞清楚Go语言中package包的定位; Go语言的packa和其他语言中的库、模块是相同的概念,在其他语言中,实现某个库或者模块需要建立"单独的项目",而在Go中,仅仅是一个包就够了。 在正常Coding的时候,在我们项目中可以随便引入外来的项目(例如PHP项目引入PHP包),但是,我们可以随意的修改引入的包吗?不可以!在我们写PHP的时候,我们可以...阅读全文

2020年06月23日 菜刚RyuGou
阅读:1390 评论:0

go进程管理工具Pmon2实践

![](http://p0.qhimg.com/t017d6cbb68aed4b693.png) [360导航团队](https://hao.360.com)使用 `go` 语言开发 `web` 服务时间也比较早,对于 `go` 服务的进程管理工具的选择上也做了很多尝试。 `go` 官方并没有提供任何进程管理工具供大家使用,所以我们往往部署线上的 `go` 服务时会借助其他工具。常用的方式无非是如下这几种: 1. `nohup + &` 2. 系统内置常驻进程管理工具(`in...阅读全文

2020-08-18 13:21:50 apptut
阅读:2514 评论:0

GoLang下划线总结

今天在看 Gin 框架的时候,跟踪 Gin 在处理接口返回时,使用到了一个 render 包,查看代码的过程中,发现了这样的写法:// Render interface is to be implemented by JSON, XML, HTML, YAML and so on. type Render interface { // Render writes data with custom ContentType. Render(http.ResponseWriter) error // ...阅读全文

2020-09-15 10:32:32 道道法
阅读:571 评论:0