Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Интеграция между Oracle AQ и Rabbit MQ  [new]
micis
Member

Откуда:
Сообщений: 88
Кто-нибудь делал обмен между очередями оракла и кролика?

На сайте кролика есть раздел с интеграцией, и это даже работает, но только из оракла в кролик (подписчик оракловой очереди вызывает ява-код и он отправляет в кролик). А в другую сторону уже проблема - 100% cpu в сессии. Потому что это полностью ява-код и даже Thread.sleep создаёт нагрузку на cpu.
Видимо надо делать что-то похожее на mgw-агент, но как?
4 июн 21, 08:23    [22331179]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2338
micis,

Не понял, в чём проблема? Ява какого-то хрена делает thread.sleep, чтобы положишь сообщение в очередь оракла? Для меня, например, самое тёмное, это как получить евент из оракла где-нибудь. А в оракл сунуть сообщение - это достаточно тривиально.

Сообщение было отредактировано: 4 июн 21, 08:24
4 июн 21, 08:31    [22331180]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
micis
Member

Откуда:
Сообщений: 88
crutchmaster
Не понял, в чём проблема? Ява какого-то хрена делает thread.sleep, чтобы положишь сообщение в очередь оракла?
Ява-код создаёт коллбек-функцию (аналог ораклового подписчика) для сообщений кролика и делает sleep. А когда новое сообщение появляется в кролике, то происходит выход из sleep и переход в коллбек-функцию. По этой логике 99% времени сессия должна быть idle, а она находится в состоянии 100% cpu. Видимо это так работает ява внутри оракла. Вот я и спрашиваю, может кто другие варианты предложит.

Сообщение было отредактировано: 4 июн 21, 08:38
4 июн 21, 08:45    [22331183]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2338
micis
Ява-код создаёт коллбек-функцию (аналог ораклового подписчика) для сообщений кролика и делает sleep.

Стандартные amqp либы для явы нормально работают и у них такого не наблюдается. Если хочешь, можешь сделать сервис сбоку, который будет соединяться с кроилом, ораклом и гонять запросы туда-сюда. Если у тебя нет проблем с тем, чтобы ждать сообщения из оракла, то всё должно быть хорошо. С jar'ами, которые внутри оракла работают, я не знаю что, может есть смысл собрать такую с нормальной либой.

Сообщение было отредактировано: 4 июн 21, 08:58
4 июн 21, 09:05    [22331190]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
micis
Member

Откуда:
Сообщений: 88
crutchmaster
сделать сервис сбоку
Да, именно так и работает оракловый mgw-агент. Но это и проблема - у нас время ответа сервиса должно укладываться в 3 секунды. А это куча вызовов процедур и через очереди раз 5 надо пройти. Поэтому и пытаемся использовать подписчики везде где возможно.

Сообщение было отредактировано: 4 июн 21, 09:50
4 июн 21, 09:58    [22331210]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5888
micis
она находится в состоянии 100% cpu.
как проверяли? что конкретно сессия делает? какие syscall?
4 июн 21, 14:27    [22331381]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
micis
Member

Откуда:
Сообщений: 88
Sayan Malakshinov
как проверяли? что конкретно сессия делает? какие syscall?

Интересно получается, если пользователь выполняет такой код:
CREATE OR REPLACE PROCEDURE java_sleep(P_MILLI_SECONDS IN NUMBER)  AS LANGUAGE JAVA NAME 'java.lang.Thread.sleep(long)';
/
exec java_sleep(300*1000);
То ожидания в сессии могут быть такие:
SQL> select STATUS,EVENT,P1TEXT,P1,P2TEXT,P2,WAIT_CLASS,STATE,WAIT_TIME,WAIT_TIME_MICRO,TIME_REMAINING_MICRO,seconds_in_wait from v$session where username='U2';

