2016-04-17 7 views
1

In meiner Anwendung, die ein HTTP-Dienst ist, der mehrere APIs verfügbar macht, die von anderen Diensten konsumiert werden können, habe ich eine Situation, in der ich 2 verschiedene externe Dienste aufrufen muss, die ein Messaging-Dienst und ein weiterer REST-DienstScala ExecutionContext für REST API Aufrufe

Ich verstehe, dass es für diese I/O-gebundenen Vorgänge eine gute Übung ist, einen separaten Threadpool oder ExecutionContext zu verwenden. Ich verwende den folgenden eine Konfiguration für die benutzerdefinierte ExecutionContext in meinem application.conf zu erstellen:

execution-context { 
    fork-join-executor { 
    parallelism-max = 10 
    } 
} 

Ich habe ein paar Fragen:

  1. Ist das gehen 10 dedizierte Threads erstellen?
  2. Woher weiß ich die Größe der Parallelität-max?
  3. Sagen Sie, wenn ich diesen Ausführungskontext verwenden werde, um REST-API-Aufrufe zu machen, wie soll ich das dimensionieren?

Antwort

1
  1. Wird das 10 dedizierte Threads erstellen?

    Schließen, aber nicht genau. Wie Sie can read von Akka Dokumentation, drei Eigenschaften, parallelism-min, parallelism-factor und parallelism-max werden verwendet, um parallelism Parameter zu berechnen, die dann zugrunde liegenden ForkJoinPool geliefert wird. Die Formel lautet parallelism = clamp(parallelism-min, ceil(available processors * factor), parallelism-max).

    Jetzt über Parallelität. Wie Sie aus den Dokumenten lesen können, entspricht es ungefähr der Anzahl der "heißen" Threads, aber unter Umständen können zusätzliche Threads erzeugt werden. Nämlich, wenn einige Threads innerhalb von ManagedBlocking blockiert sind. Weitere Details finden Sie unter that answer.

  2. Wie kann ich wissen, die Größe des Parallelismus-max

    Es auf Ihren Anwendungsfall abhängt. Wenn Sie einen Thread pro Task blockieren, wie viele gleichzeitige Taskausführungen erwarten Sie?

  3. Sagen Sie, wenn ich diesen Ausführungskontext verwenden werde, um REST-API-Aufrufe zu machen, wie soll ich das dimensionieren?

    Noch einmal, wie viele gleichzeitige Anfragen möchten Sie machen? Wenn Sie Ihre Threads blockieren und eine große Anzahl gleichzeitiger HTTP-Aufrufe erwarten und diese so schnell wie möglich verarbeitet werden sollen, möchten Sie einen großen Thread-Pool.

    Wenn Sie jedoch so viele http-Anfragen stellen, verwenden Sie eine vorhandene Bibliothek. Bibliotheken wie ApacheHttpClient ermöglichen es Ihnen, configure parallelism in Bezug auf http-Verbindungen oder Verbindung pro Host.

    Auch für HTTP-Aufrufe von Schauspielern ist es natürlich, nicht blockierende HTTP-Clients wie netty-based AsyncHttpClient zu verwenden. Es hat auch Thread-Pool innerhalb (offensichtlich), aber es ist behoben und eine beliebige Anzahl von gleichzeitigen Verbindungen werden von dieser festgelegten Menge von Threads in nicht blockierender Weise behandelt.