1) Gibt es eine Implementierung der aws sdk , die asynchrone I / O anstelle von Thread-Pools verwendet? Ich arbeite an einem hochskalierbaren Web-Service und Profiling zeigt, dass die CPU viele Zyklen beim Verwalten von Netzwerk-I / O von und nach Amazon verschwendet.
2) Der aktuelle Client verwendet Apache Http Client , wenn ich keine asynch Implementierung finden kann werde meine eigene Version abzweigen, um es zu implementieren. Ich dachte daran, den Jetty Http Client zu verwenden. Ist es eine schlechte Form, Jetty und Apache-Bibliotheken zu mischen? Gibt es eine bessere Alternative?
1) Gibt es eine Implementierung der aws sdk, die asynchron verwendet? I / O statt Thread-Pools?
Nicht, dass ich davon wüsste, und ich wäre überrascht, dass dies schwer zu finden ist, wenn es schon existieren würde.
2) Der aktuelle Client benutzt Apache Http Client, wenn ich keinen finden kann asynch-Implementierung Ich werde meine eigene Version forkieren, um sie zu implementieren. [...] Gibt es ein besseres? Alternative?
Es gibt tatsächlich eine bessere Alternative - das AWS SDK für Java verwendet derzeit das Http Client Version 4.x (Sie wurden stattdessen mit den älteren JavaDocs der Version 3.1 verknüpft) von Apache HttpComponents , die bequem einen Async HttpClient zur Verfügung stellt gut:
Async HttpClient ist eine HTTP / 1.1-kompatible Implementierung des HTTP-Agenten basiert auf HttpCore NIO und HttpClient-Komponenten. Es ist eine Ergänzung Modul zu Apache HttpClient für spezielle Fälle wo Fähigkeit eine große Anzahl von gleichzeitigen Verbindungen zu handhaben ist wichtiger als Leistung in Bezug auf den Datendurchsatz. [Betonung meiner]
Wie betont, sollte es nur für die jeweiligen Anwendungsfälle erleichtert werden, aber (gemäß dein Kommentar ) du verschickst Tausende von Anfragen an AWs, was bedeutet, dass offene Anfragen sich häufen , also könnte das in der Tat helfen.
Asynchronous IO ist kein Wundermittel - Thread-pro-Verbindung ist normalerweise schneller (durchsatzbezogen) und viel einfacher zu programmieren:
Es klingt für mich so, als ob Ihr limitierender Faktor die IO zu Amazon ist, nicht die CPU-Verarbeitung all dieser Verbindungen. Die Tatsache, dass Sie viel CPU-Zeit für die Abfrage der Sockets aufwenden, ist möglicherweise nur ein Profiling-Artefakt aufgrund der Tatsache, dass diese Aufrufe blockieren. (Etwas zu überprüfen: Maximieren Sie tatsächlich die CPU-Auslastung?)
Die neue AWS SDK für Java 2.0-Vorschau war angekündigt im Juni 2017 und bietet diese Funktionalität.
Das SDK unterstützt nun wirklich blockierungsfreie E / A. Die Version 1.11.x des SDK verfügt bereits über asynchrone Varianten von Dienstclients. Sie sind jedoch nur ein Wrapper um einen Threadpool und den blockierenden Synchronisierungsclient, sodass sie nicht die Vorteile nicht blockierender E / A bieten (hohe Parallelität mit sehr wenigen Threads). Aufgrund der Einschränkungen und des geringen Ressourcenverbrauchs des Threads-pro-Verbindung-Modells haben viele Kunden Unterstützung für nicht blockierende E / A angefordert. Daher freuen wir uns, Ihnen eine erstklassige Unterstützung für nicht blockierende E / A in unseren asynchronen Clients ankündigen zu können. Unter der Haube verwenden wir einen HTTP-Client, der auf netty aufgebaut ist, um den nicht blockierenden HTTP-Aufruf durchzuführen.
Weitere Informationen finden Sie unter
Beachten Sie jedoch:
Tags und Links java jetty amazon-web-services