STATUS                   EVENT                                              P1TEXT                  P1 P2TEXT                  P2 WAIT_CLASS           STATE                      WAIT_TIME WAIT_TIME_MICRO TIME_REMAINING_MICRO SECONDS_IN_WAIT
------------------------ -------------------------------------------------- ---------- --------------- ---------- --------------- -------------------- -------------------- --------------- --------------- -------------------- ---------------
ACTIVE                   PGA memory operation                                                    65536                          1 Other                WAITED SHORT TIME                 -1              17                                  250
Или такие:
STATUS                   EVENT                                              P1TEXT                  P1 P2TEXT                  P2 WAIT_CLASS           STATE                      WAIT_TIME WAIT_TIME_MICRO TIME_REMAINING_MICRO SECONDS_IN_WAIT
------------------------ -------------------------------------------------- ---------- --------------- ---------- --------------- -------------------- -------------------- --------------- --------------- -------------------- ---------------
ACTIVE                   db file sequential read                            file#                    1 block#              985188 User I/O             WAITED KNOWN TIME                  1            5034                                   52
Или такие:
STATUS                   EVENT                                              P1TEXT                  P1 P2TEXT                  P2 WAIT_CLASS           STATE                      WAIT_TIME WAIT_TIME_MICRO TIME_REMAINING_MICRO SECONDS_IN_WAIT
------------------------ -------------------------------------------------- ---------- --------------- ---------- --------------- -------------------- -------------------- --------------- --------------- -------------------- ---------------
ACTIVE                   SQL*Net message from client                        driver id       1650815232 #bytes                   1 Idle                 WAITED KNOWN TIME              19165       191650469                                  195

Но значения всегда одинаковые во время одного выполнения (кроме счётчиков). И ОЕМ интерпретирует их как 100% cpu.
7 июн 21, 06:01    [22332069]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5888
micis,

это не ожидания... если STATE=WAITED KNOWN TIME, значит CPU и есть, и смотреть на event не надо
7 июн 21, 12:33    [22332206]     Ответить | Цитировать Сообщить модератору
 Re: Интеграция между Oracle AQ и Rabbit MQ  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5888
micis,

в целом ничего страшного, просто неинструментирован java-код нормально: процесс CPU не жрет, нормально спит по poll частями не больше секунды
+

SQL> exec java_sleep(6000)

PL/SQL procedure successfully completed.

short_stack
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884
SQL> oradebug short_stack
ksedsts()+426<-ksdxfstk()+58<-ksdxcb()+872<-sspuser()+223<-__sighandler()<-__poll()+16<-sjonio_poll()+164<-joet_poll()+324<-joet_schedule()+1004<-joet_doze()+283<-joet_sleep()+200<-joevm_invoke_sysnative()+471<-joevm_invokerecursive()+789<-joe_run_vm()+13884

strace:
strace: Process 12090 attached
read(17, "\0\0\1^\6\0\0\0\0\0\21i-\376\377\377\377\377\377\377\377\1\0\0\0\6\0\0\0\3^."..., 8208) = 350
getrusage(RUSAGE_THREAD, {ru_utime={tv_sec=0, tv_usec=586422}, ru_stime={tv_sec=0, tv_usec=80527}, ...}) = 0
poll(NULL, 0, 1000)                     = 0 (Timeout)
poll([{fd=17, events=POLLIN|POLLRDNORM}], 1, 0) = 0 (Timeout)
poll(NULL, 0, 1000)                     = 0 (Timeout)
getrusage(RUSAGE_THREAD, {ru_utime={tv_sec=0, tv_usec=587180}, ru_stime={tv_sec=0, tv_usec=80527}, ...}) = 0
poll(NULL, 0, 1000)                     = 0 (Timeout)
poll(NULL, 0, 1000)                     = 0 (Timeout)
getrusage(RUSAGE_THREAD, {ru_utime={tv_sec=0, tv_usec=587332}, ru_stime={tv_sec=0, tv_usec=80527}, ...}) = 0
poll([{fd=17, events=POLLIN|POLLRDNORM}], 1, 0) = 0 (Timeout)
poll(NULL, 0, 1000)                     = 0 (Timeout)
poll(NULL, 0, 994)                      = 0 (Timeout)
7 июн 21, 13:11    [22332239]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить