KISS + रूबी = लोड सर्वर त्वरित

मैं यहाँ वर्णन करूँगा कि मेरे घुटनों पर किस तरह से मैंने सेवा का "लोड" परीक्षण किया था, और रूबी के बारे में कुछ विचार;)

एक बार एक बड़ी व्यवस्था थी, यह पहला वर्ष नहीं था, यह पहली रिलीज नहीं थी।
सिस्टम एक केंद्रीय सर्वर है जिसके माध्यम से जानकारी चलती है और इस जानकारी को उत्पन्न करने और उपभोग करने वाले डेस्कटॉप अनुप्रयोगों का एक सेट है, ताकि गेटवे और गंतव्य कह सकें।

एक बार सर्वर के साथ एक दुर्भाग्य हुआ, दोष को स्थानीय करने के लिए सर्वर को लोड करना आवश्यक था - एक साथ सक्रिय ग्राहकों के बहुत से काम का अनुकरण करने के लिए।



ग्राहक विंडोज कम्युनिकेशन फाउंडेशन उर्फ ​​डब्ल्यूसीएफ के माध्यम से सर्वर के साथ संवाद करते हैं।

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

वास्तव में यह एक लम्बा-चौड़ा परिचय है, आइए विवरण पर चलते हैं।
6,000 कामकाजी ग्राहकों का भार उठाना आवश्यक था।
उनमें से प्रत्येक प्रत्येक 10 सेकंड में एक बार सक्रिय होता है।
प्रत्येक का अपना उपयोगकर्ता नाम / पासवर्ड है।

एक एमुलेटर 250 थ्रेड / क्लाइंट को शुरू करने में सक्षम था। कुल मिलाकर, इसे चलाने के लिए एमुलेटर की 24 प्रतियों की जरूरत मशीनों के एक गुच्छा (शक्ति के आधार पर, प्रति मशीन 1 से 4 टुकड़ों तक) पर होती थी।
हालांकि, पुरुषों ने कहा, लेकिन यह आवश्यक होना चाहिए, उन्होंने इसे लॉन्च किया, और उन्होंने इस पर पहला चरण बंद कर दिया, सिद्धांत की पुष्टि की और दुर्लभता के लिए स्थिति को स्थगित कर दिया।

फिर, थोड़ी देर के बाद, एक लोड की आवश्यकता फिर से पैदा हुई, और जो व्यक्ति इसे शुरू करता है वह अनुपस्थित था, वे आकर्षित हुए, लेकिन क्योंकि यह शुक्रवार की रात थी, आदि, सोमवार तक स्थगित करने का फैसला किया।

वास्तव में, मैं एक डेवलपर नहीं हूं - मैं एक परीक्षक / क्यूए हूं, लेकिन विभिन्न अजीब पृष्ठभूमि के साथ।

मैंने यह देखने के लिए घर पर फैसला किया कि क्या इस मामले को सरल करना संभव है, क्या "अधिक अन्य" तरीकों का भार पैदा करना संभव है।

मैंने एमुलेटर लिया, फिडलर 2 लिया (फिडलर एक वेब डिबगिंग प्रॉक्सी है जो आपके कंप्यूटर और इंटरनेट के बीच सभी HTTP (एस) ट्रैफिक को लॉग करता है), और जो किया जा रहा था, उसे देखा।

मैंने वहाँ एक्सएमएल देखा जो दोनों दिशाओं में चलता है, और जादू शब्द एसओएपी।

ओह, मैंने कहा, आखिरकार उसे बेहतर तरीके से जानने का एक अच्छा कारण है।

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

मैंने एक पुस्तकालय के लिए उपयुक्त देखा, साबुन 4r पाया, सैवोन, उत्तरार्द्ध को चुना, क्योंकि हल्का लग रहा था। रखो, खेल शुरू हुए।

आश्चर्यजनक रूप से जल्दी से पहला काम कोड मिला, कार्य एक अनुरोध प्राप्त करना था जो मूल एमुलेटर से एक अनुरोध की तरह दिखता है।
  1. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  2. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  3. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  4. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  5. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  6. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  7. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  8. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  9. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  10. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  11. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  12. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  13. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  14. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  15. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  16. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  17. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  18. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  19. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  20. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  21. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  22. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  23. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  24. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  25. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  26. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  27. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  28. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end
  29. def data_available ( client,id,password ) _xml= % Q |< ?xml version= "1.0" encoding= "utf-8" ? > < soap:Envelope xmlns:soap= "http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" > < soap:Body > < DataAvailable xmlns= "Company.ESD" > < ID > #{id}</deviceID> < Password > #{password}</Password> </ DataAvailable > </ soap:Body > </ soap:Envelope > | _xml. gsub! ( / \r | \n / , "" ) response = client. request "Company.ESD/Data/DataAvailable" , "xmlns" => "Company.ESD" do soap. xml =_xml end response end def do_test ( id,pwd ) client = Savon::Client . new do wsdl. endpoint = "https://superserver.super.com/DDService/Data.svc" wsdl. namespace = "https://superserver.super.com" http. read_timeout = 90 http. open_timeout = 90 end r=data_available ( client,id,pwd ) . to_hash end


