rabbitmq 是否有办法将消息推送到异步代理中的两个后端?

kb5ga3dv  于 2023-02-04  发布在  RabbitMQ
关注(0)|答案(1)|浏览(175)

(As上下文,我使用RabbitMQ作为消息代理,由KrakenD集成。API使用Nestjs。)
我知道KrakenD中的异步代理可以将使用的数据推送到多个后端:
KrakenD联系定义的后端列表,在新消息出现时传递事件数据。
然而,在这里传递两个不同的后端会导致logger为两个API指示一个context exceeded。如果我只在列表中放入一个后端,它会返回预期的结果。
下面是工作代码:

"backend": [
    {
      "url_pattern": "/newOrder",
      "method": "POST",
      "host": [ "http://127.0.0.1:3300" ],
      "disable_host_sanitize": false,
      "extra_config": {
        "modifier/martian": {
          "header.Modifier": {
            "scope": [
                "request"
            ],
            "name": "Content-Type",
            "value": "application/json"
          }
        }
      }
    },
    {
      "url_pattern": "/newOrderNotification",
      "method": "POST",
      "host": [ "http://127.0.0.1:3200" ],
      "disable_host_sanitize": false,
      "extra_config": {
        "modifier/martian": {
          "header.Modifier": {
            "scope": [
                "request"
            ],
            "name": "Content-Type",
            "value": "application/json"
          }
        }
      }
    }
  ],

希望我能得到任何建议。谢谢!

ndh0cuux

ndh0cuux1#

您可以将一个异步代理连接到多个后端,但KrakenD不支持分布式事务,因此每个管道不允许超过一个非安全后端请求(如RFC 2616第9节所定义)。
即使你可以在一个端点上使用多个后端,KrakenD也不允许你定义多个非安全(写)后端。这是一个(有时有争议的)设计决策,旨在禁用网关处理事务。
如果您需要一个写方法(POST、PUT、DELETE、PATCH)和其他GET方法,请使用顺序代理,并在序列末尾放置最多1个写方法。
如果你想发送一个次要的非安全请求,你可以使用http_response帮助器(https://www.krakend.io/docs/endpoints/lua/# making-additional-requests-http_response)添加一个最小的lua代码片段,如下所示:

{
    "extra_config": {
        "modifier/lua-proxy": {
            "pre": "local r = request.load(); http_response.new('http://127.0.0.1:3200/newOrderNotification', "POST", r:body())"
        }
    }
}

相关问题