听说你需要一个go练手项目

原创
2021/07/23 11:39
阅读数 504

背景

很久没有写go了,最近重新温习了一下go知识,发现大概1年多以前基于zookeeper和go写了一个分布式的程序,拉下来跑了一下,也看了一下代码,发现很多不完善的地方,于是抽了个时间完善了一下项目。

整体分析了一下,这个项目还是非常适合于练手,实现功能的代码量非常少,而且代码经过重构以后可读性稍微要好一些,所有的功能实现都比较简单,没有复杂深奥的原理,比如选举没有使用raft这样复杂的算法,只是基于zk的原子递增实现的。

所以,基于此项目不是为了精进某一方面的内容,而是从各方面对go进行一个练手,同时掌握zookeeper的相关基础知识。

知识点

通过此项目可以了解以下知识点:

  • go基础知识
  • 协程使用
  • 通道使用
  • 反射使用
  • logrus包的使用
  • viper包的使用
  • zk的基本使用
  • 基于zk的leader选举算法
  • 分布式节点发现
  • 分布式节点通信
  • 分布式下work任务分配
  • 分布式下的一些相关问题
  • 简单web服务实现
  • 其他

功能架构

> 图片放在github,加载可能会较慢,请耐心等待

整体xconsumer项目代码量非常少,大致流程分为以下几步:

  1. 集群初始化(检查)
  2. leader选举
  3. leader集群任务分配
  4. 分发任务
  5. 开始工作

功能架构

功能流程

功能流程

注:只有leader节点操作,并且leader节点和其他follower节点一样,需要进行任务工作处理。

应用场景

项目实现的是分布式场景,可以实现自动任务负载,所以基本都能应用到具有这种特性的场景,只是可能某些场景下的功能不够全面。

  • 分布式爬虫,爬虫的一个特点的针对每个url做处理,利用这个框架就可以根据需要设定多个task 任务进行爬取。
  • 简单的服务发现,通过zk实现的node节点接入,算是一个简单的服务发现,可以自行二次开发形成一个稍微完善一点的服务发现。
  • 消息队列分布式消费端,项目初期主要解决问题就是这个,根据不同的topic使用情况,分配不同的任务工作数量进行处理。
  • 分布式任务处理器,如果我们存在大量需要定时的任务处理,采用此框架也是可以实现的。
  • 临时任务处理器,我们可以动态的添加任务,这样就可以随时触发任务处理
  • 其他

意见&建议

整个项目由于时间精力,实现工期较短,再加上个人能力有限,肯定存在很多不足的地方,某些代码或者实现都没有达到最优。

把这个项目拿出来主要还是为了能和更多人一起沟通交流,在学习一个东西的时候如果没有沟通和实践,往往难以真正的掌握,所以这里抛砖引玉,希望大家能多多提意见,感谢!

项目地址

xconsumer - 码云

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部