Ich habe diesen Code (die unwichtigen Details sind, dass er auf EC2-Instanzen in AWS ausgeführt wird und Nachrichten in einer SQS-Warteschlange verarbeitet).Sollte ich eine asynchrone Operation ausführen, wenn die Methode bereits asynchron ist
Die erste Anweisung in der Methode ruft einige Daten über HTTP ab, die zweite Anweisung speichert den Status in einem lokalen Dynamodatenspeicher.
public bool HandleMessage(OrderAcceptedMessage message)
{
var order = _orderHttpClient.GetById(message.OrderId);
_localDynamoRepo.SaveAcceptedOrder(message, order);
return true;
}
Die Leistungsmerkmale sind, dass die HTTP-Rundreise 100-200 Millisekunden, und der dynamo-Schreib dauert etwa 10 Millisekunden dauert.
Beide dieser Operationen haben async
Versionen. Wir könnten es wie folgt schreiben:
public async Task<bool> HandleMessage(OrderAcceptedMessage message)
{
var order = await _orderHttpClient.GetByIdAsync(message.OrderId);
await _localDynamoRepo.SaveAcceptedOrderAsync(message, order);
return true;
}
So ist die Führung ist, dass seit der ersten Operation „länger als 50 Millisekunden dauern könnte auszuführen“ es soll Gebrauch von async und wartet machen. (1)
Aber was ist mit der zweiten, schnellen Operation? Welches dieser beiden Argumente ist richtig:
Machen Sie es nicht async: Es erfüllt nicht die 50ms-Kriterium und es ist nicht der Overhead wert.
Machen Sie es async: Der Aufwand wurde bereits von der vorherigen Operation bezahlt. Es gibt bereits aufgabenbasierte Asynchronität, und es lohnt sich, sie zu verwenden.
1) http://blog.stephencleary.com/2013/04/ui-guidelines-for-async.html
Danke für die Antwort. Ja, das ist eine Server-App, die in der Spitze eine hohe Auslastung und Nebenläufigkeit aufweist. Gibt es eine äquivalente Leitzahl von ms zum "Freigeben von Thread-Pool-Threads" oder ist es "immer"? – Anthony
@Anthony: Wenn Ihre App stark ausgelastet ist und Ihr Backend skalieren kann, würde ich einfach "immer" sagen. Ich kenne keine Metriken. In diesem Fall können Sie mit all 'async' Ihren Thread-Pool maximal nutzen. –