自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

siddontang的专栏

my thought for program。

  • 博客(73)
  • 收藏
  • 关注

原创 gopkg:一种方便的go pakcage管理方式

在使用go的过程中,我们有时候会引入一些第三方库来使用,而通常的方式就是使用go get,但是这种方式有一个很严重的问题,如果第三方库更新了相关接口,很有可能你就无法使用了,所以我们一套很好地包管理机制。在读生产环境下go语言最佳实践有感一文中,我介绍过soundcloud公司的做法,直接将第三库的代码check下来,放到自己工程的vendor目录里面,或者使用godep。不过现在,我发现了一种更

2014-07-24 13:26:02 8075

翻译 leetcode:程序员面试技巧

起因写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然很多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有很多不清楚的地方,于是有了对于每道题目写分析的冲动。不过在看到leetcode上面的文章之后,决定先从翻译入手,顺带再写写自己做题的心得体会。今天是第一篇:程序员面试技巧。如果你主修计算机科学,那么在你工作的时候会碰到很多有难度的编程问题。当

2014-07-22 23:05:19 2491

翻译 celery最佳实践

作为一个Celery使用重度用户,看到Celery Best Practices这篇文章,不由得菊花一紧。干脆翻译出来,同时也会加入我们项目中celery的实战经验。通常在使用Django的时候,你可能需要执行一些长时间的后台任务,没准你可能需要使用一些能排序的任务队列,那么Celery将会是一个非常好的选择。当把Celery作为一个任务队列用于很多项目中后,作者积累了一些最佳实践方式,譬如如何用

2014-06-25 16:40:35 9703 1

原创 golang函数可变参数传递性能问题

几天前纠结了一个蛋疼的问题,在go里面函数式支持可变参数的,譬如...T,go会创建一个slice,用来存放传入的可变参数,那么,如果创建一个slice,例如a,然后以a...这种方式传入,go会不会还会新建一个slice,将a的数据全部拷贝一份过去?如果a很大,那么将会造成很严重的性能问题,不过后来想想,可能是自己多虑了,于是查看go的文档,发现如下东西:Passing arguments to

2014-06-23 12:58:37 5942 1

原创 我的编程语言经历

Alan Perlis 说过:“一种不改变你编程的思维方式的语言,不值得去学。”,虽然写了这么多年程序,用了这么多的语言,但我自认还没悟道编程语言如何改变我的思维方式。几天前,我需要用python来为ledisdb写一个客户端,我突然发现,对于c++,go这种语言,我如果需要实现一个功能,首先想到的是问题是代码应该怎么写。但是当我使用python的时候,我首先考虑的问题是在哪里去找一个库用来解决我

2014-06-19 13:05:32 17542 11

原创 高性能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 4475 2

原创 记录最近的几个bug

