Java嵌套队列

Java嵌套队列,java,multithreading,concurrency,java.util.concurrent,Java,Multithreading,Concurrency,Java.util.concurrent,更新: 简言之,我有一个从用户向服务发送消息的队列。 但当一个服务收到1000条消息时,队列就会被 在队列为空之前,it和其他服务不会获取消息。我需要一个解决办法 接近 我的阻止队列有问题。假设我有100个外部服务,我负责向它们传递来自用户的消息 用户->我->第三方 我正在应用程序中使用队列。第三方服务之一不可用时出现问题: 从用户处获取消息,发送给任何第三方。将它们保存在同一队列中,比如Q1 使用队列,识别第三方服务并将其发送给相应的第三方 第三方之一未响应,超时 保存无法传递到DB的消息

更新:

简言之,我有一个从用户向服务发送消息的队列。 但当一个服务收到1000条消息时,队列就会被 在队列为空之前,it和其他服务不会获取消息。我需要一个解决办法 接近

我的阻止队列有问题。假设我有100个外部服务,我负责向它们传递来自用户的消息

用户->我->第三方

我正在应用程序中使用队列。第三方服务之一不可用时出现问题:

  • 从用户处获取消息,发送给任何第三方。将它们保存在同一队列中,比如Q1
  • 使用队列,识别第三方服务并将其发送给相应的第三方
  • 第三方之一未响应,超时
  • 保存无法传递到DB的消息
  • 定期从DB获取未送达的消息,并将其放入我的Q1中
  • 如果第三方获得了大量的流量,比如说5000条消息,这会填满我的队列,而不是其他服务从我那里获得消息,直到这个队列为空为止。但当这个队列为空时,它们将不会获取消息,因为我将再次从DB获取消息并将它们放入队列中,其他服务将再次被阻止
到目前为止我认为的解决方案:

  • 使用按服务id嵌套的队列,因此我将一次识别被阻止的服务5000条消息,并将它们保存到DB,而不使用队列中的5000条消息(可能会更多,因为消息将不按顺序排列,它们都与一个队列中的其他服务一起)

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

似乎您使用的是一个BlockingQueue,它为所有第三方服务保留消息

相反

  • 对每个第三方服务使用单独的阻塞队列和队列使用者
  • 当您从用户处获得消息时,不要将其添加到队列中,而是在那里标识第三方服务本身,并相应地将消息添加到第三方服务特定的阻塞队列中

您是否考虑过使用像RxJava这样的反应式框架?您可以标记那些以某种方式超时的框架,并且在越来越多的时间内不将它们放回队列中。比如说,第一次你只在5秒后把它们放回原处,第二次它们会被淘汰10秒,然后是20秒、40秒、1分钟、2分钟等等。你明白了。为了不让您的系统空闲,如果队列为空,您可以忽略上面的内容。我必须先研究RxJava,谢谢您的建议。我已经有了超时映射,它的工作原理类似于如果X条消息的数量是timedout,那么服务Y的新消息将被写入DB而不是队列,并且将被阻塞Z次。在Z次之后,如果它仍然被阻止,那么新消息将被阻止,直到Z+1次,等等。但在另一方面,这使得该服务在DB中获得大量等待处理的消息。当这些消息从DB检索到要处理时,比我的队列再次被阻塞。因为看起来好像你没有区分不同的服务,所以完全可以考虑到你的系统可以在一段时间内与某个服务进行对话,因为在一段时间内,当其他服务没有消息自然地传入时,也会发生这种情况。然而,我建议信息暂时放在工作台上,而不是放进X条信息。另一个可能有用的方法是将消息队列中的消息排到超时的服务中,或者将队列表单数据库分成小块(100左右)填充,并且永远不要完全填充。