分布式系统的本质——队列

2019-09-27 03:57发布

所有分布式系统或者说高性能分布式系统的本质只有两个字——队列

简单吧,换句话说,只要掌握了队列,就掌握了分布式系统构件方式。所有的分布式系统,不管规模大小,都是不同类型队列的堆砌而已。

那么队列是什么?它既简单又复杂,在各个层次的描述并不一致。例如,我们从一个网站举例:

从宏观上来说它包含一个web服务器的消息处理队列,http消息到达服务器后是要排队处理的,这就是一个fifo队列;更进一步,如果这个网站的业务比较复杂,需要分布式部署,还需要像rabbitmq,kafka这样的队列服务器来分担应用层的压力,这也是一种高级的队列形式,提供的算法就不只是fifo可能还有广播,主题等特性。

我们进一步往下,下面就是操作系统了,操作系统跟队列有啥关系?或者跟并发有啥关系?可以说,一个系统的并发能力很大程度取决于os的设计。从网络协议栈的处理到进程线程的调度,到cpu cache相关的锁同步都直接或者间接跟os关系,毕竟程序写了千万条,最终在os才能执行。

os的队列有哪些呢?

tcp协议的三次握手,在服务器等待客户端最后一次握手回复之前会吧socket结构放入一个队列,回复一个,就从中移除一个,形成所谓的连接套接字对象,这个队列也会影响性能,有的半连接攻击也会利用。epoll机制中如果把红黑树看做一个队列的话也算一个,这个机制对高性能至关重要。同时,在linux内核中,网络协议的读写并不直接写入设备,而是有队列做缓冲,用于屏蔽缓慢的io与超快的cpu内存读写性能差距,不至于网络设备被堵死。而,这些队列都是ring-buffer,即循环队列,这样更能发挥cpu的缓存能力(cache line),同时,数组链表组成的队列性能也会优于链表。

到了进程管理模块,每个进程都要执行自己的代码,一个os几百上千个进程,怎么执行?排队呗!在linux进程调度模块中,每个核心会为不同优先级的任务建立队列,以及一颗时间片红黑树,调度算法根据拥挤程度,优先级把合适的任务放入cpu运行。而,队列中的优先级队列,或者堆是做优先级运算的非常合适的动态数据结构。

同样,在磁盘io,内核虚拟文件系统与驱动程序之间也有队列,来解决速度与拥塞。在进程通信,管道这些内核对象中也大量使用队列来做消息存储与路由,以达到进程通信的目的,这跟rabbit,kafka的理念如出一辙。

另外,在编程语言中,很多锁对象也是用队列来实现,如java的reentrylock系列同步机制,就是将等待的线程对象放入一个队列中排队来实现的。

所以,在分布式环境中,队列从上到下都广泛使用,掌握好队列对构件好的分布式系统至关重要!

文章来源: https://www.toutiao.com/group/6729721012235010572/