如何在 Hub/Spoke 拓扑中控制帧大小
how to control the frame size in a Hub/Spoke topology
拒绝接受从 Hub 发送的消息时,Spoke 出现错误:
java.io.IOException: Frame size of 1 GB larger than max allowed 100 MB
编辑: @JustinBertram 要求的完整堆栈跟踪
2019-03-22T13:15:11.821+01:00 | DEBUG | 0.33:59110@61616 | Transport | ivemq.broker.TransportConnection 231 | 167 - org.apache.activemq.activemq-osgi - 5.11.0.redhat-630262 | Transport Connection to: tcp://1.2.3.4:56789 failed: java.io.IOException: Frame size of 1 GB larger than max allowed 100 MB
java.io.IOException: Frame size of 1 GB larger than max allowed 100 MB
at org.apache.activemq.util.IOExceptionSupport.createFrameSizeException(IOExceptionSupport.java:52)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:261)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at java.lang.Thread.run(Thread.java:748)[:1.8.0_191]
分支网络连接器
<networkConnector name="SPOKE-TO-HUB" uri="static:(tcp://hub:61616)" duplex="true" networkTTL="5" decreaseNetworkConsumerPriority="true" bridgeTempDestinations="false" userName="..." password="..."/>
分支和集线器传输连接器(端口将为 61616)
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:0?maximumConnections=1000&wireFormat.maxFrameSize=104857600" />
<transportConnector uri="vm://local"/>
</transportConnectors>
修复此错误的标准答案是增加 maxFrameSize。
如果可能的话,我宁愿尝试减小分派帧的大小以保留 Spoke 内存。
不清楚什么是框架,因此我无法决定如何解决此问题。
谁能阐明我在做出修复决定时需要考虑的因素。
编辑 - 额外思考
我的理解是 Hub 代理正在尝试向 Spoke 代理发送消息并达到传输连接器的 100 MB 限制。
假设我允许 1 GB 流向 Spoke,这对 Spoke 系统有什么影响?
我猜流将被取消编组,消息将被发送到目的地。
然后,如果目标限制允许(在我的情况下最大内存为 100Mb),消息将保存在内存中,或者将保存在临时存储中,然后将其存储在日志中。
需要多少内存才能保证Spoke不会崩溃?
内存对于 activemq 来说不是问题,根据他们的文档,磁盘大小是限制 http://activemq.apache.org/how-do-i-configure-activemq-to-hold-100s-of-millions-of-queue-messages.html
ActiveMQ is not limited by memory availability, but by the size of the disk available to hold the persistent messages.
升级 maxFrameSize 是一个解决方案
拒绝接受从 Hub 发送的消息时,Spoke 出现错误:
java.io.IOException: Frame size of 1 GB larger than max allowed 100 MB
编辑: @JustinBertram 要求的完整堆栈跟踪
2019-03-22T13:15:11.821+01:00 | DEBUG | 0.33:59110@61616 | Transport | ivemq.broker.TransportConnection 231 | 167 - org.apache.activemq.activemq-osgi - 5.11.0.redhat-630262 | Transport Connection to: tcp://1.2.3.4:56789 failed: java.io.IOException: Frame size of 1 GB larger than max allowed 100 MB
java.io.IOException: Frame size of 1 GB larger than max allowed 100 MB
at org.apache.activemq.util.IOExceptionSupport.createFrameSizeException(IOExceptionSupport.java:52)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:261)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:221)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:213)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196)[167:org.apache.activemq.activemq-osgi:5.11.0.redhat-630262]
at java.lang.Thread.run(Thread.java:748)[:1.8.0_191]
分支网络连接器
<networkConnector name="SPOKE-TO-HUB" uri="static:(tcp://hub:61616)" duplex="true" networkTTL="5" decreaseNetworkConsumerPriority="true" bridgeTempDestinations="false" userName="..." password="..."/>
分支和集线器传输连接器(端口将为 61616)
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:0?maximumConnections=1000&wireFormat.maxFrameSize=104857600" />
<transportConnector uri="vm://local"/>
</transportConnectors>
修复此错误的标准答案是增加 maxFrameSize。
如果可能的话,我宁愿尝试减小分派帧的大小以保留 Spoke 内存。
不清楚什么是框架,因此我无法决定如何解决此问题。
谁能阐明我在做出修复决定时需要考虑的因素。
编辑 - 额外思考 我的理解是 Hub 代理正在尝试向 Spoke 代理发送消息并达到传输连接器的 100 MB 限制。
假设我允许 1 GB 流向 Spoke,这对 Spoke 系统有什么影响? 我猜流将被取消编组,消息将被发送到目的地。 然后,如果目标限制允许(在我的情况下最大内存为 100Mb),消息将保存在内存中,或者将保存在临时存储中,然后将其存储在日志中。
需要多少内存才能保证Spoke不会崩溃?
内存对于 activemq 来说不是问题,根据他们的文档,磁盘大小是限制 http://activemq.apache.org/how-do-i-configure-activemq-to-hold-100s-of-millions-of-queue-messages.html
ActiveMQ is not limited by memory availability, but by the size of the disk available to hold the persistent messages.
升级 maxFrameSize 是一个解决方案