Goroutine与主进程的通信

还记得前半年去某条面试,面试小哥问我,当一个进程启动多个goroutine时,某个goroutine挂了,如何让主进程知道,当时大概知道可以通过context这个包来实现,但是当时没有具体去了解和熟悉这块,在这里再总结下。

子goroutine与主线程同步的集中方式:

  • channel: 每个goroutine往主进程的chan写数据,然后由主进程去读取,直到读取完了全部goroutine的chan就算运行完毕,此时主进程即可正常退出。这种方式是子线程通知主线程结束.
  • context: 使用context中的cancel,这种模式是主线程通知子线程结束
  • sync.WaitGroup: 通过Add方法设置等待子goroutine的数量,使用Done方法设置等待子goroutine的数量减1,当等待数量为0时,Wait函数退出.

Linux下快速构建Android编译环境

背景: 在移动互联网时代,大多数的企业内部都有移动客户端,而移动客户端又因为OS的不同产生了两个派系,即安卓(Android)苹果(IOS),而对于互联网技术从业者来说,这两者最直接的区别就是开源闭源,因而也导致了在构建移动客户端时,为了整体的稳定性和可靠性的考虑(甚至有成本的考虑),需要进行分别编译,本篇文章记录下如何在Linux环境下构建Android编译环境.

salt-master高可用架构

背景: 新来这家公司使用Salt来作为基础配置库管理和自动化运维的工具,但是前期同事刚开始使用时只是简单使用,因此对于可用性和可靠性来说都会存在很大问题(具体可能出现的问题下面会提到)。不过作为一个专业的SRE或者运维人员,在使用一个基础组件时,必须要考虑的一个问题就是可用性可靠性,以前使用Ansible作为配置管理和自动化运维工具时只需对ssh-key或者密码进行管理即可通过水平扩容来保证高可用,而在Salt中需要涉及到salt-minion的发现以及key的管理,接下来对高可用的Salt集群架构进行介绍和实施。

快速使用互联网检索有用数据

背景: 随着互联网的普及和发展,互联网上充斥了大量的数据,如何从海量数据中识别自己最想要的数据成为了很多人头疼的问题,接下来给大家分享一些自己常用的检索数据的网站和方法.

基于阿里云Terway网络的Kubernetes集群实践

背景: 众所周知的是在构建一个Kubernetes集群时,容器网络通常会使用一个独立的私有子网来构建Kubernetes集群内部的pod网络和service网络,但在实际的业务场景中,没有企业会在一段时间内将内部全部的服务都迁移到Kubernetes集群中(因为涉及到业务架构以及整体业务的可靠性),因而会产生一些Kubernetes集群内部服务和集群外部服务互相调用的场景,当然如果是HTTP服务,我们可以采用LVS、Nginx、HAProxy之类的代理工具工具进行集群内外的流量转发,但如果是TCP服务,比如使用Dubbo框架时,生产者和消费者需要直连,当生产者和消费者不在一个可以互联互通的网络下会比较麻烦,这也就是为什么大厂在规模化使用Kubernetes时首先需要解决的就是网络问题的原因了。比如我们在数科的时候就采用的是Contiv+BGP的模式来实现容器网络和容器外网络的互联互通的,而这通常需要一个比较专业的SDN团队来构建和维护。而作为创业公司通常会使用公有云来承载自己的业务,这种轻资产模式的好处就是底层会有专业的团队来提供保障,因此考虑到业务需求我们采用了阿里云的terway网络插件来实现内部的Kubernetes集群网络.

k8s删除Terminating状态的命名空间

背景: 我们都知道在k8s中namespace有两种常见的状态,即Active和Terminating状态,其中后者一般会比较少见,只有当对应的命名空间下还存在运行的资源,但是该命名空间被删除时才会出现所谓的terminating状态,这种情况下只要等待k8s本身将命名空间下的资源回收后,该命名空间将会被系统自动删除。但是今天遇到命名空间下已没相关资源,但依然无法删除terminating状态的命名空间的情况,特此记录一下.

Golang中的单元测试、基准测试、覆盖测试

单元测试、基准测试、覆盖测试

背景: 之前很长一段时间再写Golang程序时,不会有意识去写单元测试,直到后来写了独立项目后,慢慢才发现给一个功能编写对应的单元测试是多么高效和方便,接下来就再一起复习下Golang中的测试.