Beerway-orientierte Programmierung in F # [2]

Einführung

In diesem Blogpost setzen wir fort, wo wir vom vorherigen Blogpost aufgehört haben. Wir wollen Folgendes tun:

  1. Konfigurieren Sie die Literale so, dass keiner der übermäßig hartcodierten Mumbo-Jumbos fortgesetzt wird. Wir speichern unsere Konfigurationen, die beim Start des Prozesses von MongoDb über MLab geladen werden. Der einzige fest codierte Wert ist der der Verbindungszeichenfolge, mit der eine Verbindung zum Mongo-Server hergestellt werden soll.
  2. Generalisierung des Schedulers zur Ausführung der Pipeline für mehrere Brauereien.
  3. Planen Sie den Prozess so, dass er rechtzeitig ausgeführt wird.
  4. Dauerhafte Kratzer über MongoDb.

Wir werden die Verwendung von Expecto testen und die Protokollierung über Logary im dritten Blogpost dieser Reihe hinzufügen.

Vorbereitungen

Ich habe von Atle Rudshaug einen tollen Hinweis zur Behandlung des NoDifference-Falls erhalten. Wir sollten den NoDifference-Fall als Erfolg behandeln. Wenn kein Unterschied festgestellt wird, senden Sie keinen Text aus.

Unser geändertes Fehlermodul sieht nun so aus:

Compare-Funktion, die jetzt einfach die Differenz zwischen dem aktuellen und dem vorherigen Kratzer berechnet.

Die Benachrichtigungsfunktion muss nun anhand der Kardinalität des eingestellten Unterschieds feststellen, ob ein Text gesendet werden soll oder nicht.

Außerdem fügen wir unserem Datensatz ein neues Element vom Typ "Zeichenfolge" mit dem Namen "Name" hinzu, um die Richtung der Verallgemeinerung der Pipeline zu bestimmen, die später hervorgehoben wird.

Unsere Datei BeerInfo.fs mit dem aktualisierten Datensatztyp und den statischen Elementen für Chiron sieht jetzt folgendermaßen aus:

Konfiguration und Generalisierung

Lassen Sie uns alle hartcodierten Literale loswerden und die Pipeline auf eine Liste von Brauereien verallgemeinern, anstatt nur auf die von Tired Hands. Bisher haben wir gute Arbeit geleistet, um die gemeinsamen Komponenten zu trennen. wir können es besser machen! Lassen Sie uns alle Konfigurationen in die Cloud verschieben und die Pipeline verallgemeinern.

Aufbau

Wir werden die kostenlose Stufe von MLab verwenden, um alle Konfigurationsdetails beizubehalten. Zunächst erstellen wir eine Datenbank mit dem Namen „beerwayoriented programming“ und fügen die Konfigurationssammlung hinzu. Dies sollte ein ziemlich einfacher Prozess sein. Die Benutzeroberfläche von MLab ist fantastisch! Bei Problemen können Sie sich gerne an mich wenden.

Die Konfigurationssammlung sollte vorerst ein Dokument mit unseren Twilio-Details enthalten. Wir können später entscheiden, ob wir hier weitere Felder hinzufügen möchten.

Die Konfigurationssammlung sieht, sobald sie beibehalten wurde, ungefähr so ​​aus:

{
    "_Ich würde": {
        $ oid: 5976bcc1734d1d6202aa1556
    },
    "MyPhoneNumber": "Ihre Telefonnummer",
    "AccountSID": "dein twilio account sid",
    "AuthToken": "dein twilio auth token",
    "SendingPhoneNumber": "Ihre twilio sendende Telefonnummer"
}

Kommunikation mit der Datenbank

Als Nächstes fügen wir den mongocsharpdriver und die MongoDB.FSharp-Referenz über PAKET hinzu. Wenn Sie sich nicht sicher sind, wie Sie dies tun sollen, lesen Sie bitte den vorherigen Beitrag, der Informationen zur Verwendung von PAKET enthält, und überprüfen Sie, ob auf die Abhängigkeiten erfolgreich verwiesen wurde.

Vor dem Fehlermodul erstellen wir ein neues Modul mit dem Namen "Db" in der Datei "Common.fs", das alle unsere datenbankbezogenen Funktionen enthält. Darüber hinaus wird der gesamte Code für die Deserialisierung / Serialisierung der JSON-Datei, an der wir zuvor im Compare-Modul gearbeitet haben, entfernt.

Das einzige Literal, das fest codiert wird, ist das der Verbindungszeichenfolge. [Wenn Sie kreativ sein möchten, können Sie dies mithilfe der FSharp.Configuration-Bibliothek in einer Konfigurationsdatei aufbewahren.]

