最近读了一下kafka的源码,真的是很蛋疼,本来准备写一篇长的关于消息队列的文章,结果看到某团的技术团队有一篇文章了,而且消息队列的东西基本上写全了,就不凑热闹了。
作为一个之前做底层的服务器后端人员,对造轮子这事还是比较有吸引力的,虽然说现在几乎所有的东西都有成熟的开源实现,但是造轮子总有一种魅力,勾引着我们去创造自己的轮子,这个系列就叫轮子系列吧。
首先,看看这个,想必大家对下面这种简历看得比较多了吧?
精通JAVA,Python,熟练掌握C++
精通Redis,Memcached,Mysql
精通Nginx配置,模块开发
精通Kafka,ActiveMQ 等消息队列
精通多线程,多进程,IO复用编程
这里面每个都是轮子,如果都是精通,那能精通这些轮子得多强大,至少我hold不住这么多东西。但是,这并不妨碍爱学习的我们来了解和制造这些轮子。
我们这里造轮子并不是真的是为了造轮子,现在的轮子非常多也非常好用,不到万不得已,完全没有必要去造自己的轮子,我们造轮子,只是为了了解轮子的构造,知道为什么这东西会成为轮子,还有就是这个轮子是怎么造出来的,在造轮子的过程中,用到的知识基本上会涵盖整个后端需要涉及到的知识,所以自己造轮子或者了解轮子还是很有必要的。
说起后端的轮子们,大家都可以说出一大串来,我们大致来数一数啊。
抗在最前面的:LVS,F5,HAProxy这类负载均衡
接下来有Nginx,Apache,Lighttpd这类Http服务
后面还有Redis,Memcached这一类KV存储器和缓存系统
如果是多机部署,肯定还有Kafka,ActiveMQ这种负责解耦的消息队列
当然也少不了Thrift这种RPC框架和Protobuf这种序列化技术
如果够高端,到了分布式领域了,zookeeper也是轮子了
恩,感觉上差不多也就这些了吧?和上面的简历出现的东西差不多能对上了吧?后端的轮子们,排得上号的也就是这些个方面了吧,可以做一个 技能树
出来, 精通
了上面这些轮子和轮子的使用,基本上后端的工作就游刃有余了,剩下的就是一些业务逻辑了,哦,当然,放心,你 精通
不了全部的,但 了解
甚至 熟悉
还是能做到的,好了,接下来的一段时间,让我们一起来点亮这棵技能树吧。
这里没有写数据库这个东西,一是我认为他不是轮子了,他比轮子复杂多了,属于像操作系统一样的基础结构了,二是这系列文章都是会对应代码的, 数据库我写不出来
,这才是关键原因。
接下来的文章更新不会很频繁了,我会按照上面这个技能树,一个技能一个技能的点亮这个技能树,有些我了解得多的就说详细点,有些了解不深的就少说点,反正都会点出来,每个技能树都会配上 最最最
基础的代码实现这个轮子,当然这些代码是不能用在生产环境拉。
最后,我会使用实现的轮子们, 打造一个简单的推荐引擎
,也算物有所用了。
恩。。。代码还没有写一行,所以这个系列文章更新会比较慢。望耐心:)
另外,不要对代码抱有很大的希望,都只会是最最基础的测试代码,不能用在生产环境,比如http服务器的话,不会实现整个http服务,可能只会实现后面会用到的GET方法, 请把关注点聚焦到每篇文章上
既然要造轮子,那首先还是要有点基础技术才行,也就是先要知道哪些东西是轮子的轮毂,哪些东西是轮子的胎了,代码说到底就是数据结构和算法了,所以无论什么轮子也逃不开这两个东西,除了这个还需要一些操作系统和网络相关的知识,要实现上面的那些个轮子,需要用到哪些知识呢?我们捡最基础的和最常用的说说,后面的文章会一一说到这些东西。
哈希表,这个是很多轮子都要用到的东西,之前有一篇介绍哈希表的文章,后面还会继续这个算法和对应的数据结构。
树,栈,队列这些个最基础的数据结构也是会经常用到的,其中包括了各种各样的树的实现。
数据编码的基本知识。
计算机网络知识,包括一些网络协议,不仅仅是http协议,还有底层一点的tcp协议,因为有些轮子需要在tcp上实现自己的协议。
操作系统和计算机体系结构的一些知识也是必不可少的。
分布式的一些知识也是需要知道的,最后一个轮子是zookeeper,实际上是paxos协议了,我觉得我实现不了一个最简的paxos(因为这玩意就没有最简可言,必须要全实现出来),但是这部分知识还是会说到的。
好了,大约上面这一些知识就差不太多了,毕竟只是一个最简的实现,别看每个也就一句话,要真正了解这些也不是一件简单的事情,更别说精通了,所以看到那种全屏 精通
的简历,肯定是扯淡的,找准一个你了解的领域,一顿虐吧。
除了轮子的轮毂,那是支撑整个轮子的,还有一些外围的基础技术,构成了轮子的轮胎,这部分东西就是一些编程上的技术了,都包括:
多协程,多线程,多进程编程。
网络编程,多路复用技术,还有相应的事件轮询模型。
共享内存,内存映射,管道技术。
这里也就简单的三行,要都了解并且精通也很不容易,所以这些东西我也不可能讲得很好,肯定有不正确的地方,欢迎大家指正出来,共同进步哈:)
造轮子的材料选 golang
,有时候可能会直接使用 C
,因为啊,Java不怎么会,其他语言来造轮子也不太常见。
本篇就是开了个头,后面我们一个一个来说。