यानी एक ग्राहक है, ठीक है, ग्राहकों के बहुत सारे दस्तावेज बनाने का समय है, हम एक उदाहरण ढूंढते हैं, आवेदन करते हैं
run_client - एक "क्लाइंट" का कोड

  1. def run_test ( clnt_id )
  2. pwd = get_pwd ( clnt_id )
  3. id = get_id ( clnt_id )
  4. जबकि सच है
  5. do_test ( id, pwd )
  6. सो जाओ
  7. अंत
  8. अंत
  9. ग्राहक = सरणीनई
  10. 1. तक ( 10 ) करना | client_id |
  11. ग्राहक << धागानया करते हैं
  12. "प्रारंभ: # {client_id}"
  13. run_client ( t_cnt )
  14. अंत
  15. अंत
  16. ग्राहकों। नक्शा { | टी | टी। शामिल हों }


लॉन्च - URA, यह काम करता है।
आइए स्क्रीन लॉन्च पर 1000, ऑप्स की कोशिश करें ~ 130 धागे और ब्रेक ;;
ऐसा लगता है कि रूबी वास्तव में बहुत सारे धागे की अनुमति नहीं देना चाहती है,
खैर, सामान्य तौर पर, यह एक सवाल नहीं है, परिणाम हमारे लिए महत्वपूर्ण है।
एक फ़ाइल में 100 टुकड़े रखे हैं, और 10 ऐसी फाइलें होंगी, इसलिए हमारे पास 1000 ग्राहक हैं।
कोशिश करो - चीयर्स काम !!!, लेकिन हम प्रतिशत को धीरे से कहेंगे कि कोई पेंडेंट नहीं कहता है, हम सोचने लगते हैं कि क्या करना है, हमें और अधिक की आवश्यकता है!

यहाँ हम याद करते हैं कि ग्राहक हर 10 सेकंड में एक बार सक्रिय होता है
यानी हम एक धागा चला सकते हैं जो आसानी से 10 लगातार ग्राहकों को संसाधित कर सकता है, प्रत्येक को एक दूसरे के लिए, परिणामों में और प्रत्येक ग्राहक को हर 10 सेकंड में गतिविधि मिल सकती है।
चीयर्स, धागे की संख्या को 10 गुना कम करना संभव था, पहले से ही प्रसन्न है, अर्थात। 1000 ग्राहकों को केवल 100 धागे चाहिए, लेकिन यह पहले से ही वास्तविक है ...

ऐसा लॉन्चर मिला
  1. def do_for_time ( time_in_sec, और ब्लॉक )
  2. time_end = समयअब + time_in_sec - 0.01
  3. उपज
  4. time_rest = time_end - समयअब
  5. sleep time_rest if time_rest > = 0.1
  6. अंत
  7. def run_10 ( start_id )
  8. क्लीनिक = ऐरेनई
  9. 1. तक ( 10 ) करना | nn |
  10. id = get_id [ start_id + nn ]
  11. pwd = get_pwd [ start_id + nn ]
  12. क्लीनिक << [ आईडी, pwd ]
  13. अंत
  14. clnt = HTTPClient। नई
  15. जबकि सच है
  16. clinets। प्रत्येक करते हैं | ग्राहक |
  17. आईडी = ग्राहक [को ]
  18. pwd = ग्राहक [ 1 ]
  19. do_for_time ( 1 ) करना
  20. data_available ( क्लेंट, आईडी, pwd )
  21. update_status ( क्लिंट, आईडी, pwd )
  22. अंत
  23. अंत
  24. अंत
  25. अंत


वैसे, मज़ा समारोह do_for_time (ओह, मैं रूबल में ब्लॉक प्यार करता हूँ!)
हम इसे पैरामीटर के साथ कहते हैं कि इसे कितने सेकंड में निष्पादित किया जाना चाहिए, और इसे ब्लॉक करें जिसे निष्पादित करने की आवश्यकता है, और ब्लॉक निष्पादन के साथ, यह उतने सेकंड के लिए काम करेगा जितना कि यह पूछा जाता है (हम मानते हैं कि ब्लॉक में फ़ंक्शन कॉल प्रतीक्षा समय की तुलना में बहुत कम है)
, लेकिन प्रतिशत अभी भी लोड हो रहा है, इसके साथ कुछ करने की जरूरत है।

