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

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

2014-05-11 16:30 siddontang
阅读:3736 评论:0

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

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

阅读:6077 评论:2

线上Golang程序 GC调优一例

13 Nov 2013 线上Golang程序 GC调优一例 Golang 是一个很有意思的语言,第一次看它介绍时,就很喜欢。半年前加入美团,有机会用它写了几个线上程序。其中一个程序Router,每天需要转发几千万的请求。由于需要根据请求内容决定route路径,它需要加载几十万deal(美团单)的信息到内存供查询。问题来了,用map装的几十万数据让gc很辛苦。 Deal数据 // Deal的定义 type DealTiny struct { Dealid int32 Classid int32 M...阅读全文

阅读:14095 评论:5

Go语言异步服务器框架原理和实现

Go语言类库中,有两个官方的服务器框架,一个HTTP,一个是RPC。使用这个两个框架,已经能解决大部分的问题,但是,也有一些需求,这些框架是不够的,这篇文章,我们先分析一下HTTP 和 RPC服务器的特点, 然后结合这两个服务器的特点,我实现了一个新的服务器,这个服务器非常适合客户端和服务器端有大量交互的情况。 HTTP服务器的特点: HTTP的请求 和 响应的周期如下: 对于一个HTTP 长连接,一个请求必须等到一个响应完成后,才能进行下一个请求。这就是http协议最本质的特点,是串行化的。而...阅读全文

2013-08-05 14:58 niniwzw
阅读:8258 评论:1

Go Runtime hashmap实现

前两天有小伙伴问道是否看过 Go 语言 map 的实现,当时还真没看过,于是就花了一点时间看了一遍 runtime 源码中的 hashmap 实现。map 的底层实现就是一个 hash 表,大体结构上和平时在脑海里的 hash 表差不多,但确实有很多细节(“Devils in the details”)。 hashmap 通过一个 bucket 数组实现,所有元素将被 hash 到数组中的 bucket 中,bucket 填满后,将通过一个 overflow 指针来扩展一个 bucket 出来形...阅读全文

阅读:6877 评论:3

Golang测试技术

Golang测试技术 十 22 bigwhite技术志 Concurrency, Go, Golang, GopherCon, http, Mock, Package, Unittest, 包, 单元测试, 并发, 构建, 标准库, 测试框架, 竞争检测 No Comments 本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对单...阅读全文

阅读:3011 评论:0