2013-02-20 71 views
1

我有一个服务器多个客户端服务器 - 在接收到来自客户端的消息后,服务器需要处理它,然后再传递给另一个客户端。在哈希表或矢量向量中存储队列

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

  1. 如果时间间隔只允许一个特定的节点接收,会发生什么情况是所有的队列被从最高优先级检查以最低即,从结构中的最高优先级发送的最早的消息将被“推”出。
  2. 如果时间间隔是'开放',那么不管节点的最高优先级的最早的消息将被'推出'。

我首先想到它可能是一个vector<vector<queue<message>>,但我意识到,根据第2点搜索将不会有效。我将不胜感激任何建议!我被告知使用哈希映射,但是我没有这方面的经验,如果这是最好的方法去解决这个问题,我会很感激的。

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

+0

为了澄清,每个消息总是注定*一个*节点?此外,节点的可能数量是多少(至少是非常粗略的范围:几十,几百,几千)? – 2013-02-21 18:05:14

+0

@Darius消息最初只能发往一个节点(随后可能会实现广播)。节点的可能数量将从几十到几百。对不起,没有说清楚! – sccs 2013-02-22 01:31:02

回答

1

HThere没有人回答这个,除非你有一个大小和速度的想法。所以,我想我会放下一些我想出来的选择。

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

选项1A - 让我们来打扰一下:按优先级+到达时间排序的列表会快速地使“开放”响应快,因为我们只是从“顶部”取出。对于特定节点的响应,我们通常会寻找远少于一半,因为首要任务都是在开始部分

选项2 - 低资源,百节点,数百封邮件:如果插入时间到数据结构并不那么重要,并且当您需要发送消息时,您只需要尽可能短的响应,然后您需要一个全局队列,以便在间隔打开时可以弹出。您还需要节点特定的队列。最后,您需要一种方式来即时访问特定于节点的队列。这意味着:

  1. 全球有序列表
  2. 器N节点特定的有序列表
  3. 地图由节点ID键,并指向特定的节点列表

依我之见,痛苦的部分将是同步,以便每次从全局和特定于节点的列表中删除(同时添加)

我的第一个想法是将每个消息包装在一个充当节点的包装中一个双链表。但是,它实际上是两个列表。包装将基于全局优先级具有Prev和Next;但是,它也会根据节点特定的优先级具有Prev和Next。这样,你只有一个消息本身的副本,而你以一种标准的方式固定prev/next指针。 (这基本上结合了上面的#1和#2)。

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

这里有一张图片来说明。 Double Duty, doubly-linked list

这听起来很有趣!

+0

天哪,太棒了! – sccs 2013-02-25 02:57:49