golang调度机制学习

1.Golang的核心之一gorountine

go语言非常重要的一个特性就是gorountine,有了这个东东,就可以很简单的做并发处理程序,比起c++和java的方式来说可以说简单了很多很多。那么gorountine又是一个什么样的东东呢? 从使用上来看它就是一个函数,使用起来有点像thread,但是实际上又不是,thread我们一般说起是指内核中的调度单元,他也是又用户态传递一个函数给thread,再由内核来调度执行,而gorountine是完全用户态的一个东西,而它要想和thread一样被执行那么就需要设计一个用户态的调度器,来保存它结构,执行现场和调度切换不同的gorountine[……]

Read more

golang的struct和interface

struct

struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;go中的struct类型理解为类,可以定义方法,和函数定义有些许区别;struct类型是值类型。

struct定义

struct的方法

在go语言中,我们可以为自定义类型定义类型相关的方法,比如:

上面的代码为player这个自定义类型声明了一个名为Name的方法,该方法返回一个string。值得注意的是(p *player)这段代码指定了我们是[……]

Read more

Golang信号处理和如何实现进程的优雅退出

Linux系统中的信号类型

各操作系统的信号定义或许有些不同。下面列出了POSIX中定义的信号。
在linux中使用34-64信号用作实时系统中。
命令 man 7 signal 提供了官方的信号介绍。也可以是用kill -l来快速查看
列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。
Linux支持的标准信号有以下一些,一个信号有多个值的是因为不同架构使用的值不一样,比如x86, ia64,ppc, s3[……]

Read more

Goroutine+Channel+WaitGroup使用

介绍

goroutine

golang语言中最有特色之一的东东就是这个goroutine了,很多时候问起别人为什么golang的好用,golang的网络性能可以那么好,一般都会多多少少想到goroutine,提起goroutine。在linux中内核的调度最小单位是就是thread,同一个进程中的多个thread线程就对应内核中的多个thread实体。所以thread是内核级的,而gorountine是一个不同于thread的概念,gorountine是一个用户态,另外一种说法也就携程,是用户态的一种调度粒度,每个gorountine也有自己的栈空间,而且是在用户内存中的。golang[……]

Read more

golang网络编程笔记

网络编程类型

我们一般提到的网络编程类型有两种:tcp和udp,都属于网络传输层协议支持下的协议,而且在目前也是网络编程中最基础的。这其中具体说来有有个socket的概念,tcp和udp都是协议,而socket就是一个具体的实现了,所以有tcp socket和udpsocket。golang是自身就带有网络库的net的,使用非常方便。
同时我这里还会简单介绍一下另外一种协议,用户态的,基于udp的,但是具有tcp的连接回话管理,重传确认等机制-kcp。
网络编程主要的目的是进行通信,所以就会涉及到至少2个端的通信,一般我们把这两个端分为服务端和客户端,服务端主要是起一个服务,实际上也[……]

Read more

golang的grpc学习笔记2


上一篇文章简单体验了一下grpc的golang使用,从环境安装到简单demo的编写,编译和测试,感觉还不错,今天再进一步学习分析其用法和一些要注意的坑。
grpc一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本。而且gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
从学习上来说,grpc的文档真是很全面了,http[……]

Read more

golang grpc简单使用


gRPC是一个高性能、通用的开源RPC框架,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。

1、相关包安装

1)protobuf

在下面的链接下载之后源码安装,
https://github.com/google/protobuf
安装过程也比较简单:

就可以安装好。

2)安装protoc的golang插件

设置好gopath之后直接使用下面的命令即可。
我的gopath设置为:/home/helight/gopath/
go get -u gith[……]

Read more

helight.info域名启用

纠结了好久,终于定了,启用了helight.info这个域名,同时还申请了helight.cn,helight.com的域名已经被人注册了,还是一个黑科技公司,看产品就很奇怪。
这几天已经配置把helight.info配置ok了,整个网站都切换了,zhwen.org还会继续使用,欢迎大家浏览。

微信小程序开发体验

    一直在想怎么做一个小程序,当然是一个有用的小程序,前天突然想到可以做一个小程序,把我的blog的内容拉去下来,并且在里面可以展示,给自己的blog增加一个移动端的入口,而且可以在每篇文章后面放一个打赏码。自己想着还是挺好的, 所以昨天注册了一个小程序“黑光技术”,现在申请还是比较方便的,不太好的一点就是要每次申请都要用一个不同的邮箱地址,我是用QQ邮箱的域名邮箱来做的,都是一个邮箱,每次申请就增加一个别名。
    做一个这样的一个小程序需要几个方面的配合:
    1)第一步就是申请一个小程序
    2)有一个blog,可以自己定制修改
    3)blog的feed和内容[……]

Read more

golang的httpserver优雅重启


去年在做golangserver的时候,内部比较头疼的就是在线服务发布的时候,大量用户的请求在发布时候会被重连,在那时候也想了n多的方法,最后还是落在一个github上的项目,facebook的一个golang项目grace,那时候简单研究测试了一下可以就直接在内部使用了起来,这段时间突然想起来,又想仔细研究一下这个项目了。
从原理上来说是这样一个过程:

所以一步一步来看,关键是从第2步开始之后怎么做,所以我们先来看看第2步的实现,这个应该说很简单,发送信号量到一个进程,使用kill命令即可,在facebook[……]

Read more

