请求-回复 语义
发送消息并接收响应的模式在大多数客户端库中被封装为一个请求方法。在底层,该方法会发布一条带有唯一回复主题(reply-to subject)的消息,并在返回之前等待响应。
在一些较旧版本的库中,每次都会创建一个全新的回复主题。而在较新版本中,则利用了主题层次结构:客户端库中的单个订阅者监听一个通配符主题,而请求则通过这个被监听主题的唯一子主题发送。
与 发布带有 回复到... 的主题 相比较,请求方法的主要区别在于,客户端库预期只会接受一个响应,而且在大多数库中,request 会被视为同步操作。此外,库甚至可能提供设置超时时间的方法。
例如,在前面发布的示例基础上,我们可以请求time,并设置一秒钟的超时:
{% tabs %} {% tab title="Go" %}
{% endtab %}
{% tab title="Java" %}
{% endtab %}
{% tab title="JavaScript" %}
{% endtab %}
{% tab title="Python" %}
{% endtab %}
{% tab title="C#" %}
{% endtab %}
{% tab title="Ruby" %}
{% endtab %}
{% tab title="C" %}
{% endtab %} {% endtabs %}
在库中,你可以将 请求-回复 模式视为一种“订阅-获取一条消息-取消订阅”的模式。在 Go 中,这可能看起来像这样:
散射-聚集
你可以将请求-回复模式扩展为一种通常称为散射-聚集(scatter-gather)的操作。为了接收多个消息,并设置超时时间,你可以执行类似以下操作:其中获取消息的循环体使用时间作为限制条件,而不是只接收单个消息:
或者,你可以通过计数器和超时时间,循环尝试获取至少 N 个响应:
