2

Oracle AQ 的新手,但它似乎真的让我正在从事的项目变得容易。

我想创建一个包含多个持久订阅者的队列,但我在测试中发现,一旦有 2 个订阅者在收听,一切都会变慢。

当我有一个订阅者收听时,一切都很快。我在队列中创建新消息,几乎立即它们被听众消费。

然后我从另一台服务器添加另一个监听器。甲骨文立即放慢了速度。在队列中创建一条消息需要 60 多秒。该消息直到几分钟后才会被使用。

我想知道,当队列是多消费者时,是否有更多的开销?只有在服务器启动时才会产生这种开销吗?还是会一直存在?

我使用单消费者队列进行了第二次测试,没有遇到这些问题。

也许我在侦听器配置中做错了什么?

这就是我设置队列表的方式:

EXEC dbms_aqadm.create_queue_table(queue_table=>'MY_QUEUE_TABLE',
     queue_payload_type=>'sys.aq$_jms_text_message',
     multiple_consumers=>TRUE);

这是我的配置:

<jms:listener-container 
        connection-factory="AQjmsFactory"
        container-type="default"
        destination-type="durableTopic"
        client-id="MY-ADAPTER" 
        acknowledge="transacted">
    <jms:listener destination="MYA_INFO_QUEUE" ref="personUpdateListener" subscription="MYADAPTERJ"/>
    <jms:listener destination="MYB_INFO_QUEUE" ref="courseUpdateListener" subscription="MYADAPTERJ"/>
</jms:listener-container>
4

1 回答 1

0

它并不是真正的“开销”,而是模型如何与多个订阅者一起工作。消息传递有一定的“加速”和“减速”时间。也就是说,在这些延迟期间,数据库仍然相对空闲。在等待处理开始时,您不应该看到显着的 CPU/内存/IO 消耗。

如果我了解事情是如何工作的,那么有一些后台作业可以处理以特定时间间隔运行的 AQ 消息。当作业未运行时,您不会烧掉任何周期,但也不会发生任何事情。这就像说你的法拉利在引擎不运转或你坐在红灯时很慢。

要测试性能,您可能不必担心这些空闲时间,而应该担心队列中有许多消息要处理。也就是说,当法拉利在开阔的道路上时!

于 2010-11-28T04:07:26.017 回答