记录最近出的几个bugconnection reset by peer最近服务器经常性的出现connection reset by peer的错误,开始我们只是以为小概率的网络断开导致的,可是随着压力的增大,每隔2分钟开始出现一次,这就不得不引起我们的重视了。我们的业务很简单,lvs负责负载均衡(采用的是DR模式),keepalive timeout设置的为2分钟,后面支撑两台推送服务(后面叫做p

2014-06-04 16:55:14 2804 1

原创 高性能nosql ledisdb设计与实现(1)

ledisdb是一个用go实现的基于leveldb的高性能nosql数据库,它提供多种数据结构的支持,网络交互协议参考redis,你可以很方便的将其作为redis的替代品,用来存储大于内存容量的数据(当然你的硬盘得足够大!)。同时ledisdb也提供了丰富的api,你可以在你的go项目中方便嵌入,作为你app的主要数据存储方案。与redis的区别ledisdb提供了类似redis的几种数据结构,包

2014-05-30 12:29:44 4834

原创 ledisdb:支持类redis接口的嵌入式nosql

ledisdb现在可以支持嵌入式使用。你可以将其作为一个独立的lib(类似leveldb)直接嵌入到你自己的应用中去,而无需在启动单独的服务。ledisdb提供的API仍然类似redis接口。

2014-05-16 11:07:42 3866

原创 读生产环境下go语言最佳实践有感

最近看了一篇关于go产品开发最佳实践的文章,go-in-procution。作者总结了他们在用go开发过程中的很多实际经验,我们很多其实也用到了,鉴于此,这里就简单的写写读后感,后续我也争取能将这篇文章翻译出来。

2014-05-12 11:01:57 10424 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 7578 2

原创 谈谈自己造轮子

自己造还是不造轮子,这是一个哲学问题吗?

2014-04-30 08:33:37 6741 2

原创 我为什么选择go语言

这里,我并不打算引起语言争论的口水仗,我并不是什么大牛,对语言的造诣也不深,只是想通过自己实际的经历,来说说为什么我在项目中选择go。其他语言的经历C++在接触go之前,我已经有多年的c++开发经验。主要用在游戏服务端引擎开发以及P2P上面,那可是一段痛并快乐的时期,以至于我看到任何的程序钉子问题都觉得可以用c++这把锤子给敲定。但是对于互联网项目开发来说,除非你的团队整体的c++

2014-04-27 14:12:57 5308 1

原创 golang:高性能消息队列moonmq的简单使用

在上一篇moonmq的介绍中(这里),我仅仅简短的罗列了一些moonmq的设计想法,但是对于如何使用并没有详细说明,公司同事无法很好的使用。对于moonmq的使用,其实很简单,样例代码在这里,我们只需要处理好broker,consumer以及publisher的关系就可以了。首先,我们需要启动一个broker,因为moonmq现在只支持tcp的自定义协议,所以broker启动的时候

2014-04-24 14:08:30 11019 1

原创 在golang中使用leveldb

leveldb是一个很强悍的kv数据库,自然,我也希望能在go中使用。如果有官方的go leveldb实现,那我会优先考虑,譬如这个,但是该库文档完全没有,并且在网上没发现有人用于实战环境,对其能否在生产环境中使用打上问号,保险起见,我还是决定不使用。因为leveldb有c的接口,所以通过cgo能很方便的进行集成,所以我决定采用该种方式,幸运的是,已经有人做了cgo的版本,也就是l

2014-04-23 13:30:29 15227 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 15013 1

原创 golang:一个高性能低精度timer实现

在go自带的timer实现中,采用的是通常的最小堆的方式,具体可以参见这里。最小堆能够提供很好的定时精度,但是,在实际情况中,我们并不需要这样高精度的定时器,譬如对于一个连接,如果它在2分钟以内没有数据交互,我们就将其删除,2分钟并不需要那么精确,多几秒少几秒都无所谓的。以前我们单独实现了一个timingwheel,采用的是channel close的方式来处理低精度,超大量tim

2014-04-16 10:24:59 7532

原创 在go中使用json作为主要的配置格式

最近在用go重构,在先前的代码中,我们使用的ini文件进行配置,但是因为很多历史遗留问题,导致配置混乱,维护困难,自然也需要考虑重构了。通用配置格式通用的配置格式有很多,常用的就有ini,json,yaml,xml等,当然为了通用我们不考虑自定义的配置格式。那如何选择呢?首先,xml我们就不用考虑了,到现在为止我都没觉得用这玩意配置起来有多方便,反而很臃肿,可能java系的童鞋

2014-04-13 11:54:43 10208

原创 go中string和slice no-copy转换

在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存。通常,我们不会在意string和slice的转换带来的内存拷贝性能问题,但是总有些地方需要关注的,刚好在看vitess代码的时候,发现了一种很hack的做法,string和slice的转换只需要拷贝底层的指针,而不是内存拷贝。当然这样做的风险各位就要好好担当

2014-04-12 17:10:23 7345 4

原创 go: 一个通用log模块的实现

在go里面,虽然有log模块,但是该模块提供的功能并不强,譬如就没有我们常用的level log功能,但是自己实现一个log模块也并不困难。对于log的level,我们定义如下:const ( LevelTrace = iota LevelDebug LevelInfo LevelWarn LevelError LevelFatal)

2014-04-07 21:36:48 5993

原创 moonmq: 用go实现的高性能message queue

介绍moonmq是一个用go实现的高性能消息队列系统,后续准备用于我们消息推送服务以及各个后台的异步任务。在设计上面,moonmq主要借鉴了rabbitmq以及rocketmq相关的思想,但是做了很多减法,毕竟我不是要设计成一个非常通用的mq。名词解释publisher,消息生产者consumer,消息消费者broker,消息中转站queue,消息存储队列pub

2014-04-03 18:30:56 8936 2

翻译 在go中使用linked channels进行数据广播

在go中使用linked channels进行数据广播原文在这里(需翻墙),为啥想要翻译这篇文章是因为在实际中也碰到过如此的问题,而该文章的解决方式很巧妙,希望对大家有用。在go中channels是一个很强大的东西,但是在处理某些事情上面还是有局限的。其中之一就是一对多的通信。channels在多个writer,一个reader的模型下面工作的很好,但是却不能很容易的处理多个rea

2014-03-30 21:57:26 2637

原创 mixer: sql词法分析器设计

介绍mixer希望在proxy这层就提供自定义路由,sql黑名单,防止sql注入攻击等功能,而这些的基石就在于将用户发上来的sql语句进行解析。也就是我最头大的词法分析和语法分析。到现在为止,我只是实现了一个比较简单的词法分析器,用以将sql语句分解成多个token。而对于从token在进行语法分析,构建sql的AST,我现在还真没啥经验(编译原理太差了),急需牛人帮忙。所

2014-03-23 16:38:42 3695

原创 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

原创 web多语言url的设计

因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面url如何设计,假如我们需要支持en和cn的版本。他倾向于支持如下的url格式,后续以格式1指代:/en/group/abc.html/cn/group/abc.html而我则倾向于只提供一套url,lang的信息在其它地方携带,后续以格式2指代,譬如:/group/abc.html?lang=en对于格

2014-03-17 09:15:42 2366

原创 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 2918

原创 mixer: mysql协议分析

综述要实现一个mysql proxy,首先需要做的就是理解并实现mysql通讯协议。这样才能通过proxy架起client到server之间的桥梁。mixer的mysql协议实现主要参考mysql官方的internal manual,并用Wireshark同时进行验证。在实现的过程中,当然踩了很多坑,这里记录一下,算是对协议分析的一个总结。需要注意的是,mixer并没有支持

2014-03-13 11:17:52 4846

原创 polaris: 一个用go实现的支持restful的web框架

介绍polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计。虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好的对restful模型进行支持。考察了很多开源实现,我决定还是重新造一个轮子,毕竟难度也不怎么大,而且能够根据项目的使用慢慢调整完善。使用设计polaris还是参考了torna

2014-03-12 14:16:42 4708

原创 mixer: 一个用go实现的mysql proxy

介绍mixer是一个用go实现的mysql proxy,支持基本的mysql代理功能。mysql的中间件很多,对于市面上面现有的功能强大的proxy,我主要考察了如下几个:mysql-proxy,mysql官方的代理,使用起来并不友好,需要进行lua定制,而且本人对其稳定性和性能存疑。Cobar,阿里的东西,品质没的说,但对于我们项目,有点杀鸡用牛刀的感觉,另外我们都不会j

2014-03-10 09:40:20 5558

原创 libcoro:在c++中支持coroutine

起因在第一个版本的libtnet开发完成之后,我一直在思考如何让异步方式的网络编程更加简单。虽然libtnet通过c++ shared_ptr以及function等技术很大程度上面解决了异步代码编写的一些问题,但是仍然会出现代码逻辑被强制拆分的情况。而这个则是项目中童鞋无法很好的使用其进行开发的原因。所以我考虑让libtnet支持coroutine。Coroutine

2014-03-05 14:28:02 4272

原创 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

原创 使用go reflect实现一套简易的rpc框架

go jsonrpc在实际项目中,我们经常会碰到服务之间交互的情况,如何方便的与远端服务进行交互,就是一个需要我们考虑的问题。通常,我们可以采用restful的编程方式,各个服务提供相应的web接口,相互之间通过http方式进行调用。或者采用rpc方式,约定json格式进行数据交互。在我们的项目中,服务端对用户客户端提供的是restful的接口方式,而在服务器内部,我们则采

2014-02-21 09:45:24 4403

原创 lua c函数注册器

lua与c的交互关于lua和c的交互,主要有两个方面,一是lua调用c的函数,而另一个则是c调用lua函数。而这些都是通过lua stack来进行的。c调用lua在c里面使用lua,主要是通过lua_call这类函数,下面来自lua manual的例子:lua_getglobal(L, "f"); /* function to be cal

2014-01-24 09:23:48 4704

原创 一个简易版本的lua debugger实现

introduction工欲善其事,必先利其器。lua作为一门动态语言,虽然我已经习惯了使用print来进行代码调试,但是还是有很多童鞋觉得一款好用的调试器能更好的进行lua代码编写。所以在以前接手游戏的lua结合层之后,自然就需要提供一个debuger工具了。我们只需要的是一个能快速进行lua代码调试的工具,所以不需要gdb那种额外复杂的功能,只需要提供几种简单的功能就行了,如下

2014-01-24 09:21:24 6178 1

原创 golang:使用timingwheel进行大量ticker的优化

Ticker最近的项目用go实现的服务器需要挂载大量的socket连接。如何判断连接是否还存活就是我们需要考虑的一个问题了。通常情况下面,socket如果被客户端正常close,服务器是能检测到的,但是如果客户端突然拔掉网线,或者是断电,那么socket的状态在服务器看来可能仍然是established。而实际上该socket已经不可用了。为了判断连接是否可用,通常我们会用

2014-01-16 21:39:12 10328 2

原创 学习tornado:异步

why asynchronoustornado是一个异步web framework,说是异步,是因为tornado server与client的网络交互是异步的,底层基于io event loop。但是如果client请求server处理的handler里面有一个阻塞的耗时操作,那么整体的server性能就会下降。def MainHandler(tornado.web.RequestH

2014-01-09 22:23:13 9637 3

原创 学习tornado:安全

在web编程中,安全性是我们都必须面临的一个问题,包括cookie伪造,xsrf攻击等。tornado作为一个web framework,在安全性方面也提供了很多功能,这里简单介绍一下。cookie在web编程中,浏览器经常使用cookie来保存相关用户信息,用于与server交互,但是cookie有很多安全问题,譬如cookie伪造。cookie有很多方式被修改,javascript

2014-01-09 22:22:23 3890

原创 学习tornado:模板

第一次接触tornado的template,是在做oastub的时候,因为一位同学在handler里面硬编码了html代码,我决定引入template机制来降低逻辑与页面的耦合。简介tornado自带了一个简易的template引擎,使用它,我们可以很方便的构建自己的web页面。tornado的template使用起来很简单,如下:from tornado.template imp

2014-01-09 22:21:34 6745 1

原创 高性能C++网络库libtnet实践:comet单机百万连接挂载测试

最近在用go语言做一个挂载大量长连接的推送服务器,虽然已经完成,但是内存占用情况让我不怎么满意,于是考虑使用libtnet来重新实现一个。后续我会使用comet来表明推送服务器。对于comet来说,单机能支撑大量的并发连接,是最优先考虑的事项。虽然现在业界已经有了很多数据,说单机支撑200w,300w,但我还是先把目标定在100w上面,主要的原因在于实际运行中,comet还会有少量逻辑功能

2014-01-01 14:08:31 4647

原创 我的2013:在程序的路上不断求索

前言每年到这个时候,总需要回顾过去,展望未来。2013这一年学到了很多东西,收货了很多,也成长了很多。主要在技术和生活上面,让自己有了记录一下的冲动。技术在技术上面,这一年接触了很多新的东西,让自己眼界开阔不少,同时也开始自我提升,疯狂的在github上面玩开源,只是很多都惨不忍睹。Openresty今年最开始接触的新东西就是openresty,一个集成nginx的

2014-01-01 13:05:52 4123 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除