2015-09-08 4 views
6

मैं एक स्क्रिप्ट लिख रहा हूं जो HTTP अनुरोध (टॉरनाडो का उपयोग करके) प्राप्त करता है, उन्हें पार्स करता है, और उन्हें पिका का उपयोग करके एक खरगोश एमक्यू ब्रोकर भेजता है।पिका कनेक्शन 3 दिल की धड़कन के बाद बंद

कोड इस तरह दिखता है:

def main(): 
    conn_params = pika.ConnectionParameters(
     host=BROKER_NAME, 
     port=BROKER_PORT, 
     ssl=True, 
     virtual_host=VIRTUAL_HOST, 
     credentials=pika.PlainCredentials(BROKER_USER, BROKER_PASS), 
     heartbeat_interval=HEARTBEAT_INTERVAL 
    ) 
    conn = pika.BlockingConnection(conn_params) 
    channel = conn.channel() 

    # Create the web server which handles application requests. 
    application = tornado.web.Application([ 
     (URL_BILLING, SomeHandler, dict(channel=channel)) 
    ]) 

    # Start the server 
    application.listen(LISTENING_PORT) 
    tornado.ioloop.IOLoop.instance().start() 

आप देख सकते हैं, मैं एक ही कनेक्शन और चैनल खुला, और हैंडलर जो बनाई गई है के किसी भी मामले को चैनल गुजरती हैं, विचार यातायात को बचाने के लिए किया जा रहा है और हर अनुरोध के लिए एक नया कनेक्शन/चैनल खोलने से बचें।

मुझे जो समस्या आ रही है वह यह है कि कनेक्शन 3 दिल की धड़कन के बाद बंद है। मैंने समस्या का पता लगाने के लिए वायरशर्क का उपयोग किया, लेकिन मैं देख सकता हूं कि सर्वर एक पीएसएच भेजता है (मुझे लगता है कि यह दिल की धड़कन है) और मेरी स्क्रिप्ट एक एसीके के साथ जवाब देती हैं। यह HEARTBEAT_INTERVAL के साथ 3 बार होता है, और फिर सर्वर केवल एक FIN भेजता है और कनेक्शन मर जाता है।

कोई विचार क्यों ऐसा होता है? साथ ही, क्या मुझे कनेक्शन खोलना चाहिए या क्या मुझे भेजने के लिए आवश्यक प्रत्येक संदेश के लिए नया बनाना बेहतर है?

सहायता के लिए धन्यवाद।

अद्यतन: मैं RabbitMQ लॉग में देखा, और यह कहते हैं: Missed heartbeats from client, timeout: 10s मैंने सोचा था कि सर्वर क्लाइंट के लिए दिल की धड़कन को भेजने के लिए चाहिए था, यकीन है कि यह उत्तर देता है बनाने के लिए, और इस मैं Wireshark का उपयोग कर क्या मनाया के साथ सहमत हैं , लेकिन इस लॉग से ऐसा लगता है कि यह क्लाइंट है जो सर्वर को रिपोर्ट करने के लिए है, न कि दूसरी तरफ, और क्लाइंट, जाहिर है, रिपोर्ट नहीं करता है। क्या मुझे यह सही समझ रहा है?

अद्यतन: इसे समझ लिया, तरह। एक अवरुद्ध कनेक्शन (जो मैंने उपयोग किया है) दिल की धड़कन भेजने में असमर्थ है क्योंकि यह अच्छी तरह से अवरुद्ध है। जैसा कि this issue में बताया गया है, heartbeat_interval पैरामीटर का उपयोग केवल सर्वर के साथ कनेक्शन को बातचीत करने के लिए किया जाता है, लेकिन क्लाइंट वास्तव में दिल की धड़कन नहीं भेजता है। चूंकि यह मामला है, पिका के साथ लंबे समय से चलने वाले कनेक्शन को रखने का सबसे अच्छा तरीका क्या है? यहां तक ​​कि अगर मैं हर 10 मिनट में एक दिल की धड़कन को heartbeat_interval, सर्वर डिफ़ॉल्ट रूप से निर्दिष्ट नहीं करते हैं, तो कनेक्शन 30 मिनट के बाद मर जाएगा ...

उत्तर

4

भविष्य आगंतुकों के लिए:

पिका एक async उदाहरण जो दिल की धड़कन का उपयोग करता है : http://pika.readthedocs.org/en/0.10.0/examples/asynchronous_publisher_example.html

तूफान विशिष्ट के लिए, इस उदाहरण से पता चलता पिका के async मॉडल में तूफान के IOLoop का उपयोग कैसे करें: http://pika.readthedocs.org/en/0.10.0/examples/tornado_consumer.html

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