মাল্টিথ্রেডেড এনভায়রনমেন্টে এইচটিপিপিপ্লায়েন্ট ব্যবহারের সেরা অনুশীলন


85

কিছুক্ষণের জন্য, আমি বহুবিবাহিত পরিবেশে এইচটিপিপ্লিনেন্ট ব্যবহার করছি। প্রতিটি থ্রেডের জন্য, যখন এটি কোনও সংযোগ শুরু করে, এটি সম্পূর্ণ নতুন HttpClient উদাহরণ তৈরি করবে।

সম্প্রতি, আমি আবিষ্কার করেছি যে, এই পদ্ধতির ব্যবহারের ফলে এটি ব্যবহারকারীর অনেক বেশি পোর্ট খোলা হতে পারে এবং বেশিরভাগ সংযোগগুলি TIME_WAIT অবস্থায় রয়েছে।

http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html

সুতরাং, প্রতিটি থ্রেডের পরিবর্তে:

HttpClient c = new HttpClient();
try {
    c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
}

আমাদের রয়েছে পরিকল্পনা:

[পদ্ধতি A]

// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());

try {
    global_c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
}

একটি সাধারণ পরিস্থিতিতে, বিশ্বব্যাপী_c একযোগে 50 ++ থ্রেড দ্বারা অ্যাক্সেস করবে। আমি ভাবছিলাম, এটি কি কোনও পারফরম্যান্স সমস্যা তৈরি করবে? মাল্টিথ্রেডড এইচটিটিপি সংযোগ ম্যানেজারটি এর থ্রেড নিরাপদ নীতি বাস্তবায়নের জন্য লক-মুক্ত প্রক্রিয়া ব্যবহার করছে?

যদি 10 টি থ্রেড বিশ্বব্যাপী_ ব্যবহার করে থাকে তবে অন্য 40 টি থ্রেড লক হয়ে যাবে?

অথবা এটি আরও ভাল হবে যদি প্রতিটি থ্রেডে, আমি কোনও এইচটিপিপ্লিয়েন্টের উদাহরণ তৈরি করি তবে সংযোগ ব্যবস্থাপককে স্পষ্টভাবে প্রকাশ করি?

[পদ্ধতি বি]

MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
      c.executeMethod(method);
}
catch(...) {
}
finally {
    method.releaseConnection();
    connman.shutdown();
}

সংযুক্তি.শটডাউন () পারফরম্যান্সের সমস্যায় ভুগবে?

50 ++ থ্রেড ব্যবহারের জন্য অ্যাপ্লিকেশনের জন্য কী পদ্ধতি (A বা B) ভাল তা আমি জানতে পারি?

উত্তর:


47

অবশ্যই এ পদ্ধতিটি এগুলির পোল্ড এবং থ্রেড নিরাপদ।

আপনি ব্যবহার করে থাকেন httpclient 4.x, সংযোগ ব্যবস্থাপক বলা হয় ThreadSafeClientConnManager । আরও তথ্যের জন্য এই লিঙ্কটি দেখুন ("পুলিং সংযোগ পরিচালক" এ স্ক্রোল করুন)। উদাহরণ স্বরূপ:

    HttpParams params = new BasicHttpParams();
    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, registry);
    HttpClient client = new DefaultHttpClient(cm, params);


হাই, httpclient এই পদ্ধতি দ্বারা নির্মিত হিসাবে এখানে বর্ণিত অধিবেশন বজায় রাখার জন্য ব্যবহার করা যেতে পারে stackoverflow.com/questions/5960832/... ...? কারণ যখন আমি চেষ্টা করেছি, আমি
বিবিধ

17
৪.৩.১ এখানে: পুলিংচ্লিয়েন্টকেনজ ম্যানেজারকে পুলিংএইচটিপিপ্লেইটস কানেকশন ম্যানেজারের পক্ষে অবহেলা করা হয়েছে।
ম্যাথিয়াস

@ ড্রিউস্টেফেনস আবার পুলিং ক্লায়েন্টকন ম্যানেজারকে পুলিংএইচটিপি
ক্লায়েন্ট কনসেকশন

18

পদ্ধতি এটিকে httpclient বিকাশকারী সম্প্রদায় দ্বারা প্রস্তাবিত।

আরও তথ্যের জন্য দয়া করে http://www.mail-archive.com/httpclient-users@hc.apache.org/msg02455.html দেখুন।


4
ক্লায়েন্টকে বিশ্বব্যাপী তৈরি করা হলে কোন সংযোগ পরিচালককে কখন "শাটডাউন" কল করবে?
ওয়ান্ড মেকার

