如何优雅的关闭go Channel

本文译自:How To Close Channels in Golang Elegantly

几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评:

在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了
关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的
发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的

那些批评看起来都很有道理(实际上并没有)。是的,没有一个内置函数可以检查一个channel是否已经关闭。如果你能确定不会向channel发送任何值,那么也确实需要一个简单的方法来检查channel是否已经关闭:

阅读全文→

Go中的channel详解

Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。

它的操作符是箭头 <-

ch <- v    // 发送值v到Channel ch中

v := <-ch  // 从Channel ch中接收数据,并将数据赋值给v

(箭头的指向就是数据的流向)

就像 map 和 slice 数据类型一样, channel必须先创建再使用:
ch := make(chan int)
阅读全文→

[转]反向代理层绝不能替代DNS轮询

原创: 58沈剑
今天
有朋友问我,DNS轮询是不是过时的技术了?有了反向代理层(Nginx、LVS、F5等),是不是就不需要DNS轮询了?
然而,反向代理层绝不能替代DNS轮询!

反向代理层有什么用?架构实现时要注意什么?

  • 作为服务端统一入口,屏蔽后端WEB集群细节,代表整个WEB集群;
    画外音:这就是为啥它叫反向代理

  • 保证WEB集群的扩展性,Nginx后端可随时加WEB实例;

  • 实施负载均衡,反向代理层会将请求均匀分发给后端WEB集群的每一个实例;

  • 保证WEB集群的高可用,任何一个WEB实例挂了,服务都不受影响;

  • 注意自身高可用,防止一台Nginx挂了,服务端统一入口受影响;

    阅读全文→

幂等设计

我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。

  • 例如前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;
  • 我们发起一笔付款请求,应该只扣用户账户一次钱,
  • 当遇到网络重发或系统bug重发,也应该只扣一次钱;
  • 发送消息,也应该只发一次创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的情况都需要幂等的特性来支持。

幂等性概念

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现。幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。

幂等方案设计

有些操作是天然幂等的,譬如查询操作、删除操作。其他一些插入和更新操作有时候需要引入其他的机制来保证幂等,比如乐观锁、悲观锁等。这里介绍两种常用的来保证幂等的方案:利用数据库唯一索引和通过token机制来实现幂等。

利用数据库来实现幂等

利用数据库的一些特性来实现幂等设计,可以将一些复杂的加锁解锁操作转移到数据库来处理。这样可以大大减少编码的成本。
这里用来创建唯一索引的数据必须保证是唯一的,不可出现业务上允许的重复。

token机制

token机制方式重复提交token机制防止页面重复提交。由于网络或者重复点击的问题,可能会有重复的请求发送到服务器。利用token方式可以防止重复提交。

  • 数据提交之前要想服务器申请token
  • token放到redis或者tair提交后后台检验token,(检验token使用删除校验,删除成功即有效,因为查询在校验在并发中是很危险的)
  • 同时更新token状态进行逻辑处理

thx

关于 SSH 端口转发

SSH有三种端口转发模式

  • 本地端口转发(Local Port Forwarding)
  • 远程端口转发(Remote Port Forwarding)
  • 动态端口转发(Dynamic Port Forwarding)

对于本地/远程端口转发,两者的方向恰好相反。动态端口转发则可以用于科学上网。

SSH端口转发也被称作SSH隧道(SSH Tunnel),因为它们都是通过SSH登陆之后,在SSH客户端与SSH服务端之间建立了一个隧道,从而进行通信。SSH隧道是非常安全的,因为SSH是通过加密传输数据的(SSH全称为Secure Shell)。

常见的用途就是在管理远程数据库时,开启远程登陆是非常不安全的。所以通过隧道将其端口转发到本地(例如:mysql 的3306,redis的 6379)

阅读全文→

使用travis-ci自动部署hexo博客

最近研究了Traivs-ci,发现持续集成真是一个不错的东西,写好脚本之后,帮我省了一堆事。
现在用它来帮我持续集成我的hexo博客,现在我只需有将新的md文件push到github上,
travis会帮我处理好之后的事。

以下是我们将要实现之后写新博客的步骤也是我们要达到的目的:

  • 更新博客文章内容后 commit 到 GitHub repo
  • Travis CI 自动编译生成出新的静态博客文件
  • 自动部署至 GitHub Pages
阅读全文→

秒杀架构的原理与实践

本文从普通的下单流程到最终秒杀架构设计,根据个人理解,逐步
解决秒杀架构中常见的超卖,高并发等问题

普通的下单流程

抛开秒杀这层帽子不谈,正常的下单流程分为如下几步

  • 用户端请求下单
  • 服务端校验库存
  • 扣库存
  • 创建订单
  • 支付

这里先不谈支付业务,我们规定创建订单的同时意味着下单成功,即抢购成功

阅读全文→

尝鲜Mysql8.0

MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,支持json

以下为centos 7.4下 编译安装Mysql8.0 的记录,大约需要1小时

阅读全文→

ArchLinux安装与配置

A simple, lightweight distribution
一个简单,轻便的Linux操作系统,
Archlinux有一个强大的wiki,本文依据官方wiki编写
如有不当之处,请指出!

准备和磁盘分区

准备

  • 硬件
    • 一个大于等于4GB的U盘
    • 电脑(很明显)
阅读全文→