【问题标题】:Apache Camel and Netty as a TCP sticky balancerApache Camel 和 Netty 作为 TCP 粘性平衡器
【发布时间】:2014-11-01 17:38:50
【问题描述】:

我正在尝试通过 Apache Camel 和 Netty 对多个后端服务器上的 TCP 连接进行负载平衡。

我想让每个到后端的连接映射到每个到 Camel 的连接。像这样的:

  1. 客户端连接到 Camel。
  2. Camel 选择一个后端服务器并连接到它。
  3. 客户端向 Camel 发送一些东西。
  4. Camel 将其发送到关联的后端服务器。
  5. 后端服务器回复 Camel。
  6. Camel 将其发回给客户。
  7. ...

我的协议是有状态的,客户端和 Camel 之间的连接将保持打开状态。我还需要从后端开始发送到客户端的消息。

到目前为止,一切都很好。这工作得很好。 当我连接到同一个后端服务器的新客户端时,我的问题开始了,看起来骆驼重用了已经打开的连接,对于后端服务器,它看起来像第一个客户端发送消息,它没有收到新的连接请求。

我查看了 Apache Camel Netty 组件文档,但没有找到任何可以配置此行为的内容。

可以这样做吗?

旁注:我使用 Camel 是因为我需要检查协议中的消息以选择后端服务器,我需要自定义负载平衡策略。使用骆驼提供的任何负载平衡策略都会出现问题,因此它与我的代码无关。

【问题讨论】:

    标签: tcp apache-camel netty load-balancing


    【解决方案1】:

    Camel 有一个stickyloadbalancer,你只需要设置一个表达式来告诉camel 决定它需要使用哪个对象哈希码。

    from("direct:start").loadBalance().
                sticky(header("source")).to("mock:x", "mock:y", "mock:z");
    

    【讨论】:

    • 我已经这样做了。这工作正常。问题是与骆驼的新连接重用了与后端的相同连接。
    • 是的,camel-netty 正在尝试尽可能重用连接。如果连接处于活动状态,则不会为其启动新连接。如果你想改变这种行为,我们需要在camel-netty生产者内部实现一个新的对象池,以便在代理客户端不同的情况下建立一个新的连接。
    • 我明白了。谢谢你的提示。我认为骆驼也不能进行双向通信。所以它需要更多的改变,也许这甚至不是 Camel 的重点。所以我打算自己编写整个路由器和平衡器。
    猜你喜欢
    • 2012-03-12
    • 2017-01-03
    • 2016-02-17
    • 1970-01-01
    • 2012-06-04
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多