Liangjf

The darkest hour is that before the dawn.

golang

makefile提高效率

golang makefile提高效率 #Go parameters GOCMD=go GOBUILD=$(GOCMD) build GOCLEAN=$(GOCMD) clean GOTEST=$(GOCMD) test GOGET=$(GOCMD) get SOURCE_NAME=demo BINARY_NAME=demo BINARY_UNIX=$(BINARY_NAME)_d DEP...

由服务注册中心故障引起的思考

CAP和BASE理论

由服务注册中心故障引起的思考 由于某个bug(不方便说,请见谅),公司的服务注册中心不可用,故障持续15分钟,期间,新发版的服务由于不可注册,造成新发版服务不可用,在线服务仍旧可用。 如今,大型商业项目,一般都是微服务架构,服务注册中心这个组件是必不可少的。它的作用在这里就不说了,本文单纯讨论下服务注册中心的可用性,可靠性。 服务注册中心必须是集群架构的,由于是分布式架构,从而就会涉及...

go-bindata

redis lua脚本高效技巧

go-bindata实现redis lua脚本高效技巧 实际写业务的时候, 在使用redis时, 为了原子性, 经常会使用到嵌入lua脚本的方法, 把逻辑包装在lua文件中, 发到redis-server原子执行 下面以 对消息队列的消息做幂等性判重的业务 来介绍一种高效的方案 借助redis的set来实现判重, lua脚本(check_seq.lua)如下: local seqKe...

go题目

由一道go题目引发对内存分配和内存逃逸思考

由一道go题目引发对内存分配和内存逃逸思考 题目 func question1() { staff := map[string]int{ "a": 33, "b": 29, "c": 8, } var n []*int for _, s := range staff { fmt.Printf("%d\t%p\n", s, &s) n = append...

反射

go 反射和应用场景

go 反射和应用场景 [toc] 1、go的反射 go是静态语言,每个变量都有其类型,在编译期就可以确定其类型。但是有一个特色的interface{}空接口,它是一个包装器,可以表示任意类型,并且可以通过interface{}来实现多态的特性。 据Russ Cox大神介绍,一个接口类型的变量是由二者组成(值、类型):值的类型描述和具体值。其实就是变量的值和变量的元信息。通过二者才能描...

hystrix

hystrix设计深究

hystrix设计深究 hystrix介绍 hystrix采用的是命令模式, 把一个请求抽象封装成一个命令, 视是同步调用还是异步调用来创建goroutine, 下面用命令来代表一次真实的请求 hystrix是状态机轮转, 断路器开-断路器关-探测断路器, 默认是关, 错误率达到阈值就转变为开, 从而触发熔断, 快速错误返回和降级, 保护资源 每个资源的断路器创建是在对应资源有请求过来...

消息乱序,重复,幂等性

语音遥控器和智能台灯项目复盘

语音遥控器和智能台灯项目复盘 遇到的问题 涉及问题: 消息乱序, 消息不重复消费, 接口幂等性 项目背景 对于这两个项目, 用户控制命令不能是重复响应, 而且控制命令不能是乱序的? 但是推送系统的消息队列使用的是nsq, 为什么用nsq? 因为架构简单分布式, 配置和运维简单, 而且大多的业务都是和顺序无关的. 想象一下, 开灯和关灯两个控制命令, 在终端的控制顺序是开灯在前, 关灯...

设计模式

设计模式在go的开源项目和实战开发的总结

设计模式在go的开源项目和实战开发的总结 以下设计模式和开发设计技巧是在工作, 学习和阅读开源项目源码时的一些总结, 会定时更新, 增加新的总结. 函数选项模式 grpc-go,go-micro,etcd……N多开源项目使用了此模式,因为go没有默认参数,并且函数选项模式可以优雅的实现了默认参数结构体,并且通过函数对象来对参数赋值。一般是Options参数结构、Option函数对象、...

nsq

nsqd的网络通信和对网络逻辑处理框架的思考

nsqd的网络通信和对网络逻辑处理框架的思考 nsqd网络通信 nsqd中关于通信的一些小点: tcp服务是用于监听客户端连接, 使用了多路复用模型(go标准库的tcp服务是基于epoll/kqueue/select等的) 暴露http服务, 提供接口直接发布消息到nsqd, 获取topic channel信息 元数据持久化元数据到...

nsq

nsq中的内部优化和技巧

nsq中的内部优化和技巧 1.内存队列和磁盘队列的选择 func (c *Channel) put(m *Message) error { select { //推入内存队列 case c.memoryMsgChan <- m: default: //内存队列满了, 走落盘的方式 b := buffer...