问题是我们有一些现代的Web应用程序与遗留系统集成,而遗留系统从未被设计为支持来自单个用户的多个并发请求。基本上,某些类型的请求遗留系统只能从一个用户一次一个地处理。它可以处理来自不同用户的多个并发请求,但由于技术原因无法处理来自单个用户的多个请求。在这些情况下,用户的第一个请求将成功完成,但在第一个请求仍在执行时来自同一用户的任何后续请求将失败。
因为我们的应用程序启用了ajax,多标签/多浏览器友好,而且只有多个应用程序这一事实 - 在某些情况下,用户最终可能会发送多种类型的请求同时到遗留系统。
我正在尝试确定像RabbitMQ这样的东西是否可以放在遗留系统的前面,并且可以用于每个用户/ IP的单线程请求。我们的想法是,Web应用程序会将所有请求发送到MQ,并且它们会堆叠到每个用户的队列中,并一次传递给旧系统。
我不知道是否会对可能产生的队列数量产生担忧 - 我们拥有大约4,000的用户群。
我知道我们可以在Web应用程序中单独解决这个问题,但由于有多个应用程序,它们会在它们之间复制逻辑,并且您仍然有可能使用两个不同的应用程序来启动并发请求。
任何反馈都将不胜感激。谢谢 -
答案 0 :(得分:0)
我不确定每个用户的唯一队列是否有效,因为您需要让后端工作进程监听该队列上需要动态创建的消息。
下面是一个选项,但它确实存在性能瓶颈,因为单个后端进程将按顺序处理所有请求。您可以使用多个工作进程,但如果您的应用需要特定的操作序列,您就不会知道一个是否在另一个之前完成导致竞争条件。
您可以简单地将所有事务(来自所有用户)放入单个队列中,并使后端进程从该队列中拉出并为请求提供服务。如果在请求被服务后需要向用户发回响应,则工作进程可以响应具有correlationID的单独队列,该可用于将响应日期发送回正确的用户。
我之前使用ExpressJS应用程序完成了以下流程:
request
对象获取有效负载,并将其发送到具有唯一correlationId
的RabbitMQ队列(例如UUID)。response
对象并将其存储在responseStore
对象中,其中键为correlationId
correlationId
correlationId
并查找存储有相同response
的{{1}}对象correlationId
。如果找到它,它会从消息中获取有效负载并执行responseStore
或response.send(payload)
为此,您还应该有一种机制,可以将response.json(payload)
对象的创建时间与response
对象一起存储。然后有一个单独的进程,它将检查responseStore
并在特定超时后清理旧的响应对象,以防后端进程完成时出现问题。
在这里查看有关使用RabbitMQ的RPC的更多信息:
https://www.rabbitmq.com/tutorials/tutorial-six-javascript.html
希望这有帮助。