golang
alex_023
喜欢编程,轻松,惬意。
展开
-
关于并发的那些事儿
前言最近一段时间没怎么写博客,一方面觉得基础性的没意义,不如看书,另一方面就是4、5月份竟然得了支气管炎,天我才40岁呢。 这次的动机,起因于朋友喊着帮忙整理一点题,作为考察架构师在多用户、大并发的水平。说实话,个人觉得简单的题毫无意义。稍微有点经验的,javaer,谁不知道synchronized、lock、volatile;gofaner呢,似乎也就chan、Mutex、WaitGrou...原创 2019-12-17 10:23:25 · 269 阅读 · 0 评论 -
go语言实践-protoactor使用小结
一年时间转瞬即逝,16年11月份因为业务需要,开始构建actor工具库,因为cluster下grain实现太困难,17年4月切换到具有该特征的protoactor,到现在,使用这个框架快一年。一路踩坑无数,趁这几天规划下阶段业务,就抽空聊聊。ProtoActor框架的基本要点Actor框架的提出基本上与CSP差不多处于同一个年代,相对于后者,过去10年Actor还是要稍微火一些...原创 2018-01-23 15:48:11 · 10615 阅读 · 2 评论 -
go 语言实践-goroutine+chan 并不是 CSP 的最佳方式
go语言的最大两个亮点,一个是协程,一个就是chan了。二者合体的典型应用CSP,基本就是大家认可的并行开发神器,确实简化了并行程序的开发难度,但个人并不是很推荐业务中直接面对这种硬编码。那么,本文的重点就是讨论硬编码面临的问题,以及相关的处理方案。 文中异步队列代码,具体参见:github 异步队列。不排除 github 代码库因为更新,而与文中描述不一致。一.CSP是什么C原创 2017-12-11 15:51:12 · 3788 阅读 · 1 评论 -
golang实践-小心接口与实现的动态绑定
背景知道吗?自定义类型的实例为空时,函数方法在不访问私有属性时,可以正常运行! 这段时间,我们采用了practoractor来处理有状态对象的并发,避免锁带来的困扰。但有时候,会出现非常奇怪的问题,就是框架反复重启对象,且不受控制,即使采用supervision策略也无效。这问题在过去几个月反复出现都没找到原因,最终在修改对象读取读取数据初始化代码的时候,才明白是某些特殊条件成立,返回对象是空造成原创 2017-09-03 00:18:55 · 6043 阅读 · 0 评论 -
golang积累-WaitGroup包装
Golang积累-WaitGroup包装golang的协程使用非常方便,但为了确保协程能够在主程序退出之前确保执行,会采用各种手段。 笨点的time大法:time.Sleep(time.Second)稍微好点的通道阻塞:var signalchan=make(chan int,0) //阻塞通道func foo(){ //do something signalchan<-1 //传递一个原创 2016-07-07 11:43:46 · 1845 阅读 · 2 评论 -
golang实践-如何优先使用通道替换锁
背景这段时间,重构了一些服务的基础工具库,主要是解耦pub-sub改为异步系统[eventbus],简单调整了定时器[clock]。本来以为已经大幅简化了业务没问题了,结果5月份,其中一个服务因为广播事件,导致死锁。分析后,发现是一个非常基础的问题导致,值得捋一捋。问题原因大致是这样:有一个服务对象,通过RPC,对外提供多个公共服务,并可以反向推送消息给客户端。其中,有多个rpc方法,被客户端调用原创 2017-06-14 22:16:48 · 3036 阅读 · 1 评论 -
golang积累-future模式
一般提到回调,第一反映就是函数回调,太熟悉了。在学习golang的过程中,通过阅读相关源代码,发现golang结合channel和WaitGroup,会有非常特殊的有别于函数回调的结果返回方式,常用于相对耗时运算的结果获取。其核心思路就是利用延时信号通知,来返回。因为暂时没查到中文的定义,暂时叫做Call回调,或者叫完成通知模式。通道模式Call就是一个公共的可访问的结构体定义,用于包装用户请求与结原创 2016-07-07 12:56:55 · 3703 阅读 · 1 评论 -
golang实践-第三方包为私有库的配置
正常使用了go 1.8一段时间没有发现异常,为了发布便捷,以及后期引入plug-in,开始将大项目分解。涉及到通过vendor引入私有库保存的第三方包。参考网上那些反复转帖的材料,始终无法成功,总是都会出现类似以下的错误:package git.oschina.net/xxx/yyy: unrecognized import path "git.oschina.net/xxx/yyy" (parse原创 2017-03-13 18:08:41 · 16061 阅读 · 1 评论 -
golang实践-随机数的那点事儿
序:不同种子竟然可以得到相同的结果我们用随机数,是期望每次得到的结果不同,因此我们传递不同的seed,来获取。但事实上,即使种子不同,我们也可能会得到重复、且有规律的取值。运行以下代码看看:func main() { now := time.Now() after := now.Add(time.Duration((1 << 31) - 1)) fmt.Printf("seed原创 2017-02-24 12:55:14 · 3834 阅读 · 0 评论 -
golang实践-如何实现高性能的定时任务管理器
问题背景在业务中,我们经常需要基于定时任务来触发来实现各种功能。比如TTL会话管理、锁、定时任务(闹钟)或更复杂的状态切换等等。 由于go语言协程非常轻,很容易开启多个并发。如果结合time包,能够非常easy的实现一次或多次的定时提醒。我们只需要几行关键代码,就可以session的变量过期设置。以下为忽略了更新功能的session ttl功能代码演示:var( cache=make(ma原创 2017-02-22 14:08:12 · 15425 阅读 · 5 评论 -
golang实战-nsq集群入门与坑
前端时间群里的gofans大增,问到了nsq在集群使用的使用问题。这里简单整理了一下,希望有所帮助。作为实时的分布式消息处理平台,nsq设计的目的是用来大规模地处理每天数以十亿计级别的消息。 由于具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。nsq基本是go开发服务端的消息中间件首选。组件构成nsq有三个组件以及辅助的几个工具构成。 ns原创 2017-02-23 15:40:04 · 16323 阅读 · 4 评论 -
golang积累-时间、时区、格式的使用
前几天,因为需要实现服务端运维时间端广播停机,但服务器在国外,而时间设置就涉及到了时区的概念。网上搜索了一下,大部分都是谈time.Formate中的Layout,非常不成体系,这里就简单总结一下。 开发中,我们对时间的使用是比较多的,其应用场景,按照使用概率,从大到小,通常是:获取当前或数据库中存储的时间比较两个时间点的先后显示打印时间时区转换对应到go,也就是几个基本定义:原创 2016-12-04 15:50:34 · 42964 阅读 · 1 评论 -
golang实践-目录结构与工具
这个话题确实是老调重弹,但确异常重要。 老实说,用go做正式项目之前,写过scala,但那个SBT太折磨人,偶然就上了go。两者语法的差别就不说了,但入坑之后才发现水深:没有模块部署及官方的版本管理工具,会带来很多麻烦。 反复折腾了近一年,基本上形成了一点固有的模式,做一般项目还算能够简单支持。没什么特别的技术点,更多只是一点心得。一、目录结构我们的代码以rpc为主,http为辅(调用rpc,也原创 2016-10-18 16:05:35 · 4910 阅读 · 1 评论 -
golang积累-接口指针与结构体指针
对go做过开发的朋友都很熟悉interface。这几天在网上看到了篇文章,谈到了interface与nil判等的问题。题是好题,就进一步了解了一下。原题如下:Nil接口并不是有Nil指针的接口type Cat interface { Meow()}type Tabby struct {}func (*Tabby) Meow() { fmt.Println("meow") }func GetA原创 2016-09-21 14:47:43 · 18555 阅读 · 3 评论 -
golang的服务控制实践
程序安全退出执行代码非安全写法在代码部署后,我们可能因为服务配置发生变化或其他各种原因,需要将服务停止或者重启。通常就是for循环阻塞,运行代码,然后通过control+C或者kill来强制退出。代码如下://file svc1.gopackage mainimport ( "fmt" "time")//当接收到Control+c,kill -1,kill -2,kill -9原创 2016-08-22 11:38:43 · 5919 阅读 · 1 评论 -
golang年度使用总结,简洁不简单
时间过得好快,从比较正式的使用go语言,已经差不多一年了。这期间,go从1.5发展到了1.7,自己因为兴趣+责任,来到了新的团队,再次从事曾经非常熟悉的开发工作,充实。在玩scala之后,用了go语言最初了解go语言,还是13年原单位一个项目。在不涉及到数据库操作的情况下,技术团队用.net竟然无法支持500/s的tcp峰值请求。本欲捡起Java,结果无意中知道了go。发现,用go的select非常原创 2016-07-31 18:34:29 · 7478 阅读 · 2 评论 -
golang 2 将会支持泛型
连续使用了半年多的golang,其语言特色不用多说,但个人总有那么几个点不爽:开放的构造函数不支持泛型没有枚举但就第二点,因为不支持泛型,所以每次从interface{}转换为具体类别的时候都存在开销,且很容易出问题。无意中在github看到了4月份的讨论,但还是感觉很爽!只是希望别拖到2018年。 红底黑字,大大的”Go2”,亮瞎双眼啊!原文出处: 讨论:https://githu翻译 2016-07-08 14:56:03 · 7219 阅读 · 0 评论 -
golang积累-记忆闭包
go语言中,作为一等类型的函数,是可以作为值来传递和使用。而闭包,则是函数和环境变量的结合。将函数作为参数,利用闭包的特性,可以用简洁的代码提供实用的功能。 之前提到call通过wg组合,来规避同一时刻同样的耗时操作导致系统崩溃。golang积累-Call回调模式,这个在Groupcachegithub的代码中用于同样数据在惰性加载的时候,对数据库的过热请求。具体代码参见:singleflight原创 2016-07-27 20:24:30 · 1554 阅读 · 0 评论