2011-05-27 18 views
6

में एकाधिक सर्वर एक एकल ईवेंट मशीन के भीतर एकाधिक सर्वर चलाने के लिए संभव है?एक एकल इवेंटमैचिन रिएक्टर

मेरा मतलब यह है कि एकाधिक सेवाओं का उपयोग एक ग्राहक कनेक्शन द्वारा समवर्ती रूप से किया जा सकता है। उदाहरण के लिए, एक लॉगिन सर्वर उपयोगकर्ता को प्रमाणित करता है और फिर कोई उपयोगकर्ता एक चैट रूम और एक साधारण गेम जैसे कि एक क्लाइंट सॉकेट के साथ चेकर्स समवर्ती रूप से उपयोग कर सकता है?

या क्या मुझे प्रत्येक सेवा के लिए एकाधिक ईवेंटमाचिन रिएक्टरों की आवश्यकता है?

+0

मैं अगर प्रोटोकॉल स्पष्ट है कि आप एक सर्वर प्रक्रिया के भीतर विभिन्न सेवाओं के हजारों को चलाने के लिए सक्षम होना चाहिए उम्मीद थी। – sarnold

उत्तर

7

मैं इस कोशिश की और यह काम कर रहा:

#!/usr/bin/env ruby 

require 'eventmachine' 

module EchoServer 
    def post_init 
    puts "-- someone connected to the echo server!" 
    end 
    def receive_data data 
    send_data ">>>you sent: #{data}" 
    close_connection if data =~ /quit/i 
    end 
    def unbind 
    puts "-- someone disconnected from the echo server!" 
    end 
end 

EventMachine::run { 
    EventMachine::start_server "127.0.0.1", 8081, EchoServer 
    EventMachine::start_server "127.0.0.1", 8082, EchoServer 
    EventMachine::start_server "127.0.0.1", 8083, EchoServer 
} 

यहाँ आप विभिन्न बंदरगाहों के साथ 3 गूंज सेवाओं मिलता है। (मैं विभिन्न सेवाओं को लागू करने के लिए बहुत आलसी था।)

तो, एक विशाल बहु सेवा रैपर बनाने में बहुत आसान है।


अद्यतन

सरल कोड एक ईएम सर्वर की हालत आधारित शुरू करने के लिए उदाहरण:

#!/usr/bin/env ruby 
# encoding: utf-8 

require 'eventmachine' 

module EchoServer 
    def post_init 
    puts "-- someone connected to the echo server!" 
    end 
    def receive_data data 
    send_data ">>>you sent: #{data}" 
    close_connection if data =~ /quit/i 
    end 
    def unbind 
    puts "-- someone disconnected from the echo server!" 
    end 
end 

$check_ok = false 

EventMachine::run { 
    puts "checker var is: #{$check_ok}" 
    EventMachine::start_server "127.0.0.1", 8081, EchoServer 
    EventMachine::start_server "127.0.0.1", 8082, EchoServer 
    puts "echos on 8081 and 8082 started." 

    # periodic timer check - every 1 sec 
    EventMachine.add_periodic_timer(1) { 
    if $check_ok 
     EventMachine::start_server "127.0.0.1", 8083, EchoServer 
     $check_ok = false 
     puts "echo on 8083 started!" 
    end 
    } 
    # timer triggered after 10 secs - only once! 
    EventMachine.add_timer(10) { 
    $check_ok = true 
    puts "checker var is #{$check_ok} now!" 
    } 
} 

इस उदाहरण पोर्ट 8083 पर गूंज सर्वर शुरू कर दिया गया है ~ एप्लिकेशन शुरू होने के बाद 10 सेकेंड । इस टाइमर से पहले और उसके बाद telnet localhost 8083 पर आज़माएं, आपको प्रभाव दिखाई देगा।

आप प्रत्येक 1/100 वें सेकंड चेक के लिए 1 से कम 001 के मानों का भी उपयोग कर सकते हैं।

यह आपके अपने विचारों के लिए आपका प्रारंभिक बिंदु हो सकता है। आवधिक टाइमर आपका आंतरिक पाश है, जहां आप आगे की सेवाओं को शुरू करने के लिए अपने सशर्त चेक में हुक करते हैं।


अच्छा ट्यूटोरियल (पीडीएफ): eventmachine introduction (blog post)

+0

धन्यवाद, इसलिए मेरे लिए यह तात्पर्य है कि यदि आवश्यक हो तो आप रनटाइम के दौरान अधिक सर्वर नहीं जोड़ सकते हैं। क्या वो सही है? – david

+0

यह नहीं कहेंगे कि यह असंभव है। आप एक लूप को कार्यान्वित कर सकते हैं जहां आप रनटाइम में सेवाओं को जोड़ने देते हैं - लेकिन इसे Eventmachine में गहराई से देखने की आवश्यकता है। यदि कोई निश्चित शर्त पूरी हो जाती है और उसे एक नया ईएम-सर्वर शुरू करना है, तो अभी भी परीक्षण नहीं किया गया है, लेकिन इस मामले में सहायक प्रत्येक x सेकंड की जांच करने के लिए 'EM.add_periodic_timer' हो सकता है। – asaaki

+0

अद्यतन उत्तर में एक नज़र डालें, वहां आपको सेवाओं के रनटाइम शुरू होने का पहला विचार मिलता है। – asaaki

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