1

我有一个服务器多客户端服务器 - 在收到来自客户端的消息后,服务器需要处理它,然后再将其传递给另一个客户端。

我不知道我想做的最好的实现是什么,所以很感激任何帮助。这些消息将按时间间隔发送,因此消息需要被接收、处理并推送到结构中,然后才能在特定时间从要发送的结构中访问。消息有两个属性:目的地和优先级。访问将按时间间隔进行,有两种模式:特定于客户端节点,或向所有节点开放接收。

  1. 如果时间间隔只允许特定节点接收,那么会发生从最高优先级到最低优先级检查的所有队列,即以最高优先级发送的最早消息将从结构中“推出”。
  2. 如果时间间隔为“开放”,则无论节点如何,最高优先级的最早消息都将被“推出”。

我首先认为它可能是 a vector<vector<queue<message>>,但我意识到根据第 2 点进行搜索效率不高。我将不胜感激任何建议!有人建议我使用哈希映射,但我没有这方面的经验,如果这是最好的方法,我将不胜感激。

编辑:将相同的消息推送到两个不同的结构中是更好的解决方案吗?一:按优先级分类,向量持有FIFO队列(每个优先级一个)。二:按节点分类,vector<vector<queue<message>>.

4

1 回答 1

1

H除非对尺寸和速度有所了解,否则没有一个答案。所以,我想我会记下我想出的一些选择。

选项 1——超级计算机:假设我们假设有一台超快的机器,与所涉及的数据量相比。我们可以简单地将消息存储在一个无序列表中,因为它每次都足够快地遍历列表(平均而言,我们需要遍历列表的一半)。

选项 1A——让我们稍微麻烦一下:按优先级+到达时间排序的列表将使“打开”响应快速,因为我们只是从“顶部”获取。对于特定于节点的响应,我们通常会搜索不到一半,因为最高优先级都在开头附近

选项 2 —— 低资源,一百个节点,数百条消息:如果插入数据结构的时间不是那么重要,并且当你需要发送消息时你必须有尽可能短的响应,那么你需要一个全局队列,以便您可以在间隔打开时弹出。您还需要特定于节点的队列。最后,您需要一种立即到达特定于节点的队列的方法。这意味着:

  1. 全局有序列表
  2. N 节点特定的有序列表
  3. 以 Node-Id 为键的映射,并指向特定于节点的列表

正如我所看到的,痛苦的部分是同步,以便您每次都从全局和特定于节点的列表中删除(添加时相同)

我的第一个想法是将每条消息包装在一个包装器中,该包装器就像双向链表中的一个节点。但是,它实际上是两个列表。包装器将具有基于全局优先级的 Prev 和 Next;但是,它也会有一个基于节点特定优先级的 Prev 和 Next。这样一来,您只需取出一份消息本身的副本,同时以标准方式修复 prev/next 指针。(这基本上结合了上面的#1 和#2)。

对于#3,我会保留一张地图,但不是查找特定于节点的列表,而是指向该特定节点的“头”包装器。

这是一张图片,用于说明。 双重职责,双向链表

听起来很有趣!

于 2013-02-22T04:19:09.793 回答