当前位置: 首页 > 知识库问答 >
问题:

Artemis信息再分配问题-功能澄清

欧阳玺
2023-03-14

使用在4 x节点集群中设置的Artemis 2.14和消息重新分发的行为不如我预期的那样-寻找一些帮助来澄清它应该如何行为,即我的配置是否错误,或者我只是希望系统做一些事情它没有!

Artemis集群充当服务于多个应用程序的中央消息传递中心。集群中的所有节点配置相同。各种客户端应用程序是消费者、生产者或两者兼而有之,通常也会根据需要进行集群和扩展。

我遇到的问题的一个例子是,一个消费者应用程序只有两个节点,每个节点运行一个消费者线程,因此它使用的Artemis队列中只有两个消费者,即4个Artemis节点中的2个(最多)将有消费者。Producer应用程序向队列发送消息,由于各种原因,可能会出现这样的情况:消息最终出现在没有消费者的节点上,例如,因为Producer客户端负载似乎不“喜欢”有消费者的节点(可能会就此问一个单独的问题!)或者可能是因为消费者应用程序可能因维护或其他原因停机,但生产者应用程序仍在运行并发送消息。我们为队列配置了“重新分配延迟”(值为600000),我们预计这些消息将在该时间之后自动移动到其他有消费者的节点之一,但这似乎没有发生。

回顾一下文档,我意识到它说的是“……在重新分发消息之前,队列中最后一个消费者关闭后的延迟,以毫秒为单位……”。这是否意味着,如果某个特定节点上从未有任何使用者(我猜是自上次重启以来)那么到达该节点的消息将永远不会被重新分发?如果有的话,你有什么建议来应对这种情况吗?

我的经纪人。xml(下面进行了修改以简化和匿名化)

谢啦!

<?xml version='1.0'?>
<configuration xmlns="urn:activemq"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xi="http://www.w3.org/2001/XInclude"
               xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
    <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="urn:activemq:core ">

        <name>${ARTEMIS_HOSTNAME}</name>
        <metrics-plugin class-name="org.apache.activemq.artemis.core.server.metrics.plugins.ArtemisPrometheusMetricsPlugin"/>
        <persistence-enabled>true</persistence-enabled>
        <journal-type>NIO</journal-type>
        <paging-directory>data/paging</paging-directory>
        <bindings-directory>data/bindings</bindings-directory>
        <journal-directory>data/journal</journal-directory>
        <large-messages-directory>data/large-messages</large-messages-directory>
        <journal-datasync>true</journal-datasync>
        <journal-min-files>2</journal-min-files>
        <journal-pool-files>10</journal-pool-files>
        <journal-device-block-size>4096</journal-device-block-size>
        <journal-file-size>10M</journal-file-size>
        <journal-buffer-timeout>644000</journal-buffer-timeout>
        <journal-max-io>1</journal-max-io>

        <connectors>
            <!-- Connector used to be announced through cluster connections and notifications -->
            <connector name="artemis1-${ENV}-connector">tcp://artemis1-${ENV}:61616</connector>
            <connector name="artemis2-${ENV}-connector">tcp://artemis2-${ENV}:61616</connector>
            <connector name="artemis3-${ENV}-connector">tcp://artemis3-${ENV}:61616</connector>
            <connector name="artemis4-${ENV}-connector">tcp://artemis4-${ENV}:61616</connector>
        </connectors>

        <disk-scan-period>5000</disk-scan-period>
        <max-disk-usage>90</max-disk-usage>
        <critical-analyzer>true</critical-analyzer>
        <critical-analyzer-timeout>120000</critical-analyzer-timeout>
        <critical-analyzer-check-period>60000</critical-analyzer-check-period>
        <critical-analyzer-policy>HALT</critical-analyzer-policy>
        <page-sync-timeout>644000</page-sync-timeout>

        <acceptors>
            <acceptor name="artemis-clients">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
        </acceptors>

        <cluster-user>cluster-user</cluster-user>
        <cluster-password>XXXXXXXXXXXX</cluster-password>

        <cluster-connections>
            <cluster-connection name="artemis-cluster-${ENV}">
                <address></address>
                <connector-ref>${ARTEMIS_HOSTNAME}-connector</connector-ref>
                <retry-interval>500</retry-interval>
                <use-duplicate-detection>true</use-duplicate-detection>
                <message-load-balancing>ON_DEMAND</message-load-balancing>
                <max-hops>1</max-hops>
                <static-connectors allow-direct-connections-only="true">
                    <connector-ref>artemis1-${ENV}-connector</connector-ref>
                    <connector-ref>artemis2-${ENV}-connector</connector-ref>
                    <connector-ref>artemis3-${ENV}-connector</connector-ref>
                    <connector-ref>artemis4-${ENV}-connector</connector-ref>                
                </static-connectors>
            </cluster-connection>
        </cluster-connections>

        <address-settings>
            <!-- if you define auto-create on certain queues, management has to be auto-create -->
            <address-setting match="activemq.management#">
                <dead-letter-address>DLQ</dead-letter-address>
                <expiry-address>ExpiryQueue</expiry-address>
                <redelivery-delay>0</redelivery-delay>
                <!-- with -1 only the global-max-size is in use for limiting -->
                <max-size-bytes>-1</max-size-bytes>
                <message-counter-history-day-limit>10</message-counter-history-day-limit>
                <address-full-policy>PAGE</address-full-policy>
                <auto-create-queues>true</auto-create-queues>
                <auto-create-addresses>true</auto-create-addresses>
                <auto-create-jms-queues>true</auto-create-jms-queues>
                <auto-create-jms-topics>true</auto-create-jms-topics>
                <config-delete-addresses>FORCE</config-delete-addresses>
                <config-delete-queues>FORCE</config-delete-queues>
            </address-setting>
            <address-setting match="my.organisation.#"> <!-- standard settings for all queues --> 
                <!-- error queues automatically created based on these params -->
                <dead-letter-address>ERROR_MESSAGES</dead-letter-address> 
                <auto-create-expiry-resources>true</auto-create-expiry-resources>
                <auto-create-dead-letter-resources>true</auto-create-dead-letter-resources>
                <dead-letter-queue-prefix></dead-letter-queue-prefix> <!-- override the default -->
                <dead-letter-queue-suffix>_error</dead-letter-queue-suffix>
                <!-- redelivery & redistribution settings -->
                <redelivery-delay>600000</redelivery-delay> 
                <max-delivery-attempts>9</max-delivery-attempts> 
                <redistribution-delay>600000</redistribution-delay> 
                <max-size-bytes>-1</max-size-bytes>
                <message-counter-history-day-limit>10</message-counter-history-day-limit>
                <address-full-policy>PAGE</address-full-policy>
                <auto-create-queues>true</auto-create-queues>
                <auto-create-addresses>false</auto-create-addresses>
                <auto-create-jms-queues>false</auto-create-jms-queues>
                <auto-create-jms-topics>false</auto-create-jms-topics>
                <config-delete-addresses>FORCE</config-delete-addresses>
                <config-delete-queues>FORCE</config-delete-queues>
            </address-setting>
        </address-settings>

        <addresses>
            <address name="my.organisation.app1.jms.queue"><anycast><queue name="my.organisation.app1.jms.queue" /></anycast></address>
            <address name="my.organisation.app2.jms.queue.input"><anycast><queue name="my.organisation.app2.jms.queue.input" /></anycast></address>
            <address name="my.organisation.app3.jms.queue.input"><anycast><queue name="my.organisation.app3.jms.queue.input" /></anycast></address>
        </addresses>
        <security-settings>
            <security-setting match="#">
                <permission type="createNonDurableQueue" roles="amq"/>
                <permission type="deleteNonDurableQueue" roles="amq"/>
                <permission type="createDurableQueue" roles="amq"/>
                <permission type="deleteDurableQueue" roles="amq"/>
                <permission type="createAddress" roles="amq"/>
                <permission type="deleteAddress" roles="amq"/>
                <permission type="consume" roles="amq"/>
                <permission type="browse" roles="amq"/>
                <permission type="send" roles="amq"/>
                <!-- we need this otherwise ./artemis data imp wouldn't work -->
                <permission type="manage" roles="amq"/>
            </security-setting>
            <security-setting match="my.organisation.app1.#">
                <permission type="consume" roles="app1_role"/>
                <permission type="browse" roles="app1_role"/>
                <permission type="send" roles="app1_role"/>
            </security-setting>
            <security-setting match="my.organisation.app2.#">
                <permission type="consume" roles="app2_role"/>
                <permission type="browse" roles="app2_role"/>
                <permission type="send" roles="app2_role"/>
            </security-setting>
            <security-setting match="my.organisation.app3.#">
                <permission type="consume" roles="app3_role"/>
                <permission type="browse" roles="app3_role"/>
                <permission type="send" roles="app3_role"/>
            </security-setting>

        </security-settings>
    </core>
