2017-07-31 31 views
-2

想象一下,我有一台服务器可以以每秒10000条消息的速度生成消息。但是我的客户端每秒最多只能接收1000条消息。套接字,消息速率限制器Java

系统1 如果我的系统在1毫秒内发送1000条消息,然后对剩下的999毫秒不做任何处理。

系统2 我的系统每毫秒发送1条消息,因此在1000毫秒(1秒)内它将发送1000条消息。

Q1)考虑到客户端每秒最多可处理500条消息,哪个系统更好?

Q2)系统1对客户端的影响是什么?它会压倒客户吗?

感谢

回答

0

威尔它压倒客户端:这取决于你的消息的大小,和插座缓冲区大小。发送者发送的消息被缓冲。如果客户端因缓冲区已满而无法使用,则发件人正在使用的输出流将被阻止。当客户端消费了一些消息时,发件人可以继续写入,因为他的OutputStream被解锁。

Windows系统上的典型缓冲区大小为8192字节,但OS的大小可能因操作系统和OS中的设置而异。

所以系统1不会压倒客户端,它会在某个时刻阻塞。

什么是最好的方法仅取决于您的应用程序的设计。

例如:在通过USB写入Arduino(不是套接字客户端,但其他问题相同)时,我遇到了类似的问题。在我的问题中,缓冲的消息出现问题,因为它是面部跟踪相机的位置。当Arduino读取它们时,缓冲位置不再相关,但它必须处理它们,因为这样的缓冲区是一个队列,并且如果读出旧缓冲区,则只能得到最近的缓冲区。 Arduino永远无法跟上产生的消息,因为当新的位置到达Arduino代码时,它已经过时了。所以这是一个“压倒性的”。

我通过使用双向通信解决了这个问题。 Arduino会发送一条消息给制作人说:READY(接收消息)。然后制片人会发送一个(最新)脸部追踪位置。然后Arduino重新定位相机并请求一条新消息。这样,有一种流量控制,阻止生产者溢出Arduino。

0
  1. 两者都不是更好。无论你自己做什么,TCP都会改变实际流量。
  2. 也不会压倒客户。如果客户端没有跟上,它的套接字接收缓冲区将被填满,因此请将你的套接字发送缓冲区,最终你会阻止发送,或者如果你处于非阻塞模式,就会得到EAGAIN/EWOULDBLOCK。