Goroutine + Channel 实践

背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Beego框架进行开发。之所以选择Golang,主要是考虑到开发的模块,都需要接受瞬时大并发、请求需要经历多个步骤、处理时间较长、无法同步立即返回结果的场景,Golang的goroutine以及channel所提供的语言层级的特性,正好可以满足这方面的需要。 goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread...阅读全文

阅读:38482 评论:5

golang的多协程实践

go语言以优异的并发特性而闻名,刚好手上有个小项目比较适合。 项目背景: 公司播控平台的数据存储包括MySQL和ElasticSearch(ES)两个部分,编辑、运营的数据首先保存在MySQL中,为了实现模糊搜索和产品关联推荐,特别增加了ES,ES中保存的是节目集的基本信息。 本项目是为了防止实时同步数据出现问题或者系统重新初始化时的全量数据同步而做的。项目主要是从MySQL读取所有的节目集数据写入到ES中。 项目特点: 因为节目集数量较大,不能一次性的读入内存,因此每次读出一部分记录写入ES。...阅读全文

2016-07-08 11:40 liughost
阅读:3343 评论:0

Golang的docker尝试

一、 前言 docker 就不在这里介绍了,相关的文档已经很完善,中文文档 Docker —— 从入门到实践 写的很棒,推荐去看看。 docker 基于 Golang 开发,已经不用解释了,而 Golang 天生适合运行在 docker 容器中,却不是这个原因,这得益于:Golang 的静态编译,当在编译的时候关闭 cgo 的时候,可以完全不依赖系统环境。 二、 Golang代码 我们打算在 docker 中测试 Golang ,所以先编写一个 Golang 的测试代码。 新建文件:vi mai...阅读全文

2017-10-20 21:03:16 dingdayu
阅读:8969 评论:0

Go Channel 高级实践

本文主要讲实践,原理部分会一笔带过,关于 go 语言并发实现和内存模型后续会有文章。 channel 实现的源码不复杂,推荐阅读,https://github.com/golang/go/blob/master/src/runtime/chan.go channel 是干什么的 意义:channel 是用来通信的 实际上:(数据拷贝了一份,并通过 channel 传递,本质就是个队列) channel 应该用在什么地方 核心:需要通信的地方 例如以下场景: 通知广播 交换数据 显式同步 并发控制...阅读全文

2018-08-29 17:35:36 sxssxs
阅读:1434 评论:1

Golang <-time.After()在计时器过期前不会被垃圾回收

最近我在调查 Go 应用程序中内存泄漏的问题,这个问题主要因为我没有正确的阅读文档。这是一段导致消耗了多个 Gbs 内存的代码: ```go func ProcessChannelMessages(ctx context.Context, in <-chan string, idleCounter prometheus.Counter) { for { start := time.Now() select { case s, ok := <-in: if !...阅读全文

阅读:4117 评论:4

Go读取大量数据,开启多协程,将读取的文件内容导入数据库,出现丢失数据现象

各位大佬,Go新人,昨天写了一个数据库导入工具,从本地文件并导入DbFileReadWriteChanel的数据是正确无缺少的,就在开启100协程写入数据,执行完毕后,发现导入后的数据表中缺少了100多条。<br>\ 清空数据表后,又运行,一次还是缺少,然后进行少量的数据测试,发现,还是丢失,但如果只是使用主线程,导入,则无问题。<br> 初步思考,代码出现问题的范围为一下代码块,请各位大佬协助,帮忙找一下问题所在,谢谢帮助。<br> ``` //将存入chanel中的数据导入到数据...阅读全文

阅读:3316 评论:16

Go 中基于 IP 地址的 HTTP 限流

