मैं Vert.x के साथ खेल रहा हूं और थ्रेड/कनेक्शन मॉडल के विपरीत ईवेंट लूप के आधार पर सर्वर पर काफी नया हूं।Vert.x इवेंट लूप - यह असीमित कैसे है?
public void start(Future<Void> fut) {
vertx
.createHttpServer()
.requestHandler(r -> {
LocalDateTime start = LocalDateTime.now();
System.out.println("Request received - "+start.format(DateTimeFormatter.ISO_DATE_TIME));
final MyModel model = new MyModel();
try {
for(int i=0;i<10000000;i++){
//some simple operation
}
model.data = start.format(DateTimeFormatter.ISO_DATE_TIME) +" - "+LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
r.response().end(
new Gson().toJson(model)
);
})
.listen(4568, result -> {
if (result.succeeded()) {
fut.complete();
} else {
fut.fail(result.cause());
}
});
System.out.println("Server started ..");
}
- मैं सिर्फ एक लंबी चलने वाली अनुरोध हैंडलर अनुकरण करने के लिए समझने के लिए कैसे इस मॉडल काम करता है कोशिश कर रहा हूँ।
- मैंने जो देखा है, वह मेरा पहला अनुरोध पूरा होने तक तथाकथित ईवेंट लूप अवरुद्ध है। जो कुछ भी समय लगता है, उसके बाद का अनुरोध तब तक नहीं किया जाता जब तक कि पिछले एक पूरा नहीं हो जाता।
- जाहिर है, मैं यहां एक टुकड़ा खो रहा हूं और यही वह सवाल है जो मेरे पास है।
संपादित जवाब अब तक के आधार पर:
सभी अनुरोधों- स्वीकार नहीं कर रहा है अतुल्यकालिक माना जाता? यदि कोई नया कनेक्शन केवल तभी स्वीकार किया जा सकता है जब पिछले व्यक्ति को बंद कर दिया गया हो, तो यह एसिंक कैसे है?
- मान लें कि एक सामान्य अनुरोध 100 एमएस से 1 सेकंड (अनुरोध की तरह और प्रकृति के आधार पर) के बीच कहीं भी लेता है। तो इसका मतलब है, इवेंट लूप पिछले अनुरोध खत्म होने तक एक नया कनेक्शन स्वीकार नहीं कर सकता है (भले ही इसकी हवाएं एक सेकंड में हों)। और यदि मैं प्रोग्रामर के रूप में इन सभी के माध्यम से सोचना चाहता हूं और ऐसे अनुरोध हैंडलर को कार्यकर्ता थ्रेड पर धक्का देना है, तो यह थ्रेड/कनेक्शन मॉडल से अलग कैसे होता है?
- मैं यह समझने की कोशिश कर रहा हूं कि यह मॉडल पारंपरिक थ्रेड/कॉन सर्वर मॉडल से बेहतर कैसे है? मान लें कि कोई I/O op या नहीं है I/O op को समकालिक रूप से संभाला जाता है? यह c10k समस्या को हल भी करता है, जब यह सभी समवर्ती अनुरोधों को समानांतर रूप से प्रारंभ नहीं कर सकता है और पिछले एक को समाप्त होने तक प्रतीक्षा करना है?
भले ही मैं इन सभी परिचालनों को एक कार्यकर्ता थ्रेड (पूल) में धक्का देने का फैसला करता हूं, फिर भी मैं वही समस्या पर वापस आ गया हूं? धागे के बीच संदर्भ स्विचिंग? संपादन और एक इनाम
- पूरी तरह से समझ में नहीं आ कैसे इस मॉडल अतुल्यकालिक का दावा किया है के लिए इस सवाल का टॉपिंग।
- वर्ट.एक्स में एसिंक जेडीबीसी क्लाइंट है (असिनक्रोनस कीवर्ड है) जिसे मैंने आरएक्सजेवा के साथ अनुकूलित करने की कोशिश की।
- यहाँ एक कोड नमूना (प्रासंगिक अंश)
server.requestStream() है toObservable() की सदस्यता लें (अनुरोध -।।> {
LocalDateTime start = LocalDateTime.now(); System.out.println("Request for " + req.absoluteURI() +" received - " +start.format(DateTimeFormatter.ISO_DATE_TIME)); jdbc.getConnectionObservable().subscribe( conn -> { // Now chain some statements using flatmap composition Observable<ResultSet> resa = conn.queryObservable("SELECT * FROM CALL_OPTION WHERE UNDERLYING='NIFTY'"); // Subscribe to the final result resa.subscribe(resultSet -> { req.response().end(resultSet.getRows().toString()); System.out.println("Request for " + req.absoluteURI() +" Ended - " +LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)); }, err -> { System.out.println("Database problem"); err.printStackTrace(); }); }, // Could not connect err -> { err.printStackTrace(); } ); }); server.listen(4568);
- चयन क्वेरी वहाँ 3 सेकंड लेता है लगभग पूरी तालिका डंप वापस करने के लिए।
- जब मैं समवर्ती अनुरोधों को आग लगाता हूं (केवल 2 के साथ प्रयास किया जाता है), तो मुझे लगता है कि दूसरा अनुरोध पूरी तरह से पूरा करने के लिए पहले इंतजार कर रहा है।
- यदि जेडीबीसी चयन एसिंक्रोनस है, तो क्या यह उचित उम्मीद नहीं है कि फ्रेमवर्क दूसरे कनेक्शन को संभालने के लिए है, जबकि यह कुछ भी वापस करने के लिए चुनिंदा क्वेरी के लिए इंतजार कर रहा है।
टीएलडीआर: लंबे समय तक चलने वाले कार्यों के लिए रणनीति पृष्ठभूमि थ्रेडपूल (क्लासिक मल्टीथ्रेडिंग) पर स्विच करना है जो ब्लॉकिंग से बचने के लिए ईवेंट लूप के समान थ्रेड का उपयोग नहीं कर रहा है। –