पेश है गोलियत

हम लेखों की श्रृंखला जारी रखते हैं जिसमें हम पाठकों को विभिन्न वेब फ्रेमवर्क से परिचित कराते हैं। और आज, मुझे Goliath (Goliath, http://postrank-labs.github.com/goliath/ ) परिचय दें, जो कि अब Google द्वारा अधिग्रहीत PostRank ( http://postrank.com/ ) द्वारा निर्मित एक अतुल्यकालिक रूबी वेब फ्रेमवर्क है।

Goliath की मुख्य विशेषता EventMachine लाइब्रेरी के साथ-साथ फाइबर (तंतुओं) के तंत्र के माध्यम से इनपुट-आउटपुट के लिए इवेंट मॉडल का उपयोग है, जो रूबी 1.9 में दिखाई दिया। इसे आज के फैशनेबल Node.js का एक एनालॉग माना जा सकता है, केवल रूबी में।

लेख में हम ऐसे सवालों पर विचार करेंगे:अंत में, आप पारंपरिक प्रदर्शन परीक्षण पाएंगे।

तंतु और घटनाएँ



फाइबर एक प्रकार का निष्पादन संदर्भ है जो तार्किक रूप से एक धागे के समान है, लेकिन यह एक धागा नहीं है। थ्रेड्स का उपयोग कार्यों को समानांतर करने के लिए किया जाता है, जबकि फाइबर अतुल्यकालिक I / O के लिए अधिक उपयुक्त होते हैं। वास्तव में, एक फाइबर एक उन्नत गोटो है जो एक थ्रेड के समान एक अमूर्त आवरण में लिपटा होता है, केवल फाइबर वास्तव में एक ही भौतिक धागे में चलते हैं। यदि वर्तमान थ्रेड निष्पादन में स्वयं को बाधित किया गया है और ऑपरेटिंग सिस्टम की इच्छा से कोड के एक मनमाने स्थान पर है, तो फाइबर के मामले में, डेवलपर प्रोग्राम कोड के किसी अन्य अनुभाग पर नियंत्रण कब और कहां स्थानांतरित करना चाहता है।

रूबी में फाइबर फाइबर वर्ग और इसके नए, उपज और फिर से शुरू करने के तरीकों के माध्यम से कार्यान्वित किए जाते हैं। एक फाइबर कोड के एक ब्लॉक के रूप में बनाया जाता है जिसे थ्रेड के समान निष्पादित किया जा सकता है, लेकिन तुरंत शुरू नहीं होता है। फिर कुछ फाइबर के लिए फिर से शुरू कॉल ब्लॉक के अंदर नियंत्रण स्थानांतरित कर देगा। फाइबर में कोड का एक ब्लॉक निष्पादित करेगा जब तक कि यह समाप्त नहीं होता है या उपज कॉल पूरा नहीं होता है। उपज कॉल का अर्थ है इस स्थान पर कोड को रोकना, राज्य को याद रखना और फिर से शुरू होने वाले मुख्य कोड को आगे बढ़ाना। आमतौर पर सभी तंतुओं के लिए एक सामान्य ईवेंट लूप होता है, जहां हर बार तंतुओं के खत्म होने या उसके कार्य को रोक देने पर नियंत्रण स्थानांतरित हो जाता है - ईवेंट लूप। लूप में, प्रोग्राम किसी भी ईवेंट की घटना का इंतजार करता है और क्रमशः उन तंतुओं के लिए फिर से शुरू करता है, जिन्हें ये ईवेंट अपेक्षित थे।

इस दृष्टिकोण के नियमित धागों पर कई फायदे हैं:

हालांकि, यह सीमाओं को याद रखने लायक है:
यहाँ एक त्वरित उदाहरण है कि फाइबर कैसे काम करते हैं:

require 'fiber' # Fiber.new     , #      ,    resume. my_fiber = Fiber.new do puts 'fiber> started' Fiber.yield #   ,   . puts 'fiber> resumed' end puts 'main> let\'s start our fiber:' my_fiber.resume puts 'main> we\'re back in the main flow. Let\'s resume the fiber again:' my_fiber.resume puts 'main> end.' 


संस्करण 1.9 के बाद से रूबी में फाइबर का समर्थन किया जाता है। आप इल्लिया ग्रिगोरिक के ब्लॉग में फाइबर और EventMachine लाइब्रेरी के बारे में अधिक पढ़ सकते हैं - गोलियत और अन्य दिलचस्प पुस्तकालयों के लेखक।

काम का माहौल तय करना



मैं फिर से वर्णन नहीं करूंगा कि हेलिकॉन चिड़ियाघर को कैसे स्थापित किया जाए, यह उत्पाद होम पेज http: //www.helicontech.zn/ पर पर्याप्त विवरण में वर्णित है

गोलियत को स्थापित करने के लिए, वेब प्लेटफ़ॉर्म इंस्टॉलर लॉन्च करें, चिड़ियाघर का चयन करें -> इंजन -> गोलियत। जब आप गोलियत को स्थापित करते हैं, तो रूबी 1.9.3 स्वचालित रूप से स्थापित हो जाएगा यदि यह पहले से ही सिस्टम पर नहीं है। यह वर्तमान में सबसे उपयुक्त संस्करण है। गोलियत JRuby का समर्थन करता है, लेकिन चूंकि फाइबर को धाराओं के माध्यम से लागू किया जाता है, इसलिए गति Rubar 1.9 की तुलना में बहुत कम है। ध्यान दें कि JRuby टीम निकट भविष्य में फाइबर समर्थन में सुधार करने की योजना बना रही है।

पिछले लेख में, मैंने दिखाया कि वेबमैट्रिक्स और आईआईएस एक्सप्रेस का उपयोग करके एक नया एप्लिकेशन कैसे बनाया जाए। इस बार मैं दिखाऊंगा कि सिस्टम में WebMatrix और IIS एक्सप्रेस को स्थापित किए बिना सीधे IIS प्रबंधक से कैसे करें। इस लिंक का अनुसरण करें और अपने Goliath प्रोजेक्ट के लिए ज़िप फ़ाइल डाउनलोड करें। अब IIS प्रबंधक शुरू करें, एक नई वेबसाइट बनाएं और टैब पर डेपोली -> आयात एप्लिकेशन चुनें। फिर डाउनलोड की गई फ़ाइल ढूंढें और विज़ार्ड के निर्देशों का पालन करें।



ठीक है, ताकि जो हो रहा है वह जादू नहीं लगता है, यह जोड़ना योग्य है कि गोलियत परियोजना बहुत सरल है। इसमें कोई फ़ोल्डर और अधिकार नहीं हैं, कोई परिनियोजित स्क्रिप्ट नहीं है। एप्लिकेशन फ़ोल्डर में केवल दो फाइलें बनाई जाती हैं - app.rb और web.config। यहाँ टिप्पणियों के साथ web.config की सामग्री है। आप बस किसी भी आईआईएस एप्लिकेशन में ऐसी फाइल बना सकते हैं और वहां काम कर रहे गोलियाथ एप्लिकेशन प्राप्त कर सकते हैं।

 <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <heliconZoo> <!--      --> <application name="goliath.project" > <environmentVariables> <!--      --> <add name="APP_WORKER" value="app.rb" /> <!-- Deploy-,      .. --> <add name="DEPLOY_FILE" value="deploy.rb" /> <!--     deploy- --> <add name="DEPLOY_LOG" value="log\zoo-deploy.log" /> <!--    --> <add name="RACK_ENV" value="development" /> </environmentVariables> </application> </heliconZoo> <handlers> <add name="goliath.project#x86" scriptProcessor="goliath.http" path="*" verb="*" modules="HeliconZoo_x86" preCondition="bitness32" resourceType="Unspecified" requireAccess="Script" /> <add name="goliath.project#x64" scriptProcessor="goliath.http" path="*" verb="*" modules="HeliconZoo_x64" preCondition="bitness64" resourceType="Unspecified" requireAccess="Script" /> </handlers> <!-- Rewrite       --> <!--       /public/   --> <!--   IIS   --> <rewrite> <rules> <rule name="Avoid Static Files" stopProcessing="true"> <match url="^(?!public)(.*)$" ignoreCase="false" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="true"> <add input="{APPL_PHYSICAL_PATH}" pattern="(.*)" ignoreCase="false" /> <add input="{C:1}public\{R:1}" matchType="IsFile" /> </conditions> <action type="Rewrite" url="public/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration> 


हम पहला आवेदन लिख रहे हैं



गोलियत और आईआईएस का उपयोग करके लंबे समय तक मतदान को लागू करने की संभावना को प्रदर्शित करने के लिए, हम एक सरल चैट लिखेंगे। इसमें दो भाग होंगे: सर्वर-साइड (रूबी, गोलियत) और क्लाइंट-साइड (जावास्क्रिप्ट)। कोड को संपादित करने के लिए आपको एक संपादक या विकास परिवेश की आवश्यकता होती है। हमने Aptana ( http://aptana.org ) का उपयोग किया:



सर्वर साइड - app.rb फ़ाइल:

 require 'rubygems' require 'goliath' require 'cgi' class Chat < Goliath::API use Goliath::Rack::Params #   json use Goliath::Rack::Render, 'json' #   callbacks def callbacks @@callbacks ||= [] end #     def response( env ) case env[ 'PATH_INFO' ] when '/' #  index.html [200, {'Content-Type' => 'text/html; charset=utf-8'}, File.read( 'index.html' ) ] when '/send' on_send( env.params ) when '/recv' on_recv end end #         . def on_send( params ) #    .       , #   on_recv. until callbacks.empty? do callbacks.shift.call({ nickname: CGI.escapeHTML( params[ 'nickname' ] || 'Anonymous' ), text: CGI.escapeHTML( params[ 'text' ] || '' ), color: CGI.escapeHTML( params[ 'color' ] || '' ) }) end [200, {}, {status: 'ok'}] end #   long-polling.      ,    ,   . def on_recv #        ,    #         . #  req_fiber    . req_fiber = Fiber.current callbacks.push(proc {|message| req_fiber.resume( message ) }) #   . #   resume         . response = Fiber.yield( nil ) [200, {}, response] end end 


ग्राहक पक्ष, index.html:

 <!DOCTYPE html> <html> <head> <title>Goliath + Helicon Zoo chat</title> <style type="text/css"> body { font-family: Sans-Serif; font-size: 13pt; padding: 0 6px; } h1 { font-family: "Trebuchet MS", Sans-Serif; font-size: 1.5em; color: #FF9933; } #messages { list-style: none; margin-top: 20px; } </style> </head> <body> <h1>Goliath + Helicon Zoo chat</h1> <form action="/send" method="post" id="send"> <label for="nickname">Nickname:</label> <input name="nickname" size="10" id="nickname" /> <label for="text">Message:</label> <input name="text" size="40" id="text" /> <input type="submit" value="Send" /> </form> <li id="messages"></li> </body> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> //   Submit     function on_send( evt ) { evt.preventDefault(); var arr = $(this).serializeArray(); var message = { nickname : arr[ 0 ].value, text : arr[ 1 ].value, color: window.ClientColor }; $.post( '/send', message, function( data ) { $('#text').val( '' ).focus(); }, 'json' ); } //      function long_polling( message ) { if ( message ) { var $li = $( '<li><b style="color: ' + message.color + ';">' + message.nickname + ':</b> <span>' + message.text + '</span>' ); $li.hide().appendTo('#messages').slideDown(); } //  ,   $.ajax({ cache: false, type: 'GET', url: '/recv', success: long_polling }); } //     $(document).ready(function(){ window.ClientColor = '#' + Math.floor( Math.random() * 16777215 ).toString( 16 ); $('form#send').submit( on_send ); long_polling(); $('#nickname').focus(); }); </script> </html> 


On_recv पद्धति पर ध्यान दें। हम वर्तमान फाइबर प्राप्त करते हैं और इसे लंबित हैंडलर की सरणी में जोड़ते हैं। अधिक सटीक रूप से, हमने वहां चॉप प्रक्रिया को रखा, जिसमें फिर से शुरू करने की विधि को कहा जाता है, जो फाइबर पर नियंत्रण स्थानांतरित करता है। Req_fiber वैरिएबल, यद्यपि स्थानीय, प्रक्रिया के संदर्भ में "बंद" लगता है। अगला, हम तुरंत फाइबर को रोकते हैं। जब कोई संदेश आता है, तो सभी प्रक्रियाओं को क्रमिक रूप से कहा जाएगा और सरणी से हटा दिया जाएगा।

आइए जाने क्या हुआ:



प्रदर्शन परीक्षण



एक सर्वर के रूप में परीक्षण मशीन कोर 2 क्वाड 2.4 Ghz, 8 जीबी रैम, एक गीगाबिट नेटवर्क है। लोड उत्पन्न करने के लिए, एक अधिक शक्तिशाली कंप्यूटर और अपाचे बेंचमार्क का उपयोग "ab.exe -n 100000 -c 100-एच" कमांड के साथ किया गया था। ऑपरेटिंग सिस्टम - Ubuntu 11.04 सर्वर x64 और विंडोज सर्वर 2008 R2। कोई virtualoks - ईमानदार लोहा।

तीन परीक्षण किए गए। पहले गोलियत में, आवेदन केवल पृष्ठ पर उच्च रिज़ॉल्यूशन के साथ वर्तमान समय प्रदर्शित करने के लिए था। यह सुनिश्चित करने के लिए समय की आवश्यकता है कि उत्तर कैश से न आएं। दूसरा परीक्षण MySQL डेटाबेस से पढ़ा जाता है, तीसरा डेटाबेस पर लिखता है।

परीक्षणों के लिए हमने रूबी 1.9.3, गोलियत 0.9.4 और MySQL 5.1.54 का उपयोग किया। IIS, Apache और Nginx के सभी विन्यास HTTP प्रॉक्सी का उपयोग करते हैं, जैसा कि Goliath अपने आप में एक HTTP सर्वर है।

यहाँ परिणाम हैं (रेखांकन पर मूल्य प्रति सेकंड अनुरोध है):



और पहले परीक्षण के लिए अधिक विस्तृत ab रेखांकन:







निष्कर्ष



गोलियत एक हल्का सरल और सुविधाजनक ढांचा है। यह विभिन्न एपीआई और अतुल्यकालिक कोड लिखने में विशेष रूप से अच्छा है। समाधान का बार-बार औद्योगिक वातावरण में परीक्षण किया गया है और यह एक अच्छी गति दिखाता है। और सबसे महत्वपूर्ण बात, यह आपको अनुप्रयोगों के विकास के दौरान विशाल रूबी पारिस्थितिकी तंत्र का उपयोग करने की अनुमति देता है।

Source: https://habr.com/ru/post/In137060/


All Articles