处理许多传入数据包的最佳方法

Won*_*ing 8 java sockets multithreading

我目前正在开发一个简单的P2P网络作为练习.网络中的每个节点都将心跳发送到其他节点的子集,以便能够检测已离开网络的节点.除了心跳包之外,我在新节点加入/离开网络时,当他们想要查找资源(小文本文件)等时发送数据包.所有数据包都是UDP数据包.

每当我收到一个数据包时,我就会启动一个处理该特定数据包的新线程.然而,我担心在一个应用程序生命周期中我开始的线程数量相当多(特别是因为心跳).(还有我想避免的死锁等风险).

我想过有一个队列或其他东西,我把所有传入的数据包放在一起,并且有一个线程一次一个地处理来自该队列的所有数据包(类似于生产者 - 消费者模式).我希望快速处理数据包,这样发送方就不会认为数据包丢失了.

处理大量不同的传入数据包而不必为每个数据包启动新线程的最佳方法是什么?我应该选择我所拥有的,生产者消费还是其他不同的东西?

LtW*_*orf 0

您的应用程序处理一个数据包需要多长时间?

对于 ping 任务,在收到它们时对其进行处理可能会更快,您可以将其他任务放入共享数据结构中,例如特定的阻塞队列,因此当队列为空时,工作线程等待新作业,而当添加一个新作业,唤醒一个线程并将执行该作业。

可能每个数据包启动一个线程会让您在启动和停止线程上花费比实际完成工作更多的时间。

如果对于所有类型的数据包来说,响应数据包要做的事情并不是那么耗时,那么可能会出现这样的情况:花在队列锁和调度线程上的额外时间会使您的程序变慢而不是更快。

无论如何,请使用线程池并从一开始就启动工作人员。如果您愿意,您可以根据过去几分钟的负载动态增加或减少工作线程的数量。