我们有一个用于异步 JMS 消息系统的同步 HTTP 请求-响应前端。
每个 HTTPRequest 的 HTTP 查询 servlet 在查询队列中创建相应的 JMS 消息。此查询由后端处理,并为此查询创建几个响应消息。在 JMS 中组织响应消息的接收并确保它们到达正确的 servlet 线程以便它可以制定 HTTPResponse 的好方法是什么?
查询和响应是非事务性的,不需要持久化。其中大多数是读取查询。如果在 45 秒内没有读取响应,则 servlet 生成超时响应。然而,吞吐量很重要。我们需要处理越来越多的查询。该系统已经使用了大约十年,并且必须再运行两年左右。
我们正在使用 SonicMQ。我们为所有响应创建了一个队列。servlet 容器与代理有一个连接,它用于读取和写入。我们为每个登录用户生成一个侦听器线程(大约 1500 个并发)。这个线程有一个带有消息选择器的接收器,它只为这个特定用户选择响应消息。一旦 servlet 线程发送了它的查询消息,它就会等待用户的侦听器线程通知它它已读取响应。
我们曾经让所有发送者和所有接收者共享一个 QueueSession。这实际上有效(!)虽然会话正式不是线程安全的。每个线程创建一个 QueueSession(servlet 线程和侦听器线程)在一定程度上提高了性能,但事情仍然不太稳定,我们希望更好地组织事情。
我尝试为每个用户会话创建一个临时队列,而不是一个带有消息选择器的队列,但这大大减慢了速度。
什么是更好/正确的组织方式?