KISS + Ruby =サーバーを高速でロードする

ここでは、ひざまずいてサービスの「負荷」テストを行った経緯と、Rubyに関するいくつかの考慮事項について説明します。



昔々、1つの大きなシステムがありましたが、それは最初の年ではなく、最初のリリースでもありませんでした。

このシステムは、情報を実行する中央サーバーであり、この情報を生成および消費するデスクトップアプリケーションのセットです。つまり、ゲートウェイと宛先です。



サーバーで不幸が発生した場合、欠陥をローカライズするには、サーバーをロードする必要がありました-同時にアクティブなクライアントの多くの作業をシミュレートするため。







クライアントは、Windows Communication Foundation(別名WCF)を介してサーバーと通信します。



クライアントを備えた深刻なシステムの場合と同様に、エミュレーターが利用可能であり、GUIを使用してすべてのメソッドをプルし、回答を見ることができました。

エミュレータには、実際のクライアント(適切なメソッドを適切な順序で並べる)のように、ライブクライアントのふりをすることができ、マルチスレッドでそれを行う方法を知っている特別なモードさえありました。



実際、これは長引く導入です。詳細に移りましょう。

6,000人の働く顧客をロードする必要がありました。

それらはそれぞれ10秒ごとに1回アクティブになります。

それぞれに独自のユーザー名/パスワードがあります。



1つのエミュレーターで250スレッド/クライアントを起動でき、合計で実行するには、1束のマシンで24エミュレーターのコピーが必要でした(パワーに応じて、1マシンあたり1〜4個)。

しかし、男性は言ったが、それは必要なはずだ、彼らはそれを起動し、彼らはこれで最初の段階を閉じ、理論を確認し、希少性の状況を延期した。



その後、しばらくして、再び負荷の必要性が生じ、それをすべて開始した人が不在だったので、彼らは私を魅了しましたが、 金曜日の夜など、月曜日まで延期することにしました。



実際、私は開発者ではありません-私はテスター/ QAですが、さまざまな奇妙な背景を持っています。



私は自宅で、この問題を単純化できるかどうか、「他の」メソッドを大量に作成できるかどうかを確認することにしました。



私はエミュレーターを取り、Fiddler2(Fiddlerはコンピューターとインターネット間のすべてのHTTP(S)トラフィックをログに記録するWebデバッグプロキシです)を取り、何が行われているかを調べました。



双方向で実行されるXMLと、魔法の言葉であるSOAPがありました。



ああ、ついに彼をもっとよく知る良い理由だと言った。



同時に、Rubyでそのようなことができるかどうかを確認します。

なぜルビーなのか?

まあ、まず、それが美しいので、今回は、

第二に、この束の後にRuby + WATIR、Rubyに夢中になりました(別に考えます)

第三に-マルチプラットフォーム、それは私にとって重要な要因でした 研究の第1フェーズが行われた自宅では、OS X(Hackintosh)、Windowsでも、Linuxは実生活で役に立ちました。



私は適切なライブラリを探し、soap4r、Savonが後者を選んだのを見つけました。 軽く見えた。 つまり、ゲームが始まりました。



驚くべきことに、最初の機能するコードをすぐに取得しました。タスクは、ネイティブエミュレータからのリクエストのようなリクエストを取得することでした。

  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







つまり 1人のクライアントがいます。まあ、多くのクライアントにドキュメントを開き、例を見つけて適用します。

run_client-1つの「クライアント」のコード



  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. 寝る 9
  7. 終わり
  8. 終わり
  9. clients = Array新しい
  10. 1. up 10 do | client_id |
  11. クライアント<< スレッド新しい
  12. 「開始:#{client_id}」
  13. run_client t_cnt
  14. 終わり
  15. 終わり
  16. クライアント。 マップ { | t | t。 参加する }




起動-URA、動作します。

