代码之家  ›  专栏  ›  技术社区  ›  Toad

一种有效的连接资源管理算法

  •  2
  • Toad  · 技术社区  · 15 年前

    如果以前有人问过,很难找到这个,因为我不知道它的名字。下面是:

    我正在制作这个服务器,它连接到消息网关以便发送MSG。 与此网关的会话需要用户名/密码组合。这样网关就知道该向谁付费。

    现在,我可以将数千条消息排队发送,例如属于5个不同的用户名/密码组合。但是,网关受到限制,我只能同时打开2个连接。

    因此,实际上这是一个有约束的供求问题:

    我有一个只能处理N个并发连接的网关(用户名/pw组合) 我有X条消息,它们属于Y个不同的连接

    有人知道有什么样的算法可以解决这个问题吗?所以我可以用谷歌搜索。 或许有人已经可以给我一些建议了。

    谢谢

    3 回复  |  直到 15 年前
        1
  •  1
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    1. 对于每个连接(用户名/密码),创建一个简单的后进先出队列。接收消息的模块应该为相应的用户将消息排队。
    2. dispatcher模块应维护队列的优先级排序队列。这意味着您有一个函数 priority(queue) 它根据消息数、帐户优先级、自上次发送以来的时间等计算给定队列的优先级 作为练习留给读者。
    3. dispatcher的内部循环从队列队列中取出N个优先级最高的队列,为每个用户名/密码建立到网关的连接,并发送这些队列中的所有消息。新清空的队列返回到队列队列中。重新计算所有队列的优先级,冲洗并重复。

    步骤#3的另一种实现方式是从每个队列发送消息,直到该队列的优先级低于下一个等待队列的优先级。但是,这意味着您需要重新计算 优先级(队列)

        2
  •  1
  •   Eric J.    15 年前

    Priority Queue .

    由于您对哪些消息优先于其他消息有特定的想法,所以您需要一个允许您为每个队列条目计算优先级分数的实现。由于您有时希望对消息进行分组,因此在为新队列条目分配优先级时,您还需要能够检查队列(例如,您可以决定将新元素的优先级设置为与具有相同用户名的最新现有元素的优先级相等,只要已具有该优先级的元素不超过N个)。

    假设您有固定数量的出站网关,您可能希望每个网关有一个优先级队列。接收新消息并确定将其放置在哪个队列上的路由组件可以检查每个现有队列中的元素,以确定将其放置在哪个队列上(即,将其放置在与具有相同用户ID的其他元素相同的队列中)以优化吞吐量。

        3
  •  0
  •   Ants Aasma    15 年前

    看看操作系统任务调度和网络调度算法。他们试图解决将有限资源的时间片分配给更多消费者的许多类似问题。有大量的研究。特别地 weighted fair queueing 听起来它可能对你有用。

    任何特定的选择在很大程度上取决于您希望算法具有的行为。例如,如果您想要最小化所有队列的延迟,那么您需要对具有最旧消息的队列进行优先级排序,并可能为较长的队列提供更大的切片。

    另一方面,您可能希望抢先执行大批量发送的人,因为他们的消息无论如何都会有很长的延迟,并在批量发送之前让使用率较低的队列通过。