陈硕《网络编程实战》
03 课程内容大纲【稿】
站在巨人的肩膀之上。
按照录像整理,部分专有名词不太肯定,版权归陈硕大神。
我们对TCP的基本性能有了一个大致的了解,用这个简单的dd、Netcat之类的工具,就能快速的找出两台机器之间的可用带宽有多少。
接下来几个PPT画面讲的是,我们这门课程计划讲哪一些例子:
首先从简单的非并发的例子讲起第一个例子是TCP性能测试工具,它用的那个协议和 nc 不一样,所以这个也有必要讲一讲;
第二个是测试两台机器之间的时间差,这个很有意思,也是计划中唯一一个使用UDP的例子;
第三个是Netcat,就是我们用过的这个工具,因为它是网络编程的瑞士军刀,为什么要讲他?是因为他和标准输入输出要打交道,也可以展示一些网络编程的方面;
第四个例子是一个慢速的收发的这么一个工具,用来模拟网速比较慢的情况,他是从业务层模拟的,就是故意的,收到之后等一下再收下一个数据,发送也是一样,这样有可能帮你找出,这个服务端特别是在非阻塞的情况下,能不能正确应对接收速度慢的情况。
第二类例子是并发网络编程,这里面我大概想了四个例子:
第一个是SOCKS代理服务器,它等于是把两个TCP连接这个中继一下,让他一个代理,SOCKS协议很简单,让他这个代理服务器写出来,在阻塞情况下很容易,在非阻塞情况下,如果两边,两端的带宽不匹配的话,会有一些麻烦,需要处理;
第二个例子是数独的求解,这是一个典型的请求响应式的模型,客户端发过来一个数独难题,服务端返回一个求解的结果,或者无解,这个特点就是,连接之间是独立的,也可以做服务器的并发,让他支持多个连接,而且能够,充分利用多核的CPU计算资源,这个例子还可以进一步扩展成计算量更大的情况;
第三个是一个简单的memcached,这是一个有一点实用价值的小程序,其实他不是想替换memcached,因为这个是memcached已经被大概淘汰了,但这个作为一个非阻塞网络编程的例子来讲的话还是有一定价值,他大概五六百行就能把这个实现出来,再由网络库帮助的情况下;
第四个是应用层的TCP的广播,就是一个消息要发给多个TCP的接收端,那这个的特点就是跟前面不一样,是在于它连接之间是有交互的,,一个连接收到了数据要往别的多个连接发出去,这自然一个是连接的生命期管理有挑战,第二个是如果有一个连接,收的速度慢,会发生怎么样的情况,这个数据会堆积吗,会造成服务器这个内存使用暴涨吗?等等,这是并发编程的几个例子。
前面例子如果算的话还可以,就算是纯的网络编程,就是没有直接的应用价值,后面讲的是用多台机器进行数据处理,其实现在比较流行的使用Hadoop(批处理框架)或者Spark(含流处理能力的下一代批处理框架)这样的现成的分布式计算框架来做,但有些简单的任务也可以用网络编程来做,这个目的就是锻炼网络编程,另外一方面也可以获得一些乐趣:
一个是,并行的八皇后问题求解,八皇后这个是属于编程第一门课就要讲的内容,如果16、20个皇后的话,一台机器算是很慢的,如果能用,10台8核的机器一共80个核,一起算的话应该能提速,怎么做?这个例子会讲;
第二个也是一个数据处理的,这个数据处理是求分布在多台机器上的数的中位数,这是一个比较经典的面试题,拿来做编程练习也是很好的;
第三个是查询出现次数最多的项,也是跨机器,比如说十台机器,每台机器有这个查询日志,然后你找出过去的这些日志里面出现最频繁的查询有哪些,最频繁的一千个查询;
第四个呢,是分布式排序,这个实际应用的例子是在实现,MapReduce的时候,中间有一个shuffle,那一步,就是 MapReduce中间的shuffle,他设计分布式排序,这也恐怕是 MapReduce 框架实现的几个难点之一。
这四个例子从数据量交换的大小是从小到大排列,第一个是几乎没有数据交换,第二个也很少,第三个会有一些数据交换,在这些机器之间,第四个基本上,数据也在机器,之间做一下shuffle,就是洗牌的那种动作,所以这个是按这个顺序排列。
最后,这门课程讲一些高级一点的主题,其实不算特别高级:
一个是RPC,RPC是一个很基本的这个开发网络服务的工具,有很广的适应面,那就是你不用再去和IO直接去收发数据打交道,你就直接调用一下远程的一个Various servers,这样的话编程很方便,也是,具有很强的使用面;
第二个是负载均衡,这个网络编程的时候,你做服务器,一台机器,如果容量不够,撑不下来,足够多的请求的话,你可用多台机器,那么怎么做负载均衡,这个办法很多,最简单的是那个 round-robin,我们希望能够做的比他好一点,这个讲到这个时候再细说;
第三个是服务系统的这个容量管理,比方说我有一个需求:我现在要多少 x 个QPX,x 可以是五万、十万、二十万、五十万等等,有了这个数据,要问我需要多少台服务器硬件才能够,支撑下这么多的容量,这个一方面要测试,另外一方面是你测试之后,这个数据能不能做出一些预测来,你如果你把机器买了,然后发现不够,你再去买的话周期很长,如果你已经有一些机器能不能做一下数据的外扩就能够,以小见大,能够算出来一个比较靠谱的机器数,这里面的关键是确定这个系统里面,它每一个 replica 的数目,他们一个组件有不同的 replica 数,还是我们这里面基本上是一个阻抗匹配的关系,;
第四个是延迟,也在一个服务系统里面,你除了关心它的容量,Capacity 吞吐量以外,延迟也很关键,由于涉及到用户体验方面的问题,如果,容量大,够了,但是延迟长的话,这个系统还是体验不好,那么我们一个就是怎样测延时,如果是,有不同的方式,特别测延时的时候要考虑,如果,是机器的时间不同步的话,那测出来延时有可能是负的,这个我们不要大意啊,想办法解决,第二个呢,就是延迟,你光测一个平均延时,意义不是特别大,你要测各个百分位数的延时,比方说,95%,99%的延迟,如果99%的延迟,刚好在可以接受的范围的话,那意味着你有1%的这个请求,实际上是,让用户不满意的,这个是我们延迟的这个测试的一个基本的要点,就是测百分位数的各个延迟。
OK,这就是这门课程的简介,接下来就是,第一讲第一个例子——TTCP。