2015-10-04 6 views
13

हम Netty घटना पाश कतारों के लिए निगरानी को क्रियान्वित किया है के आकार की निगरानी करना। मॉनिटर io.netty.util.concurrent.SingleThreadEventExecutor#pendingTasks विधि का उपयोग करता है, जो अधिकांश मॉड्यूल के लिए काम करता है, लेकिन एक मॉड्यूल के लिए जो प्रति सेकंड कुछ हज़ार HTTP अनुरोधों को संभालता है, ऐसा लगता है कि यह लटका हुआ है, या बहुत धीमा है। अब मुझे एहसास है कि दस्तावेज़ सख्ती से यह एक मुद्दा हो सकते हैं, और मुझे बहुत लंगड़ा लगता है ... इसलिए मैं इस मॉनीटर को लागू करने के लिए एक और तरीका ढूंढ रहा हूं।ताकि हमारे Netty मॉड्यूल में से कुछ के साथ मुद्दों को समझने के लिए Netty घटना पाश कतारों

आप यहाँ पुराने कोड देख सकते हैं: https://github.com/outbrain/ob1k/blob/6364187b30cab5b79d64835131d9168c754f3c09/ob1k-core/src/main/java/com/outbrain/ob1k/common/metrics/NettyQueuesGaugeBuilder.java

public static void registerQueueGauges(final MetricFactory factory, final EventLoopGroup elg, final String componentName) { 

    int index = 0; 
    for (final EventExecutor eventExecutor : elg) { 
     if (eventExecutor instanceof SingleThreadEventExecutor) { 
     final SingleThreadEventExecutor singleExecutor = (SingleThreadEventExecutor) eventExecutor; 
     factory.registerGauge("EventLoopGroup-" + componentName, "EventLoop-" + index, new Gauge<Integer>() { 
      @Override 
      public Integer getValue() { 
      return singleExecutor.pendingTasks(); 
      } 
     }); 

     index++; 
     } 
    } 
    } 

मेरा प्रश्न, है वहाँ कतार आकार पर नजर रखने के लिए एक बेहतर तरीका है?

यह काफी उपयोगी मीट्रिक साबित हो सकता है क्योंकि यह विलंबता को समझने के लिए इस्तेमाल किया जा सकता है, और भी कुछ मामलों में पीछे से दबाव लागू करने के लिए इस्तेमाल किया जाएगा।

उत्तर

1

आप शायद के रूप में जोड़ा गया है और SingleThreadEventExecutor उदाहरणों से हटा कार्यों के रूप में परिवर्तनों को ट्रैक करने की जरूरत होगी।

है कि आप एक वर्ग है कि लपेटता है और/या SingleThreadEventExecutor फैली बना सकते हैं ऐसा करने के लिए। फिर आपके पास java.util.concurrent.atomic.AtomicInteger होगा कि हर बार जब कोई नया कार्य जोड़ा जाता है और decrementAndGet() हर बार हटा दिया जाता है/समाप्त होता है तो आप incrementAndGet() पर कॉल करेंगे।

कि परमाणु इंटेगर आपको लंबित कार्यों की वर्तमान संख्या देगा। इसके बजाय आप उस मान का उपयोग करने के लिए pendingTasks() ओवरराइड कर सकते हैं (हालांकि वहां सावधान रहें - मैं 100% नहीं हूं जिसके दुष्प्रभाव नहीं होंगे)।

यह हर कार्य निष्पादित किया जा रहा करने के लिए भूमि के ऊपर का एक सा जोड़ना होगा, लेकिन स्थिर गति के पास लंबित कार्य की संख्या को पुन: प्राप्त होगा।

इस के नकारात्मक पक्ष यह है कि यह पाठ्यक्रम आप इस समय क्या कर रहे हैं की तुलना में अधिक आक्रामक है, के रूप में आप अलग अलग घटना निष्पादकों उपयोग करने के लिए अपने अनुप्रयोग विन्यस्त करने की जरूरत होगी की है।

एनबी। यह इस मुद्दे के आसपास काम करने के बारे में सिर्फ एक सुझाव है - मैंने विशेष रूप से नेटटी के साथ ऐसा नहीं किया है। हालांकि मैंने अतीत में अन्य कोड के साथ इस तरह की चीज की है।

+0

मुझे आंतरिक विवरणों पर भरोसा करने का विचार पसंद नहीं है। मुझे लगता है कि मैं घटना लूप थ्रेड के भीतर से कतार आकार की जांच करने के लिए समय-समय पर कार्य को शेड्यूल करना चाहता हूं। सटीक नहीं, लेकिन निगरानी के लिए ठीक है। –

संबंधित मुद्दे