想象一下,我有一台服务器可以以每秒10000条消息的速度生成消息。但是我的客户端每秒最多只能接收1000条消息。套接字,消息速率限制器Java
系统1 如果我的系统在1毫秒内发送1000条消息,然后对剩下的999毫秒不做任何处理。
系统2 我的系统每毫秒发送1条消息,因此在1000毫秒(1秒)内它将发送1000条消息。
Q1)考虑到客户端每秒最多可处理500条消息,哪个系统更好?
Q2)系统1对客户端的影响是什么?它会压倒客户吗?
感谢
想象一下,我有一台服务器可以以每秒10000条消息的速度生成消息。但是我的客户端每秒最多只能接收1000条消息。套接字,消息速率限制器Java
系统1 如果我的系统在1毫秒内发送1000条消息,然后对剩下的999毫秒不做任何处理。
系统2 我的系统每毫秒发送1条消息,因此在1000毫秒(1秒)内它将发送1000条消息。
Q1)考虑到客户端每秒最多可处理500条消息,哪个系统更好?
Q2)系统1对客户端的影响是什么?它会压倒客户吗?
感谢
威尔它压倒客户端:这取决于你的消息的大小,和插座缓冲区大小。发送者发送的消息被缓冲。如果客户端因缓冲区已满而无法使用,则发件人正在使用的输出流将被阻止。当客户端消费了一些消息时,发件人可以继续写入,因为他的OutputStream被解锁。
Windows系统上的典型缓冲区大小为8192字节,但OS的大小可能因操作系统和OS中的设置而异。
所以系统1不会压倒客户端,它会在某个时刻阻塞。
什么是最好的方法仅取决于您的应用程序的设计。
例如:在通过USB写入Arduino(不是套接字客户端,但其他问题相同)时,我遇到了类似的问题。在我的问题中,缓冲的消息出现问题,因为它是面部跟踪相机的位置。当Arduino读取它们时,缓冲位置不再相关,但它必须处理它们,因为这样的缓冲区是一个队列,并且如果读出旧缓冲区,则只能得到最近的缓冲区。 Arduino永远无法跟上产生的消息,因为当新的位置到达Arduino代码时,它已经过时了。所以这是一个“压倒性的”。
我通过使用双向通信解决了这个问题。 Arduino会发送一条消息给制作人说:READY(接收消息)。然后制片人会发送一个(最新)脸部追踪位置。然后Arduino重新定位相机并请求一条新消息。这样,有一种流量控制,阻止生产者溢出Arduino。