Java嵌套队列

时间:2017-12-27 15:51:11

标签: java multithreading concurrency java.util.concurrent

更新

  

简而言之,我有一个队列,可以将消息从用户发送到服务。   但是当一个服务获得1000条消息时,队列就被占主导地位   它和其他服务在队列为空之前不会收到消息。我需要一个解决方案   方法

我的BlockingQueue有问题。假设我有100个外部服务,我负责向他们传递消息来自用户。

用户 - >我 - >第三方。

我在我的应用中使用了队列。当其中一个第三方服务不可用时出现问题:

  • 从用户收到任何第三方的消息。将它们保存在同一个队列中,比如Q1。
  • 使用队列,识别第三方服务并将其发送给相应的第三方。
  • 第三方之一没有回复,超时。
  • 保存无法将其传递给数据库的邮件。
  • 定期从DB获取未送达的消息并将其放入我的Q1中。
  • 如果第三方获得了大量流量,请说出填充我队列的5000条消息,而不是其他服务从我这里收到消息,直到此队列为空。但是当这个队列为空时,它们将不会收到消息,因为我将再次从DB获取消息并将它们放入我的队列中,其他服务将再次被阻止。

我认为到目前为止的解决方案:

  • 按服务ID使用嵌套队列,因此我将立即识别被阻止的服务5000消息并将其保存到数据库而不会消耗5000次来自队列的消息(可能更多因为消息不按顺序排列,它们是所有这些都与其他服务一起排队)

使用嵌套的concurret队列(我使用BlockingQueue)的效率如何?或者您认为这种情况的解决方案更好?基本上我不想让第三方占据我的队列。我需要一种聪明的方法来分离这些队列,可能有成千上万的队列因此为每个队列创建一个队列可能是无效的。

1 个答案:

答案 0 :(得分:0)

您似乎正在使用单个BlockingQueue来保留所有第三方服务的消息。

相反,

  • 为每个第三方服务使用单独的阻止队列和队列使用者
  • 当您收到来自用户的消息时,不是将其添加到队列中,而是在那里识别第三方服务,并相应地在第三方服务特定阻止队列中添加消息。