背景
很久没有写go了,最近重新温习了一下go知识,发现大概1年多以前基于zookeeper和go写了一个分布式的程序,拉下来跑了一下,也看了一下代码,发现很多不完善的地方,于是抽了个时间完善了一下项目。
整体分析了一下,这个项目还是非常适合于练手,实现功能的代码量非常少,而且代码经过重构以后可读性稍微要好一些,所有的功能实现都比较简单,没有复杂深奥的原理,比如选举没有使用raft这样复杂的算法,只是基于zk的原子递增实现的。
所以,基于此项目不是为了精进某一方面的内容,而是从各方面对go进行一个练手,同时掌握zookeeper的相关基础知识。
知识点
通过此项目可以了解以下知识点:
- go基础知识
- 协程使用
- 通道使用
- 反射使用
- logrus包的使用
- viper包的使用
- zk的基本使用
- 基于zk的leader选举算法
- 分布式节点发现
- 分布式节点通信
- 分布式下work任务分配
- 分布式下的一些相关问题
- 简单web服务实现
- 其他
功能架构
> 图片放在github,加载可能会较慢,请耐心等待
整体xconsumer项目代码量非常少,大致流程分为以下几步:
- 集群初始化(检查)
- leader选举
- leader集群任务分配
- 分发任务
- 开始工作
功能流程
注:只有leader节点操作,并且leader节点和其他follower节点一样,需要进行任务工作处理。
应用场景
项目实现的是分布式场景,可以实现自动任务负载,所以基本都能应用到具有这种特性的场景,只是可能某些场景下的功能不够全面。
- 分布式爬虫,爬虫的一个特点的针对每个url做处理,利用这个框架就可以根据需要设定多个task 任务进行爬取。
- 简单的服务发现,通过zk实现的node节点接入,算是一个简单的服务发现,可以自行二次开发形成一个稍微完善一点的服务发现。
- 消息队列分布式消费端,项目初期主要解决问题就是这个,根据不同的topic使用情况,分配不同的任务工作数量进行处理。
- 分布式任务处理器,如果我们存在大量需要定时的任务处理,采用此框架也是可以实现的。
- 临时任务处理器,我们可以动态的添加任务,这样就可以随时触发任务处理
- 其他
意见&建议
整个项目由于时间精力,实现工期较短,再加上个人能力有限,肯定存在很多不足的地方,某些代码或者实现都没有达到最优。
把这个项目拿出来主要还是为了能和更多人一起沟通交流,在学习一个东西的时候如果没有沟通和实践,往往难以真正的掌握,所以这里抛砖引玉,希望大家能多多提意见,感谢!
项目地址
xconsumer - 码云