RabbitMQ(或类似的消息排队系统)可以用于每个用户的单线程请求吗?

时间:2017-03-29 17:18:54

标签: rabbitmq mq

问题是我们有一些现代的Web应用程序与遗留系统集成,而遗留系统从未被设计为支持来自单个用户的多个并发请求。基本上,某些类型的请求遗留系统只能从一个用户一次一个地处理。它可以处理来自不同用户的多个并发请求,但由于技术原因无法处理来自单个用户的多个请求。在这些情况下,用户的第一个请求将成功完成,但在第一个请求仍在执行时来自同一用户的任何后续请求将失败。

因为我们的应用程序启用了ajax,多标签/多浏览器友好,而且只有多个应用程序这一事实 - 在某些情况下,用户最终可能会发送多种类型的请求同时到遗留系统。

我正在尝试确定像RabbitMQ这样的东西是否可以放在遗留系统的前面,并且可以用于每个用户/ IP的单线程请求。我们的想法是,Web应用程序会将所有请求发送到MQ,并且它们会堆叠到每个用户的队列中,并一次传递给旧系统。

我不知道是否会对可能产生的队列数量产生担忧 - 我们拥有大约4,000的用户群。

我知道我们可以在Web应用程序中单独解决这个问题,但由于有多个应用程序,它们会在它们之间复制逻辑,并且您仍然有可能使用两个不同的应用程序来启动并发请求。

任何反馈都将不胜感激。谢谢 -

1 个答案:

答案 0 :(得分:0)

我不确定每个用户的唯一队列是否有效,因为您需要让后端工作进程监听该队列上需要动态创建的消息。

下面是一个选项,但它确实存在性能瓶颈,因为单个后端进程将按顺序处理所有请求。您可以使用多个工作进程,但如果您的应用需要特定的操作序列,您就不会知道一个是否在另一个之前完成导致竞争条件。

您可以简单地将所有事务(来自所有用户)放入单个队列中,并使后端进程从该队列中拉出并为请求提供服务。如果在请求被服务后需要向用户发回响应,则工作进程可以响应具有correlationID的单独队列,该可用于将响应日期发送回正确的用户。

我之前使用ExpressJS应用程序完成了以下流程:

  1. user / process / ajax发出请求
  2. Express从request对象获取有效负载,并将其发送到具有唯一correlationId的RabbitMQ队列(例如UUID)。
  3. Express然后获取response对象并将其存储在responseStore对象中,其中键为correlationId
  4. 同时,后端工作进程从队列中提取项目,执行一些操作然后将消息发送到具有相同correlationId
  5. 的其他响应队列
  6. ExpressJS应用程序与响应队列有连接,当它收到消息时,它从响应中获取correlationId并查找存储有相同response的{​​{1}}对象correlationId。如果找到它,它会从消息中获取有效负载并执行responseStoreresponse.send(payload)
  7. 之类的操作

    为此,您还应该有一种机制,可以将response.json(payload)对象的创建时间与response对象一起存储。然后有一个单独的进程,它将检查responseStore并在特定超时后清理旧的响应对象,以防后端进程完成时出现问题。

    在这里查看有关使用RabbitMQ的RPC的更多信息:

    https://www.rabbitmq.com/tutorials/tutorial-six-javascript.html

    希望这有帮助。