मैंने मूल अनुरोधों को फिर से देखा और महसूस किया, इसलिए हमें SOAP की आवश्यकता क्यों है?
यह सब के बाद, पहले से ज्ञात XML के साथ एक पोस्ट अनुरोध के अलावा और कुछ नहीं है!

कहा - किया, हमारे कार्यों को फिर से लिखा, SOAP फेंक दिया, मिला
  1. def check_data ( http_client, id, pwd )
  2. uri = 'https://superserver.super.com/DDService/Data.svc'
  3. साबुन = % Q | < ? xml संस्करण = "1.0" एन्कोडिंग = "utf-8" ? > < साबुन: लिफाफा xmlns: साबुन = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance : xmld = "http://www.w3.org/2001/XMLSchema" > < साबुन: शरीर > < DataAvailable xmlns = "company.ESD" > < ID > # {आईडी} </ ID> <पासवर्ड> # {pwd "< / पासवर्ड> </ DataAvailable> </ साबुन: शरीर> </ साबुन: लिफाफा>
  4. |
  5. हेडर = {
  6. 'सामग्री-प्रकार' => 'पाठ / xml; चारसेट = UTF-8' ,
  7. 'SOAPAction' => company.EDC / IData / ' ,
  8. }
  9. http_client। उरई, साबुन, हेडर
  10. अंत


उम्मीद है, नया संस्करण एक प्रतिशत से भी कम खा गया, क्योंकि अनावश्यक मूर्खताओं में नहीं लगे।

3000 ग्राहक काफी आसानी से रहते हैं ...

यहाँ मैंने घर का खेल बंद कर दिया, क्योंकि एक असममित ADSL चैनल में भाग गया, और फिर आपको आराम करने की आवश्यकता है;)

सोमवार को काम पर जारी रखा, तेजी से चैनल पर।
और फिर चमत्कार शुरू होते हैं, उदास
स्क्रब रूबी 1.8.7 1000 ग्राहकों के साथ 2 परमाणु सीपीयू का 100% खाती है, बकवास ...

एक आभासी मशीन में जांच करने के लिए (उसी मशीन पर) मैंने उबंटू डाल दिया, उसे दो कोर दिए, और एक ही चीज़ दी, और ...
सामान्य चमत्कारों में, लिनुखा के तहत VIRTUALK में हमारे 5000 ग्राहक हैं।

आगे के प्रयोग:
जूबी स्टेक द्वारा, उसके पास विवरण के अनुसार सही धागे हैं, चलो 1000 - लोड का 20% - यूआरए
हम 1000 और एक गंदगी के साथ दूसरी फ़ाइल लॉन्च करते हैं, 80% की 2x कोर लोड करते हैं, सहिष्णु, लेकिन बहुत स्पष्ट नहीं (;

नतीजतन, कार द्वारा 2000 हमारे कार्य के लिए उपयुक्त था (रिमोट कार पर शुरू करना आवश्यक था, वहां वर्चुअल मशीन लगाना असंभव था)
समस्या हल हो गई थी, सर्वर लोड हो गया था।
SOAP के साथ खेला, मजाकिया, बहुत मुश्किल नहीं।
समय बिताया, संचयी रूप से 8 घंटे।

निष्कर्ष:
9. "इसे सरल रखें, बेवकूफ!" - हमारे मामले में, सरलीकरण ने समस्या को हल करने में मदद की, जटिल SOAP से दूर बस http अनुरोधों ने स्थिति को बचाया।
2. इस तरह के कार्यों के लिए आरयूबीवाई का उपयोग किया जा सकता है, मुझे भाषा से लड़ने की ज़रूरत नहीं थी, इसने मुझे केवल वह करने की अनुमति दी जो मैं चाहता था;) (लगभग समस्या पैदा किए बिना)
3. स्क्रिप्टिंग भाषा का उपयोग करना - समस्या के साथ पार्सिंग समय को बहुत तेज करता है, क्योंकि यह प्रयोग करना आसान बनाता है, यह त्वरित और आसान है।
4. मल्टीप्लेट रिकॉर्डर - ड्राइव
5. अब, यदि आवश्यक हो, तो आप इसे C # में फिर से लिख सकते हैं, हो सकता है कि एक ही मशीन पर कई ग्राहक होंगे, लेकिन अभी इसकी आवश्यकता नहीं है, कार्य एक बार में बदल गया।
6. मुझे माणिक बहुत पसंद है!
______________________
पाठ को Blog Editor में © SoftCoder.ru द्वारा तैयार किया गया है

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


All Articles