我需要在基于QT框架的windows应用程序中找到高吞吐量网络数据交织的解决方案。
我的应用程序是基于服务器/客户端架构的。客户端连接到服务器,两者都可以交换任意大小的消息。消息只是一段数据,其中有一个描述消息的头。
必须考虑以下限制:
因为只能有一个数据流(每个连接),所以我决定使用数据交织,这样一条大消息就不能阻止几条较小的消息。为此,我允许消息碎片,并引入了3类消息优先级。消息头包含总大小、有效负载偏移量和有效载荷大小,这样就可以在接收站点上组装交织的消息。
大型消息的
一种天真的方法是将所有消息一排排地发送出去。然而,这将在一定的时间内阻止较小的高优先级消息,因为例如,视频流数据消息充分利用了网络连接。这是不可接受的。我决定将所有消息拆分为8 KB的大块,而不是在一个部分中发送消息。虽然我不知道如何将单个消息片段优化地相互交织在一起,但我认为这里可以使用几种分离策略。不过,这不是我的问题。
+----------------------------------+
| Message |
+--+-------------------------------+
| | Header 1 |
+--+-------------------------------+
| | Payload (max. 8 KB) |
+--+-------------------------------+
| ... |
+--+-------------------------------+
| | Header N |
+--+-------------------------------+
| | Payload (max. 8 KB) |
+--+-------------------------------+你猜,在某个时间点,有一个非常大的消息需要发送。输出队列中没有其他消息!所以这里没有什么可以交织的。一种天真的做法是将这一信息传递出去。然而,猜猜看,在开始发送这个大消息后不久,几个高优先级的小消息就被排队了。但是,由于大型消息已经发送到套接字,这些新的小消息必须等到大消息被发送之后。这个案子应该被阻止!
我有许多不同的想法,但没有一个是令人满意的。
一个想法是只在套接字上提供太多的数据,使它不会耗尽数据,而不是在套接字缓冲区中提供太多的数据。这将确保可以在任何时候将较小的数据插入数据流中,而不会出现重大延迟。问题是,如何才能找出有多少数据是最优的,从而使吞吐量仍然是最大的呢?如何得知数据已经发送,以及在套接字缓冲区中留下了多少数据?
我错过了什么吗?还有更好的解决办法吗?我愿意接受新的[更好的]想法。
编辑:更多的澄清
我也考虑过填充优先级队列并在低优先级块前面插入更高优先级块的想法。出现的问题如下:
我必须阻止队列中的数据块,并且可能不会太快地将其发送到套接字。然后,一旦进入套接字缓冲区,我就无法再控制它了。这可能导致有足够的数据可以发送的情况,但是套接字耗尽了数据并处于闲置状态。这将降低数据吞吐量。如何确定套接字缓冲区的最佳填充状态,以便套接字不会耗尽数据?据我所知,这个问题可能更令人担忧,没有可能被告知缓冲区的状态,如果所有数据都已发送出去,也不可能知道在套接字缓冲区中有多少数据被发送。
发布于 2015-01-08 16:50:37
如果要发送多条消息,则将大型消息分割成块,这样一个大视频就不会干扰其他高优先级消息。
这意味着接收方必须始终能够接收多个块的大型消息。
由于接收方将期望大消息被分割成块,为什么不将所有消息分割成块,即使没有其他消息可发送?然后,发送方可以有一个(或多个)进程填充要发送的块(优先级)队列,以及一个检查队列中是否有块并发送第一个块的进程。
如果启动大传输,队列中将填充大量低优先级块。如果中途有一个高优先级的消息(或者更确切地说是块)要发送,那么这个消息就会放在低优先级块前面的队列中,然后在下一个机会被发送出去。
高优先级消息获得的最大延迟是传输一个完整块所需的时间。
https://softwareengineering.stackexchange.com/questions/269448
复制相似问题