跳到主要内容

消息交换模式

本节描述了常见消息交换模式的成功和失败场景。

Solace PubSub+ 事件代理以相同的方式处理持久和非持久消息。因此,以下图表进行了简化,仅显示持久消息。

REST生产者单向POST到代理

HTTP标头示例

POST /TOPIC/test/news HTTP/1.1
Host: sol-ny-prod-0001:8080
Solace-Time-To-Live-In-ms: 20000
Solace-Delivery-Mode: persistent
Solace-DMQ-Eligible: true
Content-Length: 1000

成功案例消息交换

img

代理单向POST到REST消费者

HTTP标头示例

POST /Request/Target HTTP/1.1
Host: sol-ny-prod-0001:8080
Content-Length: 1000

成功案例消息交换

img

REST 消费者必须以成功状态码(如 200 OK)响应,如果它成功接收到了消息。事件代理会根据其配置的设置(例如关联队列上的最大重试设置)重试向 REST 消费者投递消息,以应对所有失败状态码。

在此示例中,事件代理会丢弃 200 OK 响应正文中返回的任何负载。仅在请求回复场景中(通过 Solace SMF 消息中的回复目标的存在来指示),才会处理 200 OK 响应正文中的内容。有关详细信息,请参阅 REST 生产者请求与异步回复到目标。

失败场景消息交换

img

在此场景中,消息错误处理包括以下内容:

  • 如果根据队列设置还有重试次数剩余,将尝试重新投递消息。
  • 当重试次数用尽时,则应用正常的 DMQ 处理。这意味着,如果消息符合 DMQ 条件,它将被放置在 DMQ 上。否则,消息将被丢弃,并记录一个统计信息。

REST生产者请求/回复

HTTP标头示例

POST /TOPIC/test/news HTTP/1.1
Host: sol-ny-prod-0001:8080
Solace-Reply-Wait-Time-In-ms: 10000
Content-Length: 1000

成功案例消息交换

img

事件代理向 REST 生产者发送的同步回复消息是一个直接消息。这意味着,无论请求消息是持久的还是直接的,在投递之前都不会将回复消息放入持久队列。没有必要持久化回复消息,因为如果在返回回复时发生故障(例如,Solace PubSub+ 事件代理活动切换或 REST 生产者重置),那么 HTTP 连接将失败,因此无法将回复返回给请求。

如果消费者希望在回复消息中提供处理错误,它可以将错误消息编码到回复消息正文中。然后,REST 生产者将收到一个 200 OK,其中错误内容作为 200 OK 状态码正文。从传输角度来看,200 OK 表示请求和回复已成功接收。回复的正文指示应用程序消费者是否正确处理了请求。

失败场景消息交换

以下序列图概述了请求回复场景中可能发生交互。

img

REST生产者请求与异步回复到目标

HTTP标头示例

POST /QUEUE/test/news HTTP/1.1
Host: sol-ny-prod-0001:8080
Solace-Time-To-Live-In-ms: 20000
Solace-Delivery-Mode: persistent
Solace-DMQ-Eligible: true
Solace-Reply-To-Destination: /QUEUE/my/reply
Content-Length: 1000

成功案例消息交换

以下图表展示了一个既作为 REST 生产者又作为 REST 消费者用于异步回复的应用程序。在此示例中,使用了 Solace 持久消息。然而,消息交换模式也适用于直接消息。

img

失败场景消息交换

此消息交换模式是 REST 生产者单向 POST 到 Solace 和 Solace 单向 POST 到 REST 消费者的组合。因此,失败场景是这两种场景的组合,这里不再重复。

代理请求/回复到REST消费者

此场景与 Solace 单向 POST 到 REST 消费者中描述的情况类似。REST 消费者从事件代理接收 POST,但此 POST 将包含 Solace-Reply-Wait-Time-In-ms 头,该头指示事件代理期望对此消息进行回复。

REST 消费者可以将任何回复编码到它返回给事件代理的 200 OK POST 响应正文中。如果原始 Solace 请求消息包含回复目标字段,则会生成一个 Solace 回复消息,其正文包含 200 OK POST 响应的内容。空的 200 OK POST 响应生成一个空的回复消息。事件代理将任何此类回复消息视为直接消息,尽管它可能会根据回复目标队列或主题,将直接消息提升为保证消息。

与 Solace 单向 POST 到 REST 消费者类似,如果消息成功接收,REST 消费者必须以成功状态码(如 200 OK)响应。即使消息处理导致应用程序错误条件,也是如此。根据 CLI 中的重试配置,事件代理可以重试投递所有失败状态码的消息。REST 消费者可以将任何错误详细信息编码到 200 OK POST 响应正文中。

HTTP标头示例

POST /Request/Target HTTP/1.1
Host: sol-ny-prod-0001:8080
Solace-Reply-Wait-Time-In-ms: 10000
Content-Length: 1000