我有一个相对高容量/请求系统,我们在其中使用 OSGi。我们每天收到近 8 亿个请求。
我们目前看到一些线程被阻塞的问题。对于传入的每个请求,我们使用 registerService 将事件/数据转发到 osgi 包,以将有效负载/数据传递给正在侦听此服务的 OSGi 包。
像这样: bundleContext.registerService(Map.class.getName(), dataHolderMap, null);
dataHolderMap 只不过是一个常规的 java hashmap
这是使用 JStack 的线程转储:
==================================================== ==========================
“RequestThread”prio=10 tid=0x00000000421ab800 nid=0x1042 可运行 [0x00007fbdd3867000] java.lang.Thread.State:在 org.apache.felix.framework.ServiceRegistry.getService 可运行(ServiceRegistry.java:295) - 锁定 <0x0000000700e2c590>( org.apache.felix.framework.ServiceRegistry) 在 org.apache.felix.framework.Felix.getService(Felix.java:3568) 在 org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468) 在org.osgi.util.tracker.ServiceTracker.addingService(ServiceTracker.java:411) 在 org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:932) 在 org.osgi.util.tracker.ServiceTracker$ org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java: 中的 Tracked.customizerAdding(ServiceTracker.java:864)256) 在 org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) 在 org.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(EventDispatcher .java:543) 在 org.apache.felix.framework.Felix.registerService(Felix.java:3423) 在 org.apache.felix.Felix.fireServiceEvent(Felix.java:4419)。 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.event.support.AbstractEventSource.fireSendEvent(AbstractEventSource.java:97) 在 com.mypackage.jetMyStream .event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113) 在 com.mypackage.jetMyStream.event.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.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java:40) 在 com。 mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)
“RequestThread”prio=10 tid=0x00000000425f8800 nid=0x1041 等待监视器条目 [0x00007fbdd3968000] java.lang.Thread.State: 在 org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java: 109) - 等待在 org.apache.felix.framework.Felix.registerService(Felix.java:3393) 在 org.apache.felix.framework.BundleContextImpl 处锁定 <0x0000000700e2c590> (一个 org.apache.felix.framework.ServiceRegistry) .registerService(BundleContextImpl.java:346) 在 org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:320) 在 com.mypackage.person.bs.processor.Processor.sendEvent(BullseyeModelProcessor.java:56) 在com.mypackage.jetMyStream.event.support.AbstractEventSource.fireSendEvent(AbstractEventSource.java:97) 在 com.mypackage.jetMyStream.event.channel.messaging.InboundMessagingChannel.fireEvent(InboundMessagingChannel.java:113) 在 com.mypackage.jetMyStream.event.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.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest .java:40)jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349) 在 com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) 在 com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java: 40)jetMyStream.messaging.MessageService.dispatchMessageForContext(MessageService.java:349) 在 com.mypackage.jetMyStream.messaging.MessageService.dispatch(MessageService.java:259) 在 com.mypackage.jetMyStream.messaging.MessageServiceRequest.execute(MessageServiceRequest.java: 40)
在 com.mypackage.jetMyStream.util.RequestThread.run(RequestThread.java:69)
关于这个的几个问题:
我在通过 registerService 发送地图时做错了什么吗?如果是这样,我的选择是什么?
关于如何让它发挥作用的任何想法?我们有 26 个节点,使用这种机制每秒只需要处理大约 400 个请求
有人有类似的问题吗?任何指针都非常感谢
谢谢马斯蒂