有没有一种模式可以手动同步消息队列通信以进行请求/响应?

时间:2019-03-21 10:24:56

标签: asynchronous design-patterns synchronization

让我们想象一下我有一个带有端点/api/status的REST API。访问此端点后,API会将消息发送到消息队列,以请求其他服务的状态。

然后作为回复,服务将一条消息及其状态发送到REST API侦听的队列。因此,请求状态和回复消息只是一条消息。

我的问题是: API中是否存在一种将这种方法的异步特性转换为同步方法的设计模式?换句话说:GetStatus(...)是否存在一种模式下面的伪代码中的方法可以实现将状态的获取与通过多个消息队列甚至是发布/订阅系统的通信进行同步。

var statusRequestMsg = "get_status";
var statusResponseMsg = GetStatus(statusRequestMsg);

我知道如何用代码解决这个问题,但我很好奇是否有一种设计方法引入了一种通用方法。

我在搜索中进行了大量搜索,但是发现的唯一想法是本文对实现此目标的方法进行了非常技术性的解释: A Communication Model to Integrate the Request-Response and the Publish-Subscribe Paradigms into Ubiquitous Systems

请注意,我了解这不是完美的API设计,并且有更好的方法来实现该示例。我创建了上面的示例来帮助说明我的问题。我也了解一些AMQP暗示。 (例如RabbitMQ)提供了一种将MQ通信与请求/响应样式同步的方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

您考虑过这样的事情吗?

  1. 请求进入
  2. 创建相关ID
  3. 将相关性ID发送为其他服务,作为通过队列发送的消息的一部分
  4. 开始在某些数据存储区中查询该ID(例如Redis)

时间过去了...

  1. 在通过队列发送的消息中,将相关ID与请求结果一起发送回原始服务
  2. 工作人员读取队列将数据存储中的相关id的值设置为异步请求的结果
  3. 投票发现结果并作为对请求的响应返回

那行得通吗?