理解和应用队列机制

如何理解和应用队列机制

在实际编写程序中大部他开发人员应用到队列的场景并不多,在数据结构层面来说队列是一个先过先出的存储机制;如果经常面向服务器并发应用编写的同学对队列机制应该不会陌生.基于队列的应用设计作为服务的性能和可靠性上起到非常重要的作用,对于刚入门的同学可能对这些东西不太理解,既然添加了一个处理环节为何还能提供性能.通过下面讲解可以让不了解队列机制的同学进一步认识到队列机制在服务器应用设计如何起到重要的作用.

 

性能提升和可靠性

 

使用队列机制真的能让代码性能提升吗?从代码角度来说不能,原因很简单因为要执行的代码多了.既然不能提高代码执行性能那为什么服务设计都会考虑队列机制呢?主要原因服务设计一般不是为了支撑一个用户访问有多高效,而是如何保障更长的运行时间支撑更多的用户处理.那队列机制是如何保障这一点的呢?其实从现实生活中很多场景都能体现出这种机制,如果你是挤公交一簇应该能理解以下场景.

 

 

为什么要有要排队根据优级来上车吗?相信很多同学不用说都能理解,其实在人少的时候排不排问题也不大;但有大量等车人员的时候那情况就完全不一样,在人员密集的时候出现争抢那就很有可以发更意外(如果严重情况….那就别想座了).车上的座位有限,车门的宽度也有限有序上车可以保证意外不会发生;同理服务器的资源也是有限的,它不可能提供无限的线程和内存来完成大量用户请求.为了保障服务器有限的资源,因此建立一套排队的保障机制来有序可控地来处理用户请求是必须必要;所以在服务器设计上都会考虑队列机制的原因,无非是想服务更稳定地处理更多的用户请求.

 

如何划分队列资源

 

上个班排个队上车则是比较简单的事情,在系统设计中相对要考虑的东西就比较多.如何划分队列,那些队列应该占用多少线程资源都需要和实际业务结合.如果在高峰值资源得不到合理的分配,那这个队列划分和分配就形同虚设.

 

 

从上面图来看在线程资源分配上显然是不合理的,导致了某些业务并不能有效处理.所以在设计队列线程分配要考虑业务处理的复杂度和相关IO资源.可以把复杂度相当的任务队列归类的相应原线程资源来完成.因此成也队列败也队列,所以在设计上一定要做好规划,充分利用线程资源合理完成事情.

 

 

在设计的时候如果存在IO操作的可以适当地分配多一些线程来完成,实际业务中也并不是某些任务处理慢都会多分配些线程.如果有些业务都是内存运算量大损耗CPU过大业务优先度不高,那就不太可能分配太多的线程资源;主要考虑占用资源对其他业务处理的影响情况来决定.除了在线程资源分配外,队列可积压量的设计也必须要考虑的,毕竟内存溢出可是一件让程序漰盘的大事情(有些业务的确是不能限制业务数据进入队列数量,这个时候内存队列不适用的情况就可以采用一些可持久化的队列产品来代替).

 

总结

 

在设计服务的时候都以稳定优先,谁战斗到最后谁就是赢家J,在设计中队列机制的确是可以很好的控制资源来满足设计的需要,从而让服务保持稳定持久的运行.但在设计的时候必须了解业务处理的资源分布情况,合理的规划队列和资源.一旦在规划上出现问题那这把剑可能把自己给杀死了.

 

原文地址:https://www.cnblogs.com/Leo_wl/p/6533358.html