pp.11.02-RouterFindWords

Paralleles Suchen/Finden eines Suchstrings in sehr vielen Textdateien mit einem Router

  • Projekt: pp.11.02-RouterFindWords
  • Bearbeitungszeit: 35 Minuten
  • Musterlösung: 15 Minuten
  • Kompatibilität: mindestens Java SE 16

Aufbauend auf der Musterlösung von pp.11.01-FindWords soll ein Aktor-System mit der Verwendung eines Routers entwickelt werden.

Das Aktor-System besteht aus drei unterschiedlichen Aktor-Typen (Klassen):

  • pp.MasterActor (muss geändert werden) – genau einmal
  • pp.ListenerActor – genau einmal
  • pp.WorkerActor – von diesen Aktoren wird es mehrere Instanzen geben. Diesmal aber weniger als die Anzahl der zu durchsuchenden Dateien.

Zwischen den Aktoren werden vier unterschiedliche Nachrichten-Typen ausgetaucht:

  • pp.messages.PleaseCleanupAndStop
  • pp.messages.FindMsg
  • pp.messages.WorkMsg
  • pp.messages.ResultMsg

Der Master erzeugt die Worker und den Listener als Kinder und überwacht sie. Außerdem muss es einen Router mit Round Robin Entscheidungslogik geben. Die WorkerActor-Instanzen fungieren als Routees dieses Routers.

Hettel und Tran (2016)

Hettel und Tran (2016)

Ablauf

Im folgenden Sequenzdiagramm ist ein exemplarischer Ablauf des Aktor-Systems dargestellt.

Die gestrichelten “new”-Pfeile sollen symbolisieren, dass Aktoren erzeugt werden (tatsächlich unter Verwendung der Methode actorOf im Kontext des Master-Aktors). Außerdem wird der Router durch new(w1,w2) erzeugt. Damit ist gemeint, dass eine Router-Instanz gebildet wird und dass ihr w1 und w2 als Routees zugewiesen werden.

Die Aktivierung der Lebenslinien der Worker ist hier wieder wie bei der vorigen Laborübungsaufgabe gemeint. Es handelt sich um die Bearbeitung einer WorkMsg, an deren Ende das Senden einer ResultMsg-Nachricht an den Master steht. Das ist im UML-Sinn kein return, daher wird als Pfeil-Typ \(\to\) auch zum Zurücksenden des Ergebnisses verwendet. Die Aktivierung der Lebenslinie soll hier nur verdeutlichen, dass der Worker an dieser Stelle arbeitet.

In diesem Diagramm hat auch der Router Aktivierungen auf der Lebenslinie. Das soll hier andeuten, dass jeweils eine WorkMsg, die beim Router ankommt, an einen Worker weitergereicht wird. Nach dem Routen endet die Aktivierung und es wird auf die nächste WorkMsg zum Weiterleiten gewartet.

Um die Darstellung übersichtlich zu halten, ist die Zahl der Worker von fünf auf zwei Aktoren und der Umfang des Auftrags von acht auf drei Dateien reduziert.

  • Master erzeugt am Anfang Listener und alle Worker
  • Master erzeugt dann einen Router, dem die Worker als Routees übergeben werden
  • eine FindMsg kommt beim Master an
  • die drei darin enthaltenen Dateien werden vom Master als WorkMsg an den Router geschickt.
  • Router sendet erste und zweite WorkMsg an w1 und w2
  • die dritte WorkMsg geht vom Router wieder wegen Round Robin-Logik an w1
  • Master sammelt drei ResultMsg ein und sendet Gesamtergebnis als ResultMsg an Listener

Aufgaben

  • Bauen Sie einen Router ein, der beliebig viele Aufträge auf n WorkerActor verteilt und dabei die RoundRobinRoutingLogic verwendet.
  • Es empfiehlt sich die Routees, den Router und die Verbindung zwischen ihnen im Konstruktor von MasterActor zu erzeugen.
  • Die Routees sind WorkerActor-Instanzen. Es ist sinnvoll, eine feste Anzahl von ihnen in einer Schleife zu erzeugen.
  • Als Router-Verhalten soll Round Robin verwendet werden.
  • Verdoppeln Sie die Anzahl der Dateien, in denen gesucht werden soll, indem Sie Kopien der vier gegebenen Dateien erstellen. Dafür muss auch Main geändert werden.
  • Sehen Sie weniger Routees als Dateien vor, damit gezeigt werden kann, dass Ihr Programm mit einer festen Anzahl von WorkerActor-Instanzen eine beliebige Anzahl von (Teil-) Aufgaben lösen kann.

Literatur

Hettel, Jörg und Manh Tien Tran. 2016. Nebenläufige Programmierung mit Java. Konzepte und Programmiermodelle für Multicore-Systeme. Heildelberg: dpunkt.verlag.