nginx+php站点配置https

    今天准备搞一个小程序测试一下,结果发现如果要链接我的站点,那就必须要站点支持https。所以就顺便鼓捣一下把站点升级一下,增加https的访问支持。
    首先解决的就是证书问题,一个个人blog就没有必要买证书了,发现证书老贵老贵的。所以找了找免费证书,最后发现腾讯云提供的还是比较好的,很方便申请,这里https://buy.cloud.tencent.com/ssl 直接选择免费证书,输入自己的域名就可以申请了,再按照他的流程就可以生效了,最后下载下来就可以用了。阿里云说是有,但是我的申请界面没有看到,所以没法用。
    这里记录一下在nginx+php网站怎么折腾的。

[……]

Read more

lex和yacc 学习笔记

    前一段时间在项目中要使用一个规则表达式计算的功能,而且想可以任意扩展计算功能,比如计算AUB,A和B都表示一个号码包,计算并集,当然实际使用的公式会更为复杂,这里举例说明。在计算时候要判断如果A包已经计算ok了就可以使用A包,如果没有计算成功就需要发起计算并且等待计算成功,B包也是要同样的处理过程,最后再计算并集。当然这样一个功能自己定义写肯定是没问题的,但是还要想到后面的扩展性和程序代码可移交等问题,还是想有一个通用的方法来解决,所以在最后想到了使用yacc和lex来组织解决。实际上后来发现用yacc和lex非常方便的可以解决这类问题,而且在扩展性上非常好。所以想这里先总结一下yac[……]

Read more

如何使用Swagger编写API文档

    最近在梳理内部系统的架构设计,而且前端时间也在kindle上看了一些国外开发在API的架构设计上的一些思考。所以就想着我们内部系统的api也应该梳理梳理了。
    目前内部使用golang开发是重头,基本上的服务和调度都是使用golang来开发,而且内部模块之间的调用都是http的接口。而且目前golang1.8已经默认支持了http2的协议,在效率上以前顾虑的问题,现在都有所缓解,所以把这块的梳理重点放在了http接口的梳理上。
    重点看了soap,json-rpc,restfull。在梳理中发现一个比较有意思的东东,叫 Swagger,中文名字也比较有意思:丝袜哥,[……]

Read more

ElasticSearch5.2.2安装坑记录

部署完成ES之后,如果我们不修改配置,那么默认只有本机可以访问ES的api接口,如果需要给外部机器访问,那么就需要修改ES的配置了。

在默认情况下,ES只允许本地访问api接口,如果我们希望在另外一台机器上访问ES的接口的话,需要配置主机地址:
/data/elasticsearch-5.2.2> vim config/elasticsearch.yml

#network.host: 192.168.0.1
network.host: 10.140.7.12

保存退出,重新启动es,一般都会报错,无法启动

[2017-03-16T10:51:23,168][I[……]

Read more

为游戏分析设计的分布式数据存储系统

本文是今年5月在中国云计算大会中的分享内容,主要是介绍腾讯游戏数据分析平台的一些后台架构设计和游戏分析思路。

在“大数据”相对泛滥的今天,我们看到很多讨论各种大数据架构、存储、工具、算法等等。但是大数据工具在具体应用场景中的计算各有不同之处,那在游戏数据分析中我们腾讯是怎么做的呢?本话题将简单介绍腾讯游戏数据分析系统的后台架构,并且主要介绍一个为游戏分析这类场景设计开发的的小型数据存储系统。

使用Spark分析网站日志

郁闷从昨天开始个人网站不断的发出告警504错误,登录机器看了一下是php-fpm报错,这个错误重启php-fpm后,几个小时就告警,快一年了都没什么问题,奇怪
[28-Sep-2016 11:53:19] NOTICE: ready to handle connections
[28-Sep-2016 11:53:19] NOTICE: systemd monitor interval set to 10000ms
[28-Sep-2016 11:53:26] WARNING: [pool www] server reached pm.max_children setting (5),[……]

Read more

Spark分区器HashPartitioner详解和扩展

在Spark中,存在两类分区函数:HashPartitioner和RangePartitioner,它们都是继承自Partitioner,主要提供了每个RDD有几个分区(numPartitions)以及对于给定的值返回一个分区ID(0~numPartitions-1),也就是决定这个值是属于那个分区的。

1 HashPartitioner分区

HashPartitioner分区的原理很简单,对于给定的key,计算其hashCode,并除于分区的个数取余,如果余数小于0,则用余数+分区的个数,最后返回的值就是这个key所属的分区ID。实现如下:

class HashPartitione[......]

Read more

分布式系统的Raft算法(转)

过去, Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。

来自Stanford的新的分布式协议研究称为Raft,它是一个为真实世界应用建立的协议,主要注重协议的落地性和可理解性。

在了解Raft之前,我们先了解Consensus一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。这样就需要一种Consensus协议,一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不[……]

Read more

【转载】从Hadoop到Spark的架构实践

当下,Spark已经在国内得到了广泛的认可和支持:2014年,Spark Summit China在北京召开,场面火爆;同年,Spark Meetup在北京、上海、深圳和杭州四个城市举办,其中仅北京就成功举办了5次,内容更涵盖Spark Core、Spark Streaming、Spark MLlib、Spark SQL等众多领域。而作为较早关注和引入Spark的移动互联网大数据综合服务公司,TalkingData也积极地参与到国内Spark社区的各种活动,并多次在Meetup中分享公司的Spark使用经验。本文则主要介绍TalkingData在大数据平台建设过程中,逐渐引入Spark,并且以[……]

Read more