</configuration>

共有1个答案

高宸
2023-03-14

根据您的配置,如果消息被发送到没有使用者的节点,那么它应该自动转发到有使用者的节点。文档称之为“初始分发”所谓的“再分配”只适用于在消费者在场时到达代理上并随后断开连接的消息。

如果你认为自己遇到了一个bug,那么就编写一个测试用例来重现这个问题,并打开一个JIRA。

 类似资料:
  • 我试图在ActiveMQ Artemis 2.13上配置HA。我试着从一个简单的主和备份开始。我已经多次阅读关于集群和HA的文档,但我仍然不确定我在做什么。我还研究了replicated-failback java示例。 从客户端,我必须为主节点和备份节点指定连接信息吗?这个示例让我感到困惑,因为它看起来URL/连接是通过输入参数传递给java程序的,而我不确定它们来自哪里。 在主控制台中,一切看

  • 我使用的是Apache ActiveMQ Artemis 2.16.0(但也尝试了2.15.0)、artemis-jms-client 2.6.4和Spring Boot 1.5.16.release。

  • 如何获取QQ登录的unionId? 在AuthConfig中设备unionId为true AuthRequest authRequest = new AuthQqRequest(AuthConfig.builder() .clientId("clientId") .clientSecret("clientSecret") .redirectUri("

  • 我没有找到我的问题的答案,所以我在这里问它

  • 在我们教授的代码中,他定义了他的泡泡排序函数(和其他排序函数),如下所示: 他已经定义了访问修饰符、返回类型(或没有)、函数名及其所需参数。它甚至不返回可以进行比较的对象,所以我觉得这有点让人困惑。非常感谢您的帮助。

  • 实际上,我首先升级到ActiveMQ Artemis1.3,在这里,这段代码仍然有效。我打算最终升级到2.15.0,但我只是不确定还有哪些东西可能被否决了,所以我稍微跳到了2.0。当我移动到2.0时,上面的代码坏了,所以我使用下面的代码。 现在已被弃用。我可以用什么来代替获得同样的行为,有什么建议吗?