这里主要说几种:连接池、线程池、内存池和异步请求池,下面依次做具体的介绍。
连接池
连接池,如客户端连接请求redis、mysql等,目的是为了可以做并发操作,以及对连接的复用,一般和多线程一起使用,使得每个线程可以从连接池中获取一个连接进行请求,这样是最合适的,也就是说线程的个数和连接池中连接的个数保持差不多的大小最好,如果有8个线程,而连接池只有4个连接可以取来使用,那么当有4个线程取走连接后,另外的4个线程就从连接池中取不到连接了,此时就需要等待那4个正在使用的线程归还连接才能继续,这样就导致降低了并行的能力。
从上面的描述中也可以看出,多个线程从连接池中取连接,所以连接池本身是一个临界资源,使用过程中需要加锁,连接池初始化时的连接数不会设到最大,会有一个最低连接数,当比较多的线程需要获取连接时,再自动增加新的连接,当连接池连接数已经达到最大的时候,再有线程过来获取连接就需要等待了,可以根据业务场景设置为一直等待或者超时等待(使用wait_for),直到有其他的正在使用连接的线程归还连接后,就可以唤醒正在等待的条件变量,此时就可以获取到连接了,所以一直等待也不是永久等待,除非其他获取了连接的线程一直不归还了,那么其实是有bug的,当然还有一种情况需要能够退出,就是当连接池销毁时,还在等待获取连接的地方需要被唤醒并退出。
这里面有一些可以优化的地方,比如可以将一分钟内超时等待的次数统计出来,以此来评定连接池的是否需要扩容,另外,有的连接可能被某个使用的线程长时间阻塞,导致无法归还,其他的线程就没有足够多的连接可以获取了,这是有问题的,所以可以在取到连接时将该连接加入到used_list中,并在连接中记录当前使用时间,如果后面连接归还了,再从used_list中删除,另起一个线程定时检测used_list,看有没有超时未归还的连接,有的话把信息进行告警。还有一个点,当连接池长时间空闲,没有那么多线程需要获取连接时,可以销毁掉长时间不活跃的连接,但连接池需要保持有最低数量的连接数,不能全部销毁掉,最后,连接可以做自动重连处理,如果发现连接断掉了,能够自动重连,如mysql可以设置MYSQL_OPT_RECONNCT,进行请求前先做mysql_ping操作。

本文详细介绍了连接池、线程池、内存池和异步请求池的概念与应用。连接池用于并发操作和连接复用,通过线程池实现任务并发执行,内存池解决内存碎片问题,异步请求池提高并发请求效率。重点讨论了各种池的管理机制,如连接池的等待策略、线程池的生产消费者模型、内存池的slab算法以及异步请求池的epoll事件管理。

1281

被折叠的 条评论
为什么被折叠?



