go pprof与线上事故:一次成功的定位与失败的复现

背景:一次大几万人的线上抢购活动,突然出现了问题,页面半天打不开,打开了半天下不了单,cpu涨了又跌跌了又涨,而内存使用又稳如老狗!不要慌,按照套路去分析问题,一切都不是问题! 阅读此文你将收获: 分析问题的一个思路! 学会使用pprof定位问题。 解决问题的一个思路! 大纲: 我是如何定位问题的 如何通过pprof精准定位 通过pprof来定位代码 我是如何trouble shooting的 一. 我是如何思考问题的 “活动挂了,下不了单!”,随着一声凄凉的惨叫,办公室大门被运营人员打开,于是...阅读全文

简书 2020-04-30 21:32:53 奔奔奔跑

Golang

数组和切片 01. 数组和切片有什么异同 slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的,长度定义好之后,不能再更改。在 Go 中,数组是不常见的,因为其长度是类型的一部分,限制了它的表达能力,比如 [3]int 和 [4]int 就是不同的类型。 而切片则非常灵活,它可以动态地扩容。切片的类型和长度无关。 数组就是一片连续的内存, slice 实际上是一个结构体,包含三个字段:长度、容量、底层数组。 <pre d...阅读全文

简书 2020-04-30 21:32:45 DoneIsBetter

Centos7搭建Mosquitto,Golang使用MQTT

介绍 MQTT是一种机器到机器消息协议,旨在为“物联网”设备提供轻量级发布/订阅通信。它通常用于车辆的地理跟踪车队,家庭自动化,环境传感器网络和公用事业规模的数据收集。 Mosquitto是一个实现了MQTT3.1协议的MQTT服务器(或代理 ,在MQTT中的用法),具有良好的社区支持,易于安装和配置。 在我的应用场景中,云服务器和食堂消费终端需要数据交互,终端拉取服务器数据使用HTTP,服务器通知终端使用MQTT。 本文的主旨在于记录Mosquitto服务的安装和使用、基于Golang实现发布...阅读全文

简书 2020-04-30 21:32:43 Avery_up

Golang多版本管理神器gvm

缘起 最近编译 GRPC 遇到了点坑,编译各种报错,经搜索调研发现用 mod 模式编译时对版本要求1.13及以上,。比如我的 go1.12.4 就无法编译,必须得 go1.13.xx 版本才能编译。为了解决这种尴尬的场景只能再在主机安装个 go1.13.xx 版本,那么有没有什么优雅的方式来实现本机多版本 Golang 版本的管理呢,能很方便的进行不同版本的切换,这也是本文的目的,推荐一款 Go多版本管理神器 gvm,用法类似 Python 的多版本管理工具 pyenv。 简介 gvm,即 Go...阅读全文

简书 2020-04-30 21:32:43 HonorJoey

2020 区块链 golang 版本(9) 工作量证明

