Reactive and Event-Based Mail Processing Based on Reactivex
Total Page:16
File Type:pdf, Size:1020Kb
Submitted by Christoph Gerstberger BSc. Submitted at Institute for System Software Supervisor a.Univ.-Prof. Dipl.-Ing. Reactive and Dr. Herbert Pr¨ahofer Event-based Mail September 2020 Processing based on ReactiveX Master Thesis to obtain the academic degree of Diplom-Ingenieur in the Master’s Program Computer Science JOHANNES KEPLER UNIVERSITY LINZ Altenberger Straße 69 4040 Linz, Osterreich¨ www.jku.at DVR 0093696 Statutory Declaration i Statutory Declaration I declare that I have authored this thesis independently, that I have not used other than the declared sources / resources, and that I have explicitly marked all material which has been quoted either literally or by content from the used sources. Location, Date Signature Eidesstattliche Erklärung ii Eidesstattliche Erklärung Ich erkläre an Eides statt, dass ich die vorliegende Masterarbeit selbstständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt bzw. die wörtlich oder sinngemäß entnommenen Stellen als solche kenntlich gemacht habe. Die vorliegende Masterarbeit ist mit dem elektronisch übermittelten Textdokument identisch. Ort, Datum Unterschrift Acknowledgement iii Acknowledgement I would like to express the deepest appreciation to Alexander Fried, the founder of Swilox, that he made this thesis possible. He was the one who provided the idea for this project and more important who funded this project. He also supported me with his knowledge about Vert.x and ReactiveX whenever I had questions. Without his financial support and technical expertise, the thesis would not exist. Many thanks for that! Many thanks also go to my supervisor Herbert Prähofer, who established the communication be- tween Alexander Fried and me. He also supported me in many questions regarding the written thesis and reactive streams. Abstract iv Abstract This thesis describes an implementation of a mail server based on a reactive and event-based ap- proach using the ReactiveX library. Reactive programming means asynchronous event processing. For an asynchronous task, a handler can be registered which is called when the computation is completed. Thus, reactive task handling is asynchronous and non-blocking. ReactiveX is a library and API that provides reactive streams as an approach for reactive programming. With reactive streams, event-based, asynchronous computations can be defined in a functional way as chains of function applications. This style of programming is used in this thesis to build a mail server. Instead of fully loading the mails and processing them at once, the mails are handled in a reactive way, allowing to process the mails in small chunks. A mail usually consists of many lines where each line contributes certain information to the mail. When a mail is processed reactively, each line can be analyzed individu- ally, processed immediately, and possibly passed to the next processing step. This can have great advantages in respect to performance and throughput. The mail server consists of multiple components and communication between components is exclu- sively through events. The mail lines are received by the Mail Receiver which passes them to the Mail Parser. There the lines are parsed and further passed to other operating blocks, like the Mail Forward and Mail Sender block, which forward a mail, or the Mail Storage block, which stores the mail in the database. Performance measurements show that a significant improvement has been achieved compared to a conventional thread-based server implementation. A first experiment tested how many clients are able to connect to the server and still keep the connection alive. The classic mail server approach could handle only ca. 1200 clients, whereas with the reactive mail server approach ca. 22 000 clients could be handled. In a further experiment, the number of messages that can be handled by the server was tested. On a machine with two CPU cores and 4GB of memory, the reactive server was able to handle ca. 10 000 messages in less than 2 minutes. The thesis project has been conducted in cooperation with the start-up Swilox. The goal of the system provided by Swilox is to simplify registration and login services in web shops as well as shop-customer communication. A special mail system is used in the Swilox system for supporting shop-customer communication. A reactive mail server was needed to replace the existing mail server in the Swilox system, which was implemented with conventional technology and did not fulfill the demanding performance requirements. The reactive mail system developed in this thesis work was able to fulfill the requirements and therefore has been integrated in the production version of the Swilox system in the meantime. Kurzfassung v Kurzfassung Diese Arbeit beschreibt die Entwicklung eines reaktiven und ereignisbasierten Mailservers unter Verwendung von ReactiveX. Reaktive Programmierung bedeutet asynchrone Ereignisverarbeitung. Für eine asynchrone Berechnung kann ein Handler registriert werden, der aufgerufen wird, wenn die Berechnung abgeschlossen ist. Somit ist die Berechnung asynchron und nicht blockierend. Reac- tiveX ist eine Bibliothek und API, die reaktive Streams als Ansatz für eine reaktive Programmierung zur Verfügung stellt. Mit reaktiven Streams können ereignisbasierte, asynchrone Funktionen zu Funktionsketten zusammengehängt werden. Diese Art der Programmierung wird in dieser Arbeit zum Aufbau eines Mailservers verwendet. Anstatt die Mails komplett zu laden und als Ganzes zu prozessieren, werden die Mails reaktiv be- handelt, so dass sie in kleinen Blöcken verarbeitet werden können. Eine Mail besteht in der Regel aus vielen Zeilen, wobei jede Zeile bestimmte Informationen zur Mail beiträgt. Wenn eine Mail reaktiv verarbeitet wird, kann jede Zeile einzeln analysiert, sofort verarbeitet und eventuell an den nächsten Verarbeitungsschritt übergeben werden. Dies kann große Vorteile im Hinblick auf Leistung und Durchsatz haben. Der Mailserver besteht aus mehreren Komponenten. Die Kommunikation zwischen den Kompo- nenten erfolgt ausschließlich über Ereignisse. Die Zeilen der Mail werden von der Mail-Receiver Komponente empfangen, der sie an die Mail-Parser Komponente weiterleitet. Dort werden die Zeilen analysiert und an weitere Komponenten übergeben, wie z.B. die Mail-Forward und Mail- Sender Komponente, die eine Mail weiterleiten oder die Mail-Storage Komponente, die die Mail in der Datenbank speichert. Leistungsmessungen zeigen, dass im Vergleich zu einer konventionellen Thread-basierten Server- Implementierung eine erhebliche Verbesserung erreicht wurde. In einem ersten Experiment wurde getestet, wie viele Clients in der Lage sind, sich mit dem Server zu verbinden und die Verbindung aufrechtzuerhalten. Der klassische Mailserver konnte nur ca. 1200 Clients behandeln, während mit dem reaktiven Mailserver ca. 22 000 Clients behandelt werden konnten. In einem weiteren Exper- iment wurde die Anzahl der Nachrichten getestet, die vom Server verarbeitet werden können. Auf einem Server mit zwei CPU-Kernen und 4 GB Speicher war der reaktive Server in der Lage ca. 10 000 Nachrichten in weniger als 2 Minuten zu verarbeiten. Diese Diplomarbeit wurde in Zusammenarbeit mit dem Start-up Swilox durchgeführt. Ziel des von Swilox angebotenen Systems ist es, den Registrierungs- und Loginvorgang in Webshops sowie die Shop-Kunden-Kommunikation zu vereinfachen. Zur Unterstützung der Shop-Kunden-Kommunikation wird im Swilox-System ein spezielles Mailsystem eingesetzt. Ein reaktiver Mailserver wurde benötigt, um den bestehenden Mailserver im Swilox-System zu ersetzen, der mit konventionellen Technologien implementiert wurde und die hohen Leistungsanforderungen nicht erfüllte. Das in dieser Diplomar- beit entwickelte reaktive Mailsystem konnte die Anforderungen erfüllen und wurde deshalb inzwis- chen in die Produktionsversion des Swilox-Systems integriert. Table of Contents vi Table of Contents 1 Introduction 1 1.1 Industrial Context . .1 1.2 Challenges . .2 1.3 Chapter Preview . .3 2 Use Cases 4 2.1 Mail from online shop to user (in Swilox App) . .4 2.2 Reply to a mail (in Swilox App) . .5 2.3 Forward mail to external user mail address . .6 2.3.1 Manual forward . .6 2.3.2 Automatic forward . .6 2.4 Reply to mail (from external mail server) . .7 3 Technologies 8 3.1 ReactiveX . .8 3.1.1 Observable . .9 3.1.2 Flowable . 10 3.1.3 Processor . 11 3.1.4 Maybe . 11 3.1.5 Completable . 12 3.1.6 Operators . 13 3.1.7 Observable vs. Iterable . 16 3.1.8 Hot and Cold Observables . 16 3.2 Eclipse Vert.x . 16 3.2.1 Concepts . 17 3.2.2 Example . 18 4 Mail Theory 19 4.1 SMTP . 19 4.2 Internet Message Format . 20 4.3 MIME Mail . 21 4.3.1 MIME Structure . 21 5 Architecture 24 6 Implementation 26 6.1 SMTP In . 26 6.2 MailParser . 27 6.2.1 Block hierarchy . 28 6.2.2 ReactiveStorage . 29 6.2.3 MimeLines . 30 6.2.4 Parsing Process . 31 6.3 MailStream . 34 6.4 MailStreamFactory . 37 6.5 Processing Steps . 38 6.5.1 Receive mail . 38 6.5.2 Forward mail . 42 Table of Contents vii 7 Extended Libraries 44 7.1 Vertx-Mail-Client . 44 8 Tests and Measurements 46 8.1 Reactivity Test . 46 8.2 Memory Test . 48 8.2.1 Blueglacier MIME Parser . 49 8.2.2 MailParser and MailStream . 49 8.2.3 MailParser and MailStream with deletion . 49 8.2.4 Results . 50 8.3 Connections Test . 51 8.3.1 Classic server . 51 8.3.2 Vert.x server . 53 8.4 Load Test . 55 8.4.1 Localhost . 57 8.4.2 Server to Server . 59 9 Conclusion 62 Literature 64 1 Introduction 1 1 Introduction Reactive and event-based mail processing represents a strategy for processing emails and their mail parts iteratively and non-blocking. Usually emails are sent to the server in one piece before they are further processed. With the reactive and event-based approach, the server is able to read single lines from the mail and process them immediately. Therefore, reading and processing is interleaved and there is less blocking time. The reactive and event-based approach provides key advantages.