画面の起動で、操作数1000を試してみましょう〜130スレッドとブレーキ;(

Rubyは多くのスレッドを許可したくないようです。

まあ、一般的に、これは問題ではなく、結果は私たちにとって重要です。

1つのファイルに100個を入れると、そのようなファイルが10個になるので、クライアントは1000個になります。

試してください-歓声は動作します!!!、しかし、私たちは穏やかにペンダントを言うパーセントをロードします、私たちは何をすべきか考え始めます、私たちはさらに必要です!



ここでは、クライアントは10秒ごとに1回アクティブであることを思い出します

つまり 1つのスレッドを実行して、1秒ごとに10個の連続するクライアントを簡単に処理して結果を取得し、10秒ごとに各クライアントのアクティビティを取得できます。

歓声、スレッド数を10倍に減らすことができました。 1000のクライアントに必要なスレッドは100だけですが、これはすでに現実のものです...



そのようなランチャーを得た

  1. def do_for_time time_in_sec、 block
  2. time_end = 時間現在 + time_in_sec - 0.01
  3. 利回り
  4. time_rest = time_end- 時間
  5. time_rest > = 0.1の 場合、 time_restをスリープします。
  6. 終わり
  7. def run_10 start_id
  8. clinets = 配列新しい
  9. 1. up 10 do | nn |
  10. id = get_id [ start_id + nn ]
  11. pwd = get_pwd [ start_id + nn ]
  12. クリネット<< [ id、pwd ]
  13. 終わり
  14. clnt = HTTPClient。 新しい
  15. 本当 ながら
  16. クリネット。 それぞれ | クライアント|
  17. id = client [ 0 ]
  18. pwd = client [ 1 ]
  19. do_for_time 1 do
  20. data_available clnt、id、pwd
  21. update_status clnt、id、pwd
  22. 終わり
  23. 終わり
  24. 終わり
  25. 終わり




ところで、楽しい関数do_for_time(ああ、私はルーブルのブロックが大好きです!)

実行する秒数をパラメータとして呼び出し、実行する必要のあるブロックを渡します。ブロックの実行とともに、要求された秒数の間機能します(ブロックへの関数呼び出しは待機時間よりはるかに短いと考えます)

、パーセントはまだ読み込まれているので、これで何かをする必要があります。



元のリクエストをもう一度見て、気付いたのに、なぜSOAPが必要なのでしょうか?

結局のところ、これは既知のXMLを使用したPOSTリクエストに過ぎません!



言った-完了、機能を書き直し、SOAPを投げ、
  1. def check_data http_client、id、pwd
  2. uri = 'https://superserver.super.com/DDService/Data.svc'
  3. soap = Q | < ?xml version = "1.0" encoding = "utf-8"> < soap:エンベロープ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} </ ID> <パスワード>#{pwd} < / Password> </ DataAvailable> </ soap:Body> </ soap:Envelope>
  4. |
  5. ヘッダー= {
  6. 'Content-Type' => 'text / xml; charset = UTF-8'
  7. 'SOAPAction' => 'company.EDC / IData /'
  8. }
  9. http_client。 ポスト URI、石鹸、ヘッダー
  10. 終わり




予想通り、新バージョンはMUCHを1パーセント未満しか食べませんでした。 不必要な愚かさに従事していない。



3000人のクライアントは非常に簡単に生活しています...



ここでホームゲームを止めました 非対称ADSLチャネルに遭遇した後、休憩する必要があります;)



月曜日、仕事を続け、高速チャンネルで。

そして、奇跡が始まり、悲しい

ネジRuby 1.8.7は、1000クライアントで2核CPUの100%を食べます、がらくた...



(同じマシン上で)仮想マシンをチェックインするには、ubuntuを配置し、2つのコアを与え、同じことをさせます...

一般的な奇跡では、linukhaの下のVIRTUALKに5000人のクライアントがいます。



さらなる実験:

jrubyステークスによって、彼は説明に従って正しいスレッドを持っています。1000-負荷の20%を許可します-URA

2番目のファイルを1000とたわごとで起動し、80%の2xコアをロードします。耐性がありますが、あまり明確ではありません(



その結果、2000台の車が私たちのタスクに適していました(リモートの車で起動する必要があり、そこに仮想マシンを置くことは不可能でした)

問題は解決され、サーバーがロードされました。

SOAPで遊んだ、面白い、それほど難しくない。

累積8時間。



結論:

1.「シンプルに、馬鹿げてください!」-このケースでは、単純化は問題を解決するのに役立ち、複雑なSOAPからhttpリクエストだけに移行して状況を改善しました。

2. RUBYはそのようなタスクに使用できます。言語と戦う必要はありませんでした。それはちょうど私が望んだことをすることを許しました;)(ほとんど問題を引き起こすことなく)

3.スクリプト言語の使用-問題の解析時間を大幅に短縮します。 実験が簡単になり、すばやく簡単になります。

4.マルチプラットフォーム-ドライブ

5.これで、必要に応じて、すべてをC#で書き直すことができます。同じマシン上に多くのクライアントが存在する可能性がありますが、まだ必要ではなく、タスクは1回限りです。

6.ルビーが大好き!

______________________

テキストは©SoftCoder.ruによってブログエディターで作成されます。



All Articles