Почему мой Oracle AQ такой медленный с многопользовательской очередью

Новичок в Oracle AQ, но кажется, что это действительно должно упростить проект, над которым я работаю.

Я хочу создать очередь с несколькими постоянными подписчиками, но в ходе тестирования я обнаружил, что все замедляется, когда слушают 2 подписчика.

Когда меня слушает один подписчик, все быстро. Я создаю новые сообщения в очереди, и почти мгновенно они потребляются слушателем.

Затем я добавляю другого слушателя с другого сервера. Мгновенно Oracle замедляется. Создание сообщения в очереди занимает более 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>

1 ответ

Это не столько "накладные расходы", сколько то, как модель работает с несколькими подписчиками. В обмене сообщениями есть определенное время "раскрутки" и "раскрутки". Тем не менее, база данных все еще относительно простаивает во время этих задержек. Вы не должны видеть значительного потребления CPU/Memory/IO во время ожидания начала обработки.

Если я понимаю, как все работает, есть фоновые задания, которые обрабатывают сообщения AQ, которые запускаются через определенные интервалы. Когда работа не выполняется, вы не записываете циклы, но ничего не происходит. Это все равно что сказать, что ваш Ferrari работает медленно, когда двигатель не работает или когда вы сидите на красных огнях.

Чтобы проверить производительность, вам, вероятно, не следует беспокоиться об этих простоях, а о том, что в очереди много сообщений, которые нужно обработать. То есть когда Ferrari находится на открытой дороге!

Другие вопросы по тегам