Alles in allem sieht das Db-Modul so aus:

Weitere Details zu Mongo + F # CRUD finden Sie in meinem vorherigen Blogpost, den Sie hier finden. Und das geänderte Alarmmodul mit der Konfiguration sieht jetzt so aus:

Verallgemeinerung

Der einzige brauereispezifische Code befindet sich im brauereispezifischen Parser und in der Datei mit der Hauptfunktion, die die Pipeline für die Brauerei enthält. Wir müssen das Compare-Modul ändern, um die Json-Datei basierend auf dem Namen der Brauerei zu erstellen.

Das geänderte BeerwayOrientedProgramming-Modul sieht nun folgendermaßen aus:

Und die geänderte Vergleichsfunktion im Compare-Modul sieht nun so aus:

Planer

Der nächste Schritt ist das Einrichten eines Schedulers, um die breweryPipelines auf einem Timer auszuführen. Hierfür laden wir Quartz.NET für die Planung über PAKET herunter.

Nach diesem F # -Snippet können wir auf einfache Weise einen geplanten Prozess zum Durchlaufen aller Brauereien einrichten und die Details für immer alle 2 Sekunden analysieren.

Wir fummeln nicht an unserer Bierbeschaffung herum, sondern machen den Prozess, dass Bier auf Unternehmensebene eine Panzerfaust bekommt.

Anhaltende Kratzer

Fügen wir zum Schluss die Möglichkeit hinzu, unsere Scrapes in derselben MongoDb-Datenbank mit „beerwayorientierter Programmierung“ zu speichern.

Aus dem gleichen Grund, warum wir unseren Prozess so verallgemeinern, dass andere Brauerei-Parser problemlos hinzugefügt werden können, werden wir die Sammlungen der Datenbank auf der Grundlage des Brauereinamens benennen, nachdem wir die JSON-Serialisierung und -Deserialisierung in und aus einer Datei entfernt haben.

Zunächst werden alle alten JSON-Serialisierungs- und Deserialisierungskomponenten entfernt, indem der BeerInfo-Datensatztyp erneut überprüft und die MongoDb-ID vom Typ BsonObjectId hinzugefügt wird, nachdem die auf Chiron basierenden statischen Elemente entfernt wurden.

Das neue BeerInfo-Modul sieht folgendermaßen aus:

Wenn Sie bemerken, haben wir den Typ "Beers" von einer FSharp-Liste in "One" in "System.Generic.Collections" geändert, um dem C # MongoDb-Treiber zu entsprechen, auf dem die F # One erstellt wurde.

Wir werden jetzt den Verweis auf Chiron entfernen, da wir ihn nicht mehr benötigen. Öffnen Sie dazu die Befehlspalette [Cmd + Umschalt + P] und navigieren Sie nach dem Öffnen der fsproj-Datei auf folgende Weise zu PAKETs Referenz zum Entfernen:

Sobald der Verweis auf Chiron entfernt ist, werden wir unserem Db-Modul einige Methoden hinzufügen, die zum Erstellen neuer IDs sowie zum Abrufen des vorherigen Scrapes relevant sind.

Wenn beim Versuch, die Sammlung mit dem Namen der Brauerei abzurufen, eine Ausnahme auftritt, wird versucht, sie im with-Block neu zu erstellen.

Wir haben die Komplexität des Behaltens der Scrapes aus dem Compare-Modul auf das Db-Modul reduziert, in dem wir das letzte Scrape greifen. Wir prüfen, ob der letzte Scrape null ist [nachdem wir ihn in ein Objekt umgewandelt haben, um die Nullfähigkeit zu prüfen, da wir FirstOrDefault () verwenden].

Unsere aktualisierte TiredHandsScraper.scrape-Funktion sieht nun folgendermaßen aus:

Die Funktion getBeerNamesFromTiredHands sieht folgendermaßen aus:

Zusätzlich wird unser Compare-Modul deutlich vereinfacht:

Es ist großartig, dass unsere Schrammen fortbestehen, was durch Auschecken unserer Dokumente in der TiredHands-Sammlung bestätigt werden kann:

Fazit

Wir sind definitiv weit gekommen, indem wir die Konfiguration hinzugefügt, verallgemeinert, geplant und beibehalten haben. Wie bereits erwähnt, enthält der nächste und letzte Beitrag in dieser Reihe einige Tests und Protokollierungen, um diese einmal einfache Anwendung in eine voll entwickelte umzuwandeln.

Ich freue mich wie immer über Ihr Feedback!