如何在读取文件的同时,保证另外线程服务的稳定性?
一个server,单进程模型
拥有一个更新线程,负责更新数据,每小时触发更新一次,更新量为1G
四个工作线程,负责处理逻辑,1000QPS,同时有个工作队列。
发现在更新数据的时候,有时候工作队列会被挤满,导致服务超时。
请问这个有解决办法么,谢谢
[解决办法]
用线程池,多开几个线程
[解决办法]
用多核的CPU,比如4核的,8核的。像这种计算密集型的情况,多开线程应该是没有用的,除非满足所有线程的数量 < CPU中core的数量。
[解决办法]
队列被挤爆就说明队列空间不够。要么加大队列空间,换用基于硬盘存储的队列;如果处理线程在后半小时有空闲时间,就把更新改成多次,每次更新部分数据。
[解决办法]
要是从技术角度来讲, 方案我能给你两个:
方案一:
1:数据线程作独立进程, 数据进RabbitMQ。
2:原先进程,工作线程池消费RabbitMQ。(你没提你的工作线程负责什么类型的query,程序模型是什么样的)
方案二:(工作量小)
前提:首先,我不知道你的工作队列为什么会满,其次我不知道你的事件模型是什么样:是mutex+cond的队列抢夺机制,还是基于epoll/select+pipe的管道分发机制.
无论是哪一种, 建议使用内存池, 目的是希望队列是动态的, 而不是静态的固定长度队列(可能你用的是固定长度环形队列等),所以需要内存池取Node串list链表来取代原先的定长队列,这样内存的使用是极限的,在程序内存不耗尽的前提下可以保证极限的使用量,因为内存池是量可控的。