如果之前已经问过,那么很难看清楚,因为我不知道它的名字。所以这里:

我正在制作连接到消息传递网关的服务器以发送消息。 与此网关的会话需要用户名/密码组合。通过这种方式,网关知道要收费的人。

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

因此有效地解决了供需问题:

我有一个只能处理N个并发连接的网关(用户名/ pw组合) 我有X个消息堆叠起来属于Y个不同的这些连接

我如何以一种漂亮而干净的方式有效地管理这些连接,以便它们有时为其他连接提供喘息空间,甚至可能考虑优先级,甚至可以允许多个连接使用相同的用户名/密码以获得额外的速度(如果它不妨碍其他排队连接)

有没有人知道为此存在哪种算法?所以我可以谷歌吧。 或者也许某人已经可以给我一些指示。

我自己也做了一些尝试,但我觉得我还没有创建一个优雅的解决方案,但不知何故最终会在长嵌套的if语句中出现

感谢

有帮助吗?

解决方案

正如另一张海报所提到的,你需要一个优先级队列,但我建议你将优先级队列与一个队列队列混合。

  1. 对于每个连接(用户名/密码),创建一个简单的LIFO队列。接收消息的模块应该为适当的用户排队。
  2. 调度程序模块应维护优先级排序的队列队列。这意味着您有一个函数 priority(queue),它根据消息数,帐户优先级,自上次发送以来的时间等计算给定队列的优先级。实现 priority(队列) )留给读者练习。
  3. 调度程序的内部循环从队列队列中取出N个最高优先级队列,为每个用户名/密码建立网关连接,并发送这些队列中的所有消息。新清空的队列将返回队列队列。重新计算所有队列的优先级,冲洗并重复。
  4. 理想情况下,步骤#3的消息发送部分可以是多线程的。

    步骤#3的替代实现是从每个队列发送消息,直到该队列的优先级低于下一个等待队列的优先级。但是,这意味着您在每次发送后重新计算 priority(queue),这可能比它的价值更高。

其他提示

从概念上讲,您希望实施优先级队列

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

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

如果您的网关甚至比路由算法慢一点,那么通过使路由算法尽可能聪明,您将获得速度的净增长。

查看OS任务调度和网络调度算法。他们试图解决许多类似的问题,即将有限资源的时间片分配给更多的消费者。那里有大量的研究。特别是加权公平排队听起来可能对您有用。

任何特定的选择在很大程度上取决于您希望算法具有的行为。例如,如果您希望最大限度地减少所有队列的延迟,您可能希望使用最早的消息对队列进行优先级排序,并且可能会为更长的队列提供更大的切片。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top