Заблокированные темы из-за ServiceRegistry

У меня достаточно большая система запросов / запросов, в которой мы используем OSGi. Мы получаем около 800 миллионов запросов в день.

В настоящее время мы наблюдаем некоторые проблемы, когда потоки блокируются. Для каждого поступающего запроса мы пересылаем событие / данные в пакет osgi с помощью registerService для передачи полезной нагрузки / данных в пакет OSGi, который прослушивает эту услугу.

Как это: bundleContext.registerService(Map.class.getName(), dataHolderMap, null);

Где dataHolderMap - это не что иное, как обычный jash hashmap

Вот дамп-дамп, использующий JStack:

================================================== =========================

"RequestThread" prio = 10 tid = 0x00000000421ab800 nid = 0x1042 runnable [0x00007fbdd3867000] java.lang.Thread.State: RUNNABLE в org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry00000000): Java (0290000): 0 (заблокировано) (0295000): 0 org.apache.felix.framework.ServiceRegistry) в org.apache.felix.framework.Felix.getService(Felix.java:3568) в org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:4) org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411) в org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932) в org.osgi.util.tracker.ServiceTracker $ Отслеживание.customizerAdding(ServiceTracker.java:864) в org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) в org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) в организации.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:894) в org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932) в org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793) в org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher3): EventDispatcher в org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4419) в org.apache.felix.framework.Felix.registerService(Felix.java:3423) в org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346) в org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) в com.mypackage.person.bs.processor.Processor.sendEvent(Processor.java:56) в com.mypackage.jetMyStream. channel.messaging.InboundMessagingChannel.onMessage (InboundMessagingChannel.java:204) в com.mypackage.jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349) по адресу com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) по адресу com.mypackage.est_jetMyStream.meerSecRevice.MessageMessageMessageMessageMessageMessageMessageMe 40) в com.mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)

"RequestThread" prio = 10 tid = 0x00000000425f8800 nid = 0x1041, ожидающий запись монитора [0x00007fbdd3968000] java.lang.Thread.State: BLOCKED (на объектном мониторе) в org.apache.felix.framework.ServiceRegistry.registerService(ServiceReg: ServiceReg: Service:109) - ожидание блокировки <0x0000000700e2c590> (org.apache.felix.framework.ServiceRegistry) в org.apache.felix.framework.Felix.registerService(Felix.java:3393) в org.apache.felix.framework.BundleContempImp.registerService (BundleContextImpl.java:346) по адресу org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) по адресу com.mypackage.person.bs.processor.Processor.sendEvent: BullseyeMode com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.onMessage (InboundMessag ingChannel.java:204) в com.mypackage.jetMyStream.messaging.MessageService.dispatchMessageForContext (MessageService.java:349) в com.mypackage.jetMyStream.messaging.MessageService.dispatch (MessageSerpack.jety.messaging.MessageServiceRequest.execute(MessageServiceRequest.java:40)

в com.mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)

Пара вопросов по этому поводу:

  1. Я делаю что-то не так при отправке карты через registerService. Если так, каковы мои альтернативы?

  2. Любые идеи о том, как я могу заставить это работать? У нас 26 узлов, и нам нужно обрабатывать около 400 запросов в секунду, используя этот механизм.

    У кого-нибудь были похожие проблемы? Любые указатели высоко ценятся

Спасибо масти

1 ответ

Решение

"Я делаю что-то не так при отправке карты через registerService. Если да, каковы мои альтернативы?"

ДА! Реестр сервисов НЕ предназначен для использования таким образом; это не шина обмена сообщениями.

Что касается альтернатив... почему бы не использовать шину обмена сообщениями? Вы можете посмотреть на OSGi Event Admin, но есть много других реализаций этой идеи.

"Любые идеи о том, как я могу заставить это работать? У нас есть 26 узлов, и нам нужно обрабатывать только около 400 запросов в секунду, используя этот механизм"

Вы должны быть более конкретны в отношении того, что вы пытаетесь достичь. Вопрос слишком абстрактный. Пожалуйста, опишите, откуда приходят сообщения, куда они должны быть доставлены, какую обработку (если есть) вам нужно выполнить посередине и т. Д.

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