4
কোন সরঞ্জাম / লিনাক্স কমান্ড হুডের নীচে কানেকশনম্যানেজারের আচরণটি ডিবাগ করতে বা "কল্পনা করতে" দরকারী? আমি জিজ্ঞাসা করি কারণ বর্তমানে আমাদের কাছে CLOSE_WAIT এর সংযোগগুলি এবং অন্যান্য প্রভাবগুলির সাথে সমস্যা আছে এবং আমরা ঠিক কী চলছে তা দেখার জন্য একটি ভাল উপায় সন্ধান করতে চাইছি।
ক্রিস্টোফ

@ ওয়ান্ডমেকার আমি নিশ্চিত যে আপনি প্রোগ্রাম বন্ধ হয়ে গেলে বা কাজের কিছু ব্যাচ শেষ করেছেন যেখানে আপনাকে কিছু সময়ের জন্য কোনও সংযোগের প্রয়োজন হবে না যখন আপনি কেবল শাটডাউন কল করবেন।
নিকোলাস ডিপিয়াজ্জা

4
@ ক্রিসটফ এটিতে netstatখুব সুন্দর একটি কাজ করে। technet.microsoft.com/en-us/sysinternals/bb897437.aspx খুব
নিকোলাস DiPiazza

13

দস্তাবেজগুলির আমার পাঠ্যটি হ'ল এইচটিচপি ​​সংযোগটি নিজেই থ্রেডকে নিরাপদ হিসাবে বিবেচনা করা হয় না এবং তাই মাল্টিথ্রেডড এইচটিপি সংযোগ ম্যানেজার এইচটিটিপি সংযোগগুলির একটি পুনরায় ব্যবহারযোগ্য পুল সরবরাহ করে, আপনার একক একক মাল্টিথ্রেডড এইচটিপি সংযোগ ম্যানেজারটি সমস্ত থ্রেড দ্বারা ভাগ করে নেওয়া হয়েছে এবং ঠিক একবার শুরু করা হয়েছিল। সুতরাং আপনার বিকল্প একটিতে কয়েকটি ছোট পরিমার্জন প্রয়োজন need

MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManag

তারপরে প্রতিটি থ্রেডটি প্রতিটি অনুরোধের জন্য ক্রমটি ব্যবহার করা উচিত, পুল থেকে একটি সংযোগ পাওয়া এবং এটির কাজ শেষ করার পরে এটি পুনরায় স্থাপন করা উচিত - শেষ অবধি ব্লকটি ব্যবহার করা ভাল হতে পারে। আপনার এই পুলের কোনও সংযোগ নেই এবং সময়সীমা ব্যতিক্রম প্রক্রিয়া করার সম্ভাবনাটির জন্য কোড করা উচিত।

HttpConnection connection = null
try {
    connection = connman.getConnectionWithTimeout(
                        HostConfiguration hostConfiguration, long timeout) 
    // work
} catch (/*etc*/) {/*etc*/} finally{
    if ( connection != null )
        connman.releaseConnection(connection);
}

আপনি যেমন সংযোগের পুল ব্যবহার করছেন আপনি প্রকৃতপক্ষে সংযোগগুলি বন্ধ করবেন না এবং তাই এটি TIME_WAIT সমস্যায় পড়ে না। এই পদ্ধতির ধারনা করা হয় যে প্রতিটি থ্রেড দীর্ঘকাল ধরে সংযোগটিতে স্থির থাকে না। নোট করুন যে কনমান নিজেই খোলা আছে।


আমার প্রশ্নের প্রকৃত উত্তর দেয় নি, কোন পদ্ধতিতে (এ বা বি) ভাল।
চেওক ইয়ান চেং

5

আমি মনে করি আপনি থ্রেডস্যাফক্লিয়েন্টকনম্যানেজারটি ব্যবহার করতে চাইবেন।

এটি এখানে কীভাবে কাজ করে তা আপনি দেখতে পারেন: http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html

বা AndroidHttpClientযা অভ্যন্তরীণভাবে এটি ব্যবহার করে।


4
অপস। এইচটিপিপ্লিনেন্ট 3.x থেকে 4.x এ স্থানান্তরিত করার কোনও পরিকল্পনা নেই, যেহেতু প্রায় 3 xx আমার অ্যাপ্লিকেশনটিতে প্রায় 2 বছর ধরে নির্দোষ চলছিল :)
শেওক ইয়ান চেং

9
অবশ্যই, অন্য কেউ যদি এখানে উত্তর দেওয়ার জন্য গুগলিং আসে তবে :)
টমাস আহলে

5

HttpClient 4.5 দিয়ে আপনি এটি করতে পারেন:

CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(new PoolingHttpClientConnectionManager()).build();

মনে রাখবেন যে এটি ক্লোজযোগ্য (সংযোগ পরিচালককে বন্ধ করার জন্য) প্রয়োগ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.