Java 线程(接收者)如何写入请求&;当线程(发送方)只发送请求时对文件的响应?

Java 线程(接收者)如何写入请求&;当线程(发送方)只发送请求时对文件的响应?,java,Java,我们有一个需求,在这个需求中,它会导致一个设计约束,并且它是显示的。在这里 发送方线程将请求放入消息队列。输入源是一个包含1000万个请求的文本文件 Receiver线程轮询来自另一个队列的响应,并将其写入另一个输出文件 设计约束: Receiver线程必须将请求和响应写入输出文件这怎么可能? 不应使用任何数据库 由于性能瓶颈,无法在发送请求之前缓存请求,并在接收到相应响应之后更新请求 在少数情况下,如果响应延迟很长时间,则会发生超时 请给出建议。由于您只有一个接收方线程,因此保证一次只处理一个

我们有一个需求,在这个需求中,它会导致一个设计约束,并且它是显示的。在这里

  • 发送方线程将请求放入消息队列。输入源是一个包含1000万个请求的文本文件

  • Receiver线程轮询来自另一个队列的响应,并将其写入另一个输出文件

  • 设计约束:

  • Receiver线程必须将请求和响应写入输出文件这怎么可能?

  • 不应使用任何数据库

  • 由于性能瓶颈,无法在发送请求之前缓存请求,并在接收到相应响应之后更新请求

  • 在少数情况下,如果响应延迟很长时间,则会发生超时


  • 请给出建议。

    由于您只有一个接收方线程,因此保证一次只处理一个请求

    让发送方线程编写请求和响应可能不是最优雅的设计,但您肯定可以让接收方线程编写{request,response}元组。接收方线程还可以在开始处理之前写入请求,在完成之后写入响应。它将产生与你的目标相同的结果


    如果您提供有关设计的更多详细信息,我可以为您提供更多设计帮助。

    解决方案的一些想法:

    接收方线程可以从文件中查找原始请求。这要求响应具有某种形式的唯一关联id

    处理程序线程可以将原始请求添加到响应中。这使得消息的大小更大,但不需要相关id。它还需要对处理程序线程进行配置/代码更改

    发送方线程可以在辅助本地队列上复制请求。接收方线程在此队列上查找接收响应的原始请求。接收响应的顺序可能与发送请求的顺序不同,因此接收方线程可能需要“遍历队列”以查找效率不高的请求


    最后一种解决方案包括一种缓存形式。由于性能原因,您声明这是不允许的。我不明白为什么。本地缓存速度很快,在任何给定的时间,缓存中都不应该有大量排队的请求,因为发送、处理和接收都是异步的。

    请求和响应是否具有某种唯一标识符?为什么(1)和(2)处的队列不同?@EJP这可能是一种提高吞吐量的优化。通过异步处理响应,暂停的请求处理不会延迟其他请求/响应对。Hari,如果您发布的问题得到充分回答,您应该接受答案以确认这一点。我注意到您到目前为止还没有接受任何答案。多个请求处理程序可能正在并行读取“消息传递队列”,并将其响应以不可预测的顺序放到“其他队列”上。最终实现将取决于生产者/消费者线程的数量-同意。亲爱的Koster,感谢您提供的解决方案。无论如何,我们已经决定使用你的最后一个解决方案。让我看看它在测试期间是如何影响的。我们将把几个请求读入java队列,其中每个线程轮询队列中的请求,将其放入消息传递队列并等待响应。但在这种情况下,性能瓶颈是同一线程必须在未启用超时选项的情况下等待响应。