Erlang OTP-Anwendungsdesign

8

Ich habe Schwierigkeiten, mich mit dem OTP-Entwicklungsmodell zu beschäftigen, da ich einen Code in eine OTP-App umwandeln kann.

Ich mache im Wesentlichen einen Web-Crawler und ich weiß nicht genau, wo ich den Code platzieren soll, der die eigentliche Arbeit erledigt.

Ich habe einen Supervisor, der meinen Arbeiter startet:

%Vor%

In diesem Design ist der Crawler Worker verantwortlich für die eigentliche Arbeit:

%Vor%

do_crawl erzeugt eine ziemlich große Anzahl von Prozessen und Anforderungen, die die Arbeit des Crawlens über HTTP übernehmen.

Frage ist letztlich: Wo soll der eigentliche Crawl passieren? Wie ich oben gesehen habe, habe ich mit verschiedenen Möglichkeiten experimentiert, um die eigentliche Arbeit auszulösen, aber ich vermisse noch immer ein Konzept, das wesentlich dafür ist, wie die Dinge zusammenpassen.

Hinweis: einige der OTP-Rohrleitungen sind der Kürze halber weggelassen - die Rohrleitungen sind alle da und das System hängt alles zusammen

    
Toby Hede 11.03.2011, 22:02
quelle

3 Antworten

11

Ich entschuldige mich, wenn ich Ihre Frage falsch beantwortet habe.

Ein paar Vorschläge, die ich machen kann, um Sie in eine richtige Richtung zu führen (oder was ich für eine richtige Richtung halte):

1 (Eher geringfügig, aber immer noch wichtig) Ich empfehle, inet Startcode aus diesem Worker zu holen und ihn in den Anwendungsstatup-Code (appname_app.erl) zu schreiben. Soweit ich sagen kann, verwenden Sie Bewehrungsvorlagen, also sollten Sie diese haben.

2 Jetzt auf wichtige Teile. Um das Supervisor -Modell von OTP voll auszunutzen, wäre es unter der Annahme, dass Sie eine große Anzahl von Crawlern erstellen möchten, sehr sinnvoll, simple_one_for_one zu verwenden Supervisor anstelle von one_for_one (lesen Sie Ссылка für weitere Details, aber wesentlicher Teil ist : simple_one_for_one - ein vereinfachter one_for_one Supervisor, bei dem alle untergeordneten Prozesse dynamisch Instanzen des gleichen Prozesstyps hinzugefügt werden, dh denselben Code ausführen. Anstatt nur einen Prozess zur Überwachung zu starten, geben Sie tatsächlich eine Art "Vorlage" an - zum Starten von Arbeitsprozessen, die echte Arbeit leisten. Jeder Arbeiter dieser Art wird mit supervisor gestartet: start_child / 2 - Ссылка . Keiner dieser Arbeiter wird gestartet, bis Sie sie explizit starten.

2.1 Abhängig von der Art Ihrer Crawler müssen Sie möglicherweise beurteilen, welche Art von Neustart-Strategie Sie für Ihre Mitarbeiter benötigen. Im Moment hast du es in deiner Vorlage als permanent eingestellt (du hast jedoch eine andere Art von betreutem Kind). Hier sind Ihre Möglichkeiten:

%Vor%

Sie möchten vielleicht etwas wie:

%Vor%

Ich habe es mir erlaubt, vorübergehende Neustarts für diese Kinder vorzuschlagen, da dies für diese Art von Arbeitern sinnvoll ist (Neustart, wenn sie die Arbeit nicht ausgeführt haben und nicht, wenn sie normal ausgeführt wurden)

2.2 Sobald Sie sich um die obigen Punkte gekümmert haben, wird Ihr Vorgesetzter eine beliebige Anzahl dynamisch hinzugefügter Arbeitsprozesse bearbeiten; und es überwacht und startet (falls nötig) jeden von ihnen neu, was Ihrer Systemstabilität und Verwaltbarkeit einen großen Beitrag leistet.

3 Nun, ein Worker-Prozess. Ich würde annehmen, dass jeder Crawler einige bestimmte Zustände hat, in denen er in jedem gegebenen Moment sein könnte. Aus diesem Grund würde ich vorschlagen, gen_fsm (Finite-State-Maschine, mehr über sie verfügbar bei Ссылка ). Auf diese Weise sollte jede gen_fsm-Instanz, die Sie Ihrem Supervisor dynamisch hinzufügen, ein Ereignis an sich selbst in init / 1 senden (mit Ссылка ).

Etwas allein die Linien von:

%Vor%

Beachten Sie, dass Ihre Arbeit entweder in diesem gen_fsm-Prozess enthalten sein könnte oder Sie in Erwägung ziehen, je nach Ihren speziellen Anforderungen einen separaten Prozess zu erstellen.

Möglicherweise möchten Sie mehrere Statusnamen für verschiedene Crawling-Phasen haben, wenn dies für erforderlich erachtet wird.

Wie auch immer, hoffen Sie, dass dies Ihnen hilft, Ihre Anwendung etwas OTP-mäßig zu gestalten. Bitte lassen Sie mich wissen, wenn Sie Fragen haben, ich werde gerne etwas hinzufügen, wenn nötig.

    
Yurii Rashkovskii 12.03.2011, 11:47
quelle
3

Behalten Sie tatsächlich jeden Zustand in Ihrem gen_server im Auge?

Wenn die Antwort ja lautet, sieht es so aus, als würden Sie die Dinge richtig machen. Beachten Sie, dass mit der obigen Implementierung zwei Crawls nicht gleichzeitig ausgeführt werden können, da Nachrichten serialisiert werden. Wenn Sie gleichzeitige Crawls benötigen, finden Sie hier die Antwort auf meine Frage .

Wenn die Antwort nein ist, können Sie möglicherweise den Server und den Supervisor abzweigen und einfach das Anwendungsmodul für einen beliebigen Initialisierungscode verwenden, wie in hier .

Schließlich lhttpc und ibrowse gelten als bessere Alternativen zu Inets. Ich verwende lhttpc in der Produktion auf meinen Ad Servern und es funktioniert super.

    
David Weldon 11.03.2011 23:48
quelle
2

Meine Lösung für dieses Problem wäre es, in die "Jobs" -Anwendung von Erlang Solutions zu schauen, die verwendet werden kann, um Jobs zu planen (dh Seiten anfragen) und ein getrenntes System jeden Job behandeln, die Nebenläufigkeit binden und so weiter.

Sie können dann neue URLs in einen Prozess crawl_sched_mgr einspeisen, der die URLs filtert und dann neue Jobs erzeugt. Sie können dies auch den Anfragenden selbst überlassen.

Wenn Sie keine Jobs verwenden möchten, ist der Vorschlag von Yurii der richtige Weg.

    
I GIVE CRAP ANSWERS 12.03.2011 16:43
quelle

Tags und Links