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

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

阅读:4576 评论:0

Go程序调试、分析与优化

Go程序调试、分析与优化 八 25 bigwhite技术志 atomic, BradFitzpatrick, Channel, Concurrency, Darwin, debugging, Go, Golang, goroutine, gotools, Linux, Mutex, optimization, parallelism, Perl, pprof, Ubuntu, YAPC, 优化, 原子操作, 并发, 并行, 调试, 锁 No Comments Brad Fitzpatrick在Y...阅读全文

阅读:4601 评论:0

如何快速掌握一门新技术/语言/框架...

IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话,那么你的核心竞争力就是IT相关的知识与技能的储备情况。而众所周知,IT行业是一个大量产生新知识的地方,就拿Web前端举例,短短的5,6年时间,Web前端已经经历了数次变革,就目前来看变革还将继续下去。从以前的div+css网格化布局到JavaScript的方兴未艾,然后是各种JavaScript框架的百家争鸣,HTML5和CSS3的落地,移动web冲击下带来的响应...阅读全文

2015-08-17 09:36 huang0925
阅读:848 评论:0

Go语言TCP Socket编程

Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的。 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,socket...阅读全文

十一月 17, 2015 bigwhite
阅读:11242 评论:4

golang的http client源码简析

RT: 有注释信息的代码在:https://github.com/yuanyangen/go_learning/tree/master/src/learning 上述代码是从golang1.5.2中得到的http部分源代码 在分析该源码过程中, 得到的简易流程图是: 在上述的流程中:不同颜色的方框表示不同的协程, 上图并没有完全将所有的细节 都展示出来,只是一个最基本的功能的描述, 而方框中的文字表示该处理的代码在哪个包下面的具体函数。 对于具体的详细处理流程, 请查看源代码。 在代码中出现的部...阅读全文

2016-01-12 00:23 yuanyangen
阅读:2989 评论:1

timer在Golang中可以有多精确?

本文主要讨论timer heap在Go中的管理,以及运行时对于时间是如何获取的问题,从而引出一个结论,我们对于timer的准确度可以有多大的依赖. 首先我们看一下Go是如何获取时间的,找到time.Now,发现最终调用的是下面这个汇编函数. // func now() (sec int64, nsec int32) TEXT time·now(SB),NOSPLIT,$16 // Be careful. We're calling a function with gcc calling conv...阅读全文

阅读:1025 评论:0

Go语言如何深度拷贝对象

