Go in Action
文章平均质量分 67
这里有go的基础介绍,有go优秀库的深入解析,更有笔者go开发的实战经验。欢迎来吃go的螃蟹,let’s go!
siddontang
hello go, let's go!
展开
-
gopkg:一种方便的go pakcage管理方式
在使用go的过程中,我们有时候会引入一些第三方库来使用,而通常的方式就是使用go get,但是这种方式有一个很严重的问题,如果第三方库更新了相关接口,很有可能你就无法使用了,所以我们一套很好地包管理机制。在读生产环境下go语言最佳实践有感一文中,我介绍过soundcloud公司的做法,直接将第三库的代码check下来,放到自己工程的vendor目录里面,或者使用godep。不过现在,我发现了一种更原创 2014-07-24 13:26:02 · 8083 阅读 · 0 评论 -
golang函数可变参数传递性能问题
几天前纠结了一个蛋疼的问题,在go里面函数式支持可变参数的,譬如...T,go会创建一个slice,用来存放传入的可变参数,那么,如果创建一个slice,例如a,然后以a...这种方式传入,go会不会还会新建一个slice,将a的数据全部拷贝一份过去?如果a很大,那么将会造成很严重的性能问题,不过后来想想,可能是自己多虑了,于是查看go的文档,发现如下东西:Passing arguments to原创 2014-06-23 12:58:37 · 5947 阅读 · 1 评论 -
高性能nosql ledisdb设计与实现 (2):replication
ledisdb现在已经支持replication机制,为ledisdb的高可用做出了保障。使用假设master的ip为10.20.187.100,端口6380,slave的ip为10.20.187.101,端口为6380.首先我们需要master打开binlog支持,在配置文件中指定:use_bin_log : true在slave的机器上面我们可以通过配置文件指定slaveof开启replic原创 2014-06-12 21:53:07 · 4479 阅读 · 2 评论 -
高性能nosql ledisdb设计与实现(1)
ledisdb是一个用go实现的基于leveldb的高性能nosql数据库,它提供多种数据结构的支持,网络交互协议参考redis,你可以很方便的将其作为redis的替代品,用来存储大于内存容量的数据(当然你的硬盘得足够大!)。同时ledisdb也提供了丰富的api,你可以在你的go项目中方便嵌入,作为你app的主要数据存储方案。与redis的区别ledisdb提供了类似redis的几种数据结构,包原创 2014-05-30 12:29:44 · 4836 阅读 · 0 评论 -
ledisdb:支持类redis接口的嵌入式nosql
ledisdb现在可以支持嵌入式使用。你可以将其作为一个独立的lib(类似leveldb)直接嵌入到你自己的应用中去,而无需在启动单独的服务。ledisdb提供的API仍然类似redis接口。原创 2014-05-16 11:07:42 · 3867 阅读 · 0 评论 -
读生产环境下go语言最佳实践有感
最近看了一篇关于go产品开发最佳实践的文章,go-in-procution。作者总结了他们在用go开发过程中的很多实际经验,我们很多其实也用到了,鉴于此,这里就简单的写写读后感,后续我也争取能将这篇文章翻译出来。原创 2014-05-12 11:01:57 · 10427 阅读 · 2 评论 -
发布一个参考ssdb,用go实现的类似redis的高性能nosql:ledisdb
起因ledisdb是一个参考ssdb,采用go实现,底层基于leveldb,类似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持。我们现在的应用极大的依赖redis,但随着我们用户量越来越大,redis的内存越来越不够用,并且replication可能还会导致超时问题。虽然后续我们可以通过添加多台机器来解决,但是在现有机器配置下面,我们仍希望单台机器承载原创 2014-05-10 16:59:30 · 7579 阅读 · 2 评论 -
我为什么选择go语言
这里,我并不打算引起语言争论的口水仗,我并不是什么大牛,对语言的造诣也不深,只是想通过自己实际的经历,来说说为什么我在项目中选择go。其他语言的经历C++在接触go之前,我已经有多年的c++开发经验。主要用在游戏服务端引擎开发以及P2P上面,那可是一段痛并快乐的时期,以至于我看到任何的程序钉子问题都觉得可以用c++这把锤子给敲定。但是对于互联网项目开发来说,除非你的团队整体的c++原创 2014-04-27 14:12:57 · 5313 阅读 · 1 评论 -
在golang中使用leveldb
leveldb是一个很强悍的kv数据库,自然,我也希望能在go中使用。如果有官方的go leveldb实现,那我会优先考虑,譬如这个,但是该库文档完全没有,并且在网上没发现有人用于实战环境,对其能否在生产环境中使用打上问号,保险起见,我还是决定不使用。因为leveldb有c的接口,所以通过cgo能很方便的进行集成,所以我决定采用该种方式,幸运的是,已经有人做了cgo的版本,也就是l原创 2014-04-23 13:30:29 · 15231 阅读 · 1 评论 -
golang使用pprof检查goroutine泄露
有一段时间,我们的推送服务socket占用很不正常,我们自己统计的同时在线就10w的用户,但是占用的socket竟然达到30w,然后查看goroutine的数量,发现已经60w+。每个用户占用一个socket,而一个socket,有read和write两个goroutine,简化的代码如下:c, _ := listerner.Accept()go c.run()func (c原创 2014-04-22 10:58:04 · 15016 阅读 · 1 评论 -
golang:一个高性能低精度timer实现
在go自带的timer实现中,采用的是通常的最小堆的方式,具体可以参见这里。最小堆能够提供很好的定时精度,但是,在实际情况中,我们并不需要这样高精度的定时器,譬如对于一个连接,如果它在2分钟以内没有数据交互,我们就将其删除,2分钟并不需要那么精确,多几秒少几秒都无所谓的。以前我们单独实现了一个timingwheel,采用的是channel close的方式来处理低精度,超大量tim原创 2014-04-16 10:24:59 · 7538 阅读 · 0 评论 -
在go中使用json作为主要的配置格式
最近在用go重构,在先前的代码中,我们使用的ini文件进行配置,但是因为很多历史遗留问题,导致配置混乱,维护困难,自然也需要考虑重构了。通用配置格式通用的配置格式有很多,常用的就有ini,json,yaml,xml等,当然为了通用我们不考虑自定义的配置格式。那如何选择呢?首先,xml我们就不用考虑了,到现在为止我都没觉得用这玩意配置起来有多方便,反而很臃肿,可能java系的童鞋原创 2014-04-13 11:54:43 · 10211 阅读 · 0 评论 -
go中string和slice no-copy转换
在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存。通常,我们不会在意string和slice的转换带来的内存拷贝性能问题,但是总有些地方需要关注的,刚好在看vitess代码的时候,发现了一种很hack的做法,string和slice的转换只需要拷贝底层的指针,而不是内存拷贝。当然这样做的风险各位就要好好担当原创 2014-04-12 17:10:23 · 7351 阅读 · 4 评论 -
go: 一个通用log模块的实现
在go里面,虽然有log模块,但是该模块提供的功能并不强,譬如就没有我们常用的level log功能,但是自己实现一个log模块也并不困难。对于log的level,我们定义如下:const ( LevelTrace = iota LevelDebug LevelInfo LevelWarn LevelError LevelFatal)原创 2014-04-07 21:36:48 · 6002 阅读 · 0 评论 -
moonmq: 用go实现的高性能message queue
介绍moonmq是一个用go实现的高性能消息队列系统,后续准备用于我们消息推送服务以及各个后台的异步任务。在设计上面,moonmq主要借鉴了rabbitmq以及rocketmq相关的思想,但是做了很多减法,毕竟我不是要设计成一个非常通用的mq。名词解释publisher,消息生产者consumer,消息消费者broker,消息中转站queue,消息存储队列pub原创 2014-04-03 18:30:56 · 8940 阅读 · 2 评论 -
在go中使用linked channels进行数据广播
在go中使用linked channels进行数据广播原文在这里(需翻墙),为啥想要翻译这篇文章是因为在实际中也碰到过如此的问题,而该文章的解决方式很巧妙,希望对大家有用。在go中channels是一个很强大的东西,但是在处理某些事情上面还是有局限的。其中之一就是一对多的通信。channels在多个writer,一个reader的模型下面工作的很好,但是却不能很容易的处理多个rea翻译 2014-03-30 21:57:26 · 2638 阅读 · 0 评论 -
mixer: sql词法分析器设计
介绍mixer希望在proxy这层就提供自定义路由,sql黑名单,防止sql注入攻击等功能,而这些的基石就在于将用户发上来的sql语句进行解析。也就是我最头大的词法分析和语法分析。到现在为止,我只是实现了一个比较简单的词法分析器,用以将sql语句分解成多个token。而对于从token在进行语法分析,构建sql的AST,我现在还真没啥经验(编译原理太差了),急需牛人帮忙。所原创 2014-03-23 16:38:42 · 3696 阅读 · 0 评论 -
polaris: session和middleware的支持
起因polaris虽然是模仿tornado开发,但我觉得作为一个go的web框架,还需要提供一些额外的扩展支持。polaris现在已经支持session以及middleware,主要参加django。polaris对于这些额外功能的支持,采取的是注册 + json配置驱动的方式。这个跟go的database/sql有点类似,任何模块都提供一套类似如下的接口:type O原创 2014-03-19 09:34:40 · 1710 阅读 · 0 评论 -
go-mysql: database/sql 接口适配
go-mysql已经支持golang database/sql接口,并通过https://github.com/bradfitz/go-sql-test测试用例。现在go-mysql可以直接通过golang sql接口使用,如下:import _ "github.com/siddontang/go-mysql/mysql"import "database/sql"后续的使用原创 2014-03-16 21:03:02 · 2922 阅读 · 0 评论 -
mixer: mysql协议分析
综述要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议。这样才能通过proxy架起client到server之间的桥梁。mixer的mysql协议实现主要参考mysql官方的internal manual,并用Wireshark同时进行验证。在实现的过程中,当然踩了很多坑,这里记录一下,算是对协议分析的一个总结。需要注意的是,mixer并没有支持原创 2014-03-13 11:17:52 · 4848 阅读 · 0 评论 -
polaris: 一个用go实现的支持restful的web框架
介绍polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计。虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好的对restful模型进行支持。考察了很多开源实现,我决定还是重新造一个轮子,毕竟难度也不怎么大,而且能够根据项目的使用慢慢调整完善。使用设计polaris还是参考了torna原创 2014-03-12 14:16:42 · 4710 阅读 · 0 评论 -
mixer: 一个用go实现的mysql proxy
介绍mixer是一个用go实现的mysql proxy,支持基本的mysql代理功能。mysql的中间件很多,对于市面上面现有的功能强大的proxy,我主要考察了如下几个:mysql-proxy,mysql官方的代理,使用起来并不友好,需要进行lua定制,而且本人对其稳定性和性能存疑。Cobar,阿里的东西,品质没的说,但对于我们项目,有点杀鸡用牛刀的感觉,另外我们都不会j原创 2014-03-10 09:40:20 · 5561 阅读 · 0 评论 -
go-mysql,一个易用的mysql接口框架实现
介绍go-mysql是一个用go写的mysql driver,使用接口类似于go自身的database sql,但是稍微有一点不同,现阶段还不支持集成进go database/sql中,但实现难度并不大,后续可能会接入。go-mysql最先开始于mixer(一个用go实现的mysql proxy)中,随着mixer的演化,我觉得有必要将其mysql模块独立出来使用。对于mixer,原创 2014-02-24 13:44:05 · 4860 阅读 · 0 评论 -
使用go reflect实现一套简易的rpc框架
go jsonrpc在实际项目中,我们经常会碰到服务之间交互的情况,如何方便的与远端服务进行交互,就是一个需要我们考虑的问题。通常,我们可以采用restful的编程方式,各个服务提供相应的web接口,相互之间通过http方式进行调用。或者采用rpc方式,约定json格式进行数据交互。在我们的项目中,服务端对用户客户端提供的是restful的接口方式,而在服务器内部,我们则采原创 2014-02-21 09:45:24 · 4406 阅读 · 0 评论 -
golang:使用timingwheel进行大量ticker的优化
Ticker最近的项目用go实现的服务器需要挂载大量的socket连接。如何判断连接是否还存活就是我们需要考虑的一个问题了。通常情况下面,socket如果被客户端正常close,服务器是能检测到的,但是如果客户端突然拔掉网线,或者是断电,那么socket的状态在服务器看来可能仍然是established。而实际上该socket已经不可用了。为了判断连接是否可用,通常我们会用原创 2014-01-16 21:39:12 · 10335 阅读 · 2 评论