如果你想限制一个正在运行的 HTTP 服务的请求量,你可以使用现有的轮子工具,比如说 [github.com/didip/tollbooth](https://github.com/didip/tollbooth) ,但是如果写一些简单的东西,你自己去实现也没有那么难。 我们可以用这个包 `x/time/rate` 。 在这篇教程中,我们将基于用户的 IP 地址构造一个简单的限流中间件。 ## Pure HTTP Server 我们来开始构建一个简单的 HTTP 服务,这...阅读全文

2019-12-04 18:17:25 alihanniba
阅读:3166 评论:0

实现Raft协议:Part 1 - 选主

翻译自Eli Bendersky的系列博客,已获得原作者授权。 本文是系列文章中的第一部分,本系列文章旨在介绍Raft分布式一致性协议及其Go语言实现。文章的完整列表如下: 序言:介绍 第一部分:选主(本文) 第二部分:指令和日志复制 第三部分:持久性和优化 在这一部分,我会介绍我们的Raft实现代码的结构,并重点介绍算法的选主部分。本文的代码包括一个全功能的测试工具和一些您可以用来测试系统的案例。但是它不会响应客户端的请求,也不好维护日志,这些功能会在第2部分添加。 代码结构 简单介绍一下Ra...阅读全文

2020年05月04日 GuoYaxiang
阅读:969 评论:0

实现Raft协议:Part 0 - 介绍

翻译自Eli Bendersky的系列博客,已获得原作者授权。 本文是系列文章中的序言,本系列文章旨在介绍Raft分布式一致性协议及其Go语言实现。文章的完整列表如下: 序言:介绍(本文) 第一部分:选主 第二部分:指令和日志复制 第三部分:持久性和优化 Raft是一个相对较新的算法(2014),但是已经在业界取到了广泛的应用。最知名的案例应该就是Kubernetes,其中的分布式键值存储组件etcd就依赖了Raft协议。 本系列文章的写作目的,在于描述Raft协议的一个功能完备且经过严格测试的...阅读全文

2020年05月04日 GuoYaxiang
阅读:1226 评论:0

【译】实现Raft协议:Part 3 - 持久性和优化

翻译自Eli Bendersky的系列博客,已获得原作者授权。 本文是系列文章中的第一部分,本系列文章旨在介绍Raft分布式一致性协议及其Go语言实现。文章的完整列表如下: 序言:介绍 第一部分:选主 第二部分:指令和日志复制 第三部分:持久性和优化(本文) 在这一部分,我们会添加持久性和一些优化来完善Raft的基础实现。所有代码已上传到这个目录。 持久性 类似Raft这样的一致性算法的目标,就是通过在独立的服务器之间复制任务来创建一个更具高可用性的系统。在此之前,我们主要关注的是网络分区的故障...阅读全文

2020年05月06日 GuoYaxiang
阅读:575 评论:0

万级K8s集群背后 etcd 稳定性及性能优化实践

1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群、EKS弹性集群、edge边缘计算集群、mesh服务网格、serverless knative)也越来越丰富。各类容器服务类型背后的核心都是K8s,K8s核心的存储etcd又统一由我们基于K8s构建的etcd平台进行管理。基于它我们目前管理了千级etcd集群,背后支撑了万级K8s集群。在万级K8s集群规模下的我们如何高效保障etcd集群的稳...阅读全文

2020-07-14 22:32:58 灵雀云
阅读:818 评论:0

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

本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 原文:https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1 作者:Lydia Hallie,机器之心编译,参与:Panda、杜伟 git merge、git rebase、git reset、git revert、git fetch、git pull、git reflog……你知道这些 git 命令执行的究竟是什么任务吗?如果你还有些分...阅读全文

2020-07-14 22:33:06 Java技术栈
阅读:1058 评论:2

MySQL Binlog 增量同步工具go-mysql-transfer实现详解

#一、 概述 工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal,其功能强大、运行稳定,但是有些方面不是太符合需求,主要有如下三点: 1、需要自己编写客户端来消费canal解析到的数据 2、server-client模式,需要同时部署server和client两个组件,我们的项目中有6个业务数据库要实时同步到redis,意味着要多部署12个组件,硬件和运维成本都会增加。 3、从server端到client端需要经过一次网络传输和序列化反序列化操...阅读全文

2020-09-04 20:35:39 wj596
阅读:2643 评论:0

go语言中控制并发数量的方法

因为go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些?下面是我个人整理的两个例子: func waitGroup() { count := 10 wg := sync.WaitGroup{} for i := 0; i < count; i++ { wg.Add(1) go func(j int) { fmt.Print(j) wg.Done() // 也可使用 wg.Add(-1) }(i) } wg.Wait() } 上面主要用到的是go中sync包下...阅读全文

2020-09-09 18:32:37 MO_ON_e503
阅读:774 评论:0