深度复制可以基于reflect包的反射机制完成, 但是全部重头手写的话会很繁琐. 最简单的方式是基于序列化和反序列化来实现对象的深度复制: func deepCopy(dst, src interface{}) error { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(src); err != nil { return err } return gob.NewDecoder(bytes.NewBuffer(buf.Byt...阅读全文

阅读:2290 评论:0

以goroutine为例看协程的相关概念

转自 http://wangzhezhe.github.io/blog/2016/02/17/golang-scheduler/ 基本上是网上相关文章的梳理,初衷主要是想了解下golang中的goroutine到底是怎么回事,以及相关的起源和概念。后来发现本质上应该是对于golang scheduler的理解,因为goroutine是golang scheduler实现的一个重要模块。这一篇入门吧,基本理解到还行,如果想深入细致了解还是应该看源码,就像参考的那些比较好的链接中的那样。 补充 同步...阅读全文

阅读:1239 评论:0

Plan9汇编语言备查

Plan9汇编语言备查 2013-02-21 本文源于对A Manual for the Plan 9 assembler的部分翻译 机器 这个汇编语言可以用于MIPS,SPARC,Intel 386,Intel 960,AMD 29000,Motorola 68020和68000, Motorola Power PC,AMD64,DEC Alpha,ARM. 寄存器 汇编语言中所有预定义的符号都是大号的.数据寄存器是R0到R7;地址寄存器是A0到A7; 浮点寄存器是F0到F7。 A6寄存器是供...阅读全文

阅读:1146 评论:0

Codebase Refactoring (with help from Go)

Codebase Refactoring (with help from Go) 代码库重构(借助于Go) 1.摘要 Go应该添加为类型创建替代等效名称的能力,以便在代码库重构期间渐进代码修复。本文解释了对于这种能力的需求,以及没有它对于今天的大型Go代码库的影响。本文还探讨了一些潜在的解决方案,包括在开发(但没有包含在)Go 1.8中提出的别名功能。然而,本文不是任何具体解决方案的提案。相反,它旨在作为Go社区讨论Go 1.9中应该包含哪些解决方案的开始。 本文是2016年11月18日在纽约G...阅读全文

2017-05-01 16:53 majianguo
阅读:525 评论:0

Go接口详解

Go接口的设计和实现是Go整个类型系统的一大特点。接口组合和嵌入、duck typing等实现了优雅的代码复用、解耦、模块化的特性,而且接口是方法动态分派、反射的实现基础(当然更基础的是编译期为运行时提供的类型信息)。理解了接口的实现之后,就不难理解"著名"的nil返回值问题以及反射、type switch、type assertion等原理。本文主要基于Go1.8.1的源码介绍接口的内部实现及其使用相关的问题。 1. 接口的实现 (1) 下面是接口在runtime中的实现,注意其中...阅读全文

阅读:141 评论:0

进程、线程、协程与goruntine

相信作为服务端开发尤其是高性能服务开发的猿们,曾经面试都曾经被问到进程,线程之类的问题,作为操作系统最核心的概念,这些X程就像我们的一个个工具,是我们在开发过程中经常接触的概念,对于这些概念的不清晰我们便发现写的代码功能是对的,代码是渣的,将直接体现在我们代码的低效率,高bug率并附带问题出现都不知到问题出在哪里,作为新时代的猿我们原不需要那么多时间去解bug,我们需要更多时间陪女票,不是吗? 不过协程一般不会被问到,但在golang开发的过程中相信大家最经常接触的就是go协程,但对于什么...阅读全文

2017-06-05 好奇还思猫
阅读:284 评论:0

搭建你自己的Go Runtime metrics环境

自从Go 1.5开始,每次Go release, Gopher Brian Hatfield都会将自己对新版Go的runtime的性能数据(与之前Go版本的比较)在twitter上晒出来。就连Go team staff在世界各地做speaking时也在slide中引用Brian的图片。后来,Brian Hatfield将其用于度量runtime性能数据的代码打包成library并放在github上开源了,我们也可以使用这个library来建立我们自己的Go Runtime metrics设施了。...阅读全文

阅读:57 评论:0

最佳日志实践(v2.0)

----- 0. 缘起 ----- 大约在三年前,我曾经写过一篇 最佳日志实践 ( http://link.zhihu.com/?target=http%3A//blog.jobbole.com/56574/ ) ,还被码农周刊选为那年的 最受欢迎技术干货 ( http://link.zhihu.com/?target=http%3A//oiolong.github.io/linux/2015/01/04/manong-2014-collection.html ) 之一。当时我任职于网易杭州研...阅读全文

阅读:918 评论:0

聊一聊goroutine stack

推送在外卖订餐中扮演着重要的角色,为商家实时接单、骑手实时派单提供基础的数据通道。早期推送是由第三方服务商提供的, 随着业务复杂度的提升、订单量和用户数的持续增长,之前的系统已经远远不能满足需求,构建一个高性能、高可用的推送系统势在必行。 今年上半年我们用go开发了一个hybrid push服务,用户在线则借助长连接下发消息,不在线则借助厂商或第三方通道下发消息。 在构建过程中遇到了些与 goroutine stack 相关的问题,这里就和大家扯一扯。 带着问题阅读,才能让阅读更加高效,首先让我...阅读全文

2017-07-29 00:00 coding & life
阅读:639 评论:4

调试Go语言的核心转储(Core Dumps)

翻译原文链接 转帖/转载请注明出处 英文原文链接【Go, the unwritten parts】 发表于2017/05/22 作者JBD是Go语言开发小组成员 检查程序的执行路径和当前状态是非常有用的调试手段。核心文件(core file)包含了一个运行进程的内存转储和状态。它主要是用来作为事后调试程序用的。它也可以被用来查看一个运行中的程序的状态。这两个使用场景使调试文件转储成为一个非常好的诊断手段。我们可以用这个方法来做事后诊断和分析线上的服务(production services)。 ...阅读全文

2017-08-22 09:04:58 曼托斯
阅读:342 评论:0

快速掌握 Golang context 包,简单示例

预览目录 Context 原理 遵循规则 Context 包 WithCancel 例子 WithDeadline 例子 WithTimeout 例子 WithValue 例子 参考连接 对于 Golang 开发者来说context(上下文)包一定不会陌生。但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它。 应用场景:在 Go http 包的 Server 中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比...阅读全文

2017-08-28 01:52 Deepzz's Blog
阅读:852 评论:0

Go 程序的性能优化及 pprof 的使用

Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化。对于服务器而言,最重要的两项资源莫过于 CPU 和内存。性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低。反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量。 Go 的原生工具链中提供了非常多丰富的工具供开发者使用,其中包括 pprof。 对于 pprof 的使用要分成下面两部分来说。 Web 程序使用 pprof...阅读全文

2017-08-21 10:51 snowInPluto
阅读:725 评论:1

使用 pprof 和火焰图调试 golang 应用

什么是 Profiling? Profiling 这个词比较难翻译,一般译成画像。比如在案件侦破的时候会对嫌疑人做画像,从犯罪现场的种种证据,找到嫌疑人的各种特征,方便对嫌疑人进行排查;还有就是互联网公司会对用户信息做画像,通过了解用户各个属性(年龄、性别、消费能力等),方便为用户推荐内容或者广告。 在计算机性能调试领域里,profiling 就是对应用的画像,这里画像就是应用使用 CPU 和内存的情况。也就是说应用使用了多少 CPU 资源?都是哪些部分在使用?每个函数使用的比例是多少?有哪些函...阅读全文

2017-09-12 12:02 CIZIXS
阅读:94 评论:0