给一个和系统无关的高性能解决方案吧:
领导者+跟随者 模型的线程池对同一个socket侦听.
领导者和跟随者同属一个线程池.
单位时间内,只有一个领导者线程在侦听socket,其他处于工作或者挂起状态.
当领导者线程收到数据以后,唤醒线程池中挂起的一个跟随者让其继续侦听socket,并将其设置为领导者.之后,原领导者线程不转发数据,直接继续处理收到的数据(也就是说业务处理代码仍然在该线程中),直到处理完毕再将自己加入挂起的跟随者中.
此方法的优点在于:
1,以设计模式解决问题,而不是依靠特定的系统提供的特定功能.
2,性能的开销减少到尽量低,可能仅仅是在线程池中间唤醒一个跟随者线程的消耗.
3,处理数据的时候基本不涉及到内存拷贝,数据缓存,线程之间锁等性能开销
关于此方案的缺点:
当数据量输入速度远远大于线程池处理速度的话,可能会导致丢包.
当然,其实当线程池处理速度小于数据输入速度的时候,楼主的缓存数据的方法也是不可行的,因为能缓存数据的大小总是有限的,因为处理能力小于输入能力,所以必然最后还是缓存用完,开始丢包.
当然在我的方案中也可以在最后领导者线程发现线程池中只剩下很少或者没有挂起的跟随者线程的时候,开始缓存数据.但是殊途同归,都是质保不治本的.所以我在提方案的时候也不说这点了.
而本质上来说,在这种情况下,已经不是设计方法的问题了,估计此时任何一种设计都没法处理,因为输入能力已经远远大于处理能力.此时唯一的解决方案就是升级硬件,多服务器等等.
我们在做电信项目的时候,都有一个每秒处理能力的指标^_^