封面 在上一篇分享中,我们定义了一个非常简单的数据结构,虽然简单但是我们已经可以看出区块链数据库的雏形。通过代码实现了创建区块链以及如何将区块添加到区块链中,区块链中每个区块都通过 hash 指针连接到前一个区块。这样将区块一个一个连接起来。但是实际上我们都知道区块链出块并没有那么容易。 区块链设计的一个巧妙之处,人们必须进行一些工作才能将区块添加到区块链中。正是这些艰苦的工作,也就是我们熟知的挖矿,才为区块链安全性和一致性提供保证。而且这项具有一定难度的挖矿工作也会得到回报(通过挖矿奖励矿工会...阅读全文

简书 2020-04-30 21:32:42 zidea

使用Go开发前端应用(二)

前言 在之前的第一篇文章:juejin.im/post/5e9ee0… 中,大概介绍了怎么使用Go去编写代码,然后将代码编译成wasm,之后可以在js中使用wasm。是一个非常简单的demo,这篇文章主要会用来讲解两个方面的知识 简单介绍wasm js中加载wasm js中访问wasm中导出的方法 wasm中访问js中的方法 简单介绍wasm 本来不想介绍,因为网上已经有很多这方面的介绍了,但是为了大家在看这系列文章的时候,可以有个快速的了解,这里还是大概介绍下wasm。 特点: 执行快速,接近...阅读全文

掘金 2020年04月30日 zhongzhong05

使用 bcrypt 函数生成密码

在几年前,相信很多和我一样的开发者都是使用 MD5 函数对用户的密码等敏感内容进行哈希化后存储到数据库中。即便是现在,还是很多开发者是这样的做法。 但很多事实告诉我们,如今用 MD5 函数生成的值在基于 彩虹表???? 和强大的 GPU 数亿次每秒的暴力破解下能较为轻松的破解。 所以对于需要保存用户密码等敏感信息的需求场景下,我们需要寻找另一种可靠安全的加密方式。 有关为什么 MD5 已经不可靠的原因可以参考我的另一篇文章《十万个为什么:别用 MD5 加密密码》。 当下推荐的方案是使用 bcry...阅读全文

Segmentfault 2020-05-05 16:32:34 imxfly

go : select 的执行顺序

原文链接 Vincent Blanchon 本文基于 go 1.14 select 允许在一个goroutine中管理多个channel。但是,当所有channel同时就绪的时候,go需要在其中选择一个执行。go还需要处理没有channel就绪的情况,我们先从就绪的channel开始。 Order select 不会按照任何规则或者优先级选择到达的channel。go标准库在每次访问的时候,都会将他们顺序打乱,也就是说不能保证任何顺序。 看一个有三个就绪的channel的例子: func mai...阅读全文

Segmentfault 2020-05-05 16:32:34 yixiao

8. Go 语言流程控制:if-else

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 1. 条件语句模型 Go里的流程控制方法还是挺丰富,整理了下有如下这么多种: if - els...阅读全文

掘金 2020年04月30日 王一白

让我们一起啃算法----合并两个有序链表

合并两个有序链表(Merge-Two-Sorted-Lists) 题干如下: 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4来源:力扣 这个题目和 两数相加 相似,都是考察对链表的操作。其实具体实现方式也差不多啦。 解题思路 根据题干我们知道,给定的两个链表是有序的。假设 l1 指向其中一个链表的头部,l2 指向另一个链表的头部,并初始化 head 和 curre...阅读全文

Segmentfault 2020-05-05 15:32:34 三斤和他的朋友们

Golang Map 实现 (四) map的赋值和扩容

golang map 操作,是map 实现中较复杂的逻辑。因为当赋值时,为了减少hash 冲突链的长度过长问题,会做map 的扩容以及数据的迁移。而map 的扩容以及数据的迁移也是关注的重点。 数据结构 首先,我们需要重新学习下map实现的数据结构: type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer oldbuckets unsafe.Poin...阅读全文

Segmentfault 2020-05-05 10:32:34 搬砖程序员带你飞

Golang Map 实现(三)map 的数据访问

本文在golang map 数据结构的基础上,学习map 数据是如何访问的。 map 创建示例 在golang 中,访问 map 的方式有两种,例子如下: val := example1Map[key1] val, ok := example1Map[key1] 第一种方式不判断是否存在key值,直接返回val (可能是空值)第二种方式会返回一个bool 值,判断是否存在key 键值。(是不是和redis 的空值判断很类似) 那访问map 时,底层做了什么,我们一起来探究 对于不同的访问方式,会...阅读全文

Segmentfault 2020-05-05 04:32:33 搬砖程序员带你飞

Golang Map 实现 (二) map 的创建

本文在golang map 数据结构的基础上,学习一个make 是如何构造的。 map 创建示例 在golang 中,初始化一个map 算是有两种方式。 example1Map := make(map[int64]string) example2Map := make(map[int64]string, 100) 第一种方式默认不指定map的容量,第二种会指定后续map的容量估计为100,希望在创建的时候把空间就分配好。 当make创建map时,底层做了什么 对于不同的初始化方式,会使用不同的方...阅读全文

Segmentfault 2020-05-04 15:32:32 搬砖程序员带你飞

Go、Java 和 Rust 的比较:得出了挺多结论

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言本文是 Java,Go 和 Rust 之间的比较。这不是基准测试,而是更多关注输出可执行文件大小,内存使用,CPU 使用率,运行时要求之间的比较,当然还有一个小的基准测试,可以每秒获取一些请求,并尝试展示一些数据。为了尝试将苹果与苹果进行比较(也许是?),我在此比较中使用每种语言编写了一个 Web 服务。Web 服务非常简单,它为三个 REST 端点提供服务。Web服务在Java,Go和Rust中提供服务的端点这三个 W...阅读全文

微信公众平台 2020-04-30 09:41:08 Go语言中文网

8. Go 语言流程控制:if-else

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com我的 Github:github.com/iswbm/GolangCodingTime 1. 条件语句模型 Go里的流程控制方法还是挺丰富,整理了下有如下这么多种: if...阅读全文

Segmentfault 2020-05-04 13:32:33 Python编程时光

golang NewTimer/NewTicker 源码阅读

1.引出 src/runtime/time.go 中的 startTimer NewTimer 和 NewTicker 分别在 src/time/sleep.go、src/time/tick.go 这两个文件下。这两个函数最主要的区别是NewTimer在初始化runtimeTimer的时候没有初始化period属性。不管是 NewTimer 还是 NewTicker 最终的实现都是调用 startTimer,startTimer 在 src/time/sleep.go 下没有函数体的,它的实现是...阅读全文

简书 2020-04-30 03:32:52 zcxzcxczcx