Ihre Dokumente gehören Ihnen

Ihre Seiten werden erzeugt und Ihnen sofort zurückgegeben. Diese Seite sagt, was der Dienst aufbewahrt und wie lange.

Zusammenfassung

Stellen Sie sich den Schlüsseldienst an der Ecke vor. Sie geben Ihren Schlüssel ab, die Maschine kopiert ihn in einer Minute, und Sie gehen mit beiden in der Tasche hinaus. Ein Dokument bei uns anzufordern funktioniert genauso. Sie übergeben eine Beschreibung der gewünschten Seite, die Maschine erzeugt sie, und die Seite kommt zu Ihnen zurück.

Während die Seite erzeugt wird, liegt das Gesendete im Arbeitsspeicher der Maschine, so wie eine Telefonnummer gerade lange genug im Kopf bleibt, um sie zu wählen. Die fertige Seite reist zu Ihnen zurück, und dieser Speicher geht direkt an das nächste wartende Dokument.

Fünf Dinge werden aufgezeichnet, und das ist die ganze Liste. Eine Zeile für die Abrechnung, die den Namen Ihres Kontos nennt, den Zeitpunkt, wie viele Seiten herauskamen, und eine Nummer, die für genau dieses Dokument steht. Eine Zeile in unserem eigenen Protokoll für jedes herauskommende Dokument, mit dem Kurznamen Ihres Kontos, wie viele Seiten herauskamen und wie lange es dauerte. Ihre eigenen Schriften, wenn Sie welche senden und Ihr Konto dafür eingerichtet ist: Die Formen der Buchstaben kommen in einen eigenen Ordner, damit Sie sie nie ein zweites Mal senden müssen. Eine kurze Warnung, wenn Ihre Beschreibung etwas erwähnt, das die Arbeit dann auslässt, etwa ein Bild, das niemand platziert hat, oder eine Farbe, mit der nichts gemalt wurde. Und eine Zeile, wenn wir eine Anfrage abweisen oder wenn unsere eigene Maschine ausfällt, damit jemand geweckt werden kann.

Können wir nicht verwenden, was Sie uns gesendet haben, sagt die Antwort das und zeigt Ihnen genau die Stelle, die es aufgehalten hat — das falsche Wort, die Zeile, in der es stand, den Namen, den Sie einem Bild gegeben haben —, damit Sie es ohne Raten berichtigen können. Diese Antwort geht an Sie zurück, in der Antwort auf Ihre eigene Anfrage, und dort endet sie: Keine dieser Stellen wird aufgeschrieben, und keine wird an irgendjemanden weitergegeben. Die Zeile, die wir schreiben, sagt nur, dass eine Anfrage abgewiesen wurde, und unter welcher einer festen Handvoll von Rubriken.

Was auf Ihren Seiten steht, bleibt zwischen Ihnen und ihnen. Die Wörter, die Zahlen, die Namen Ihrer Kunden, das gesendete Foto: Sie kommen an, werden erzeugt und gehen mit der Datei. Die Abrechnung weiß, wie viele Dokumente erzeugt wurden und wie viele Seiten sie ergaben, und das ist alles, was sie weiß.

Die fertige Datei enthält, was Sie verlangt haben, und nur das. Geben Sie ihr einen Titel, und sie hat diesen Titel; geben Sie ihr ein Datum, und sie hat dieses Datum. Alles andere darin stammt von Ihnen; deshalb ergibt zweimal dasselbe Dokument zu verlangen dieselbe Datei bis zum letzten Buchstaben. Das können Sie selbst in einer Minute prüfen, und es ist uns lieber, Sie tun es.

Zwei Dinge, die Sie verlangen können, ändern das, und nur diese zwei: ein Feld, das den Zeitpunkt der Erzeugung des Dokuments verlangt, und ein Schloss, das Sie setzen, ohne seinen Schlüssel anzugeben, der dann zufällig gezogen wird.

Diese Website und die Maschine, die erzeugt, sind zwei getrennte Dinge. Hier haben Sie ein Konto, eine Rechnungsadresse und Ihren API-Schlüssel. Dort sind Sie ein Kurzname und eine Seitenzahl. Und wenn Sie das Ganze lieber in Ihren eigenen Räumen hätten, wird diese Maschine zur Installation dort verkauft; dann bleiben Ihre Seiten von Anfang bis Ende innerhalb Ihrer eigenen Mauern.

Beide stehen auf Maschinen in Frankreich: diese Website und die Maschine, die erzeugt. Ein Dienst, den wir für einen unserer Kunden betreiben, läuft ebenfalls auf Maschinen dort.

Technisch

Der Weg, den eine Anfrage von Anfang bis Ende nimmt, die Prozessgrenzen, die sie überquert, und jeder Schreiber im Dateisystem, den sie in Gang setzt.

Der Weg der Anfrage, von Anfang bis Ende

Ein POST trägt einen Multipart-Body. Der Teil namens json_data enthält die Dokumentbeschreibung; jeder andere Teil ist eine Binärdatei, die die Beschreibung unter diesem Namen anspricht — eine PDF-Vorlage, ein Bild, ein ICC-Profil, ein XMP-Paket, das XML einer Rechnung. Der Body ist durch eine konfigurierte Obergrenze beschränkt, 512 Mebibyte im Auslieferungszustand des Dienstes.

Jeder Teil wird in den Speicher gelesen, und die Beschreibung wird in den Anfragebaum deserialisiert, den der Dienst durchläuft; der Rohtext wird verworfen, sobald das Parsen zurückkehrt. Das Schreiben selbst läuft auf einem blockierenden Worker, sodass die asynchrone Laufzeit weiter bedient, während ein langes Dokument zusammengesetzt wird.

Die Engine gibt einen Byte-Vektor zurück, der unverändert zum Antwort-Body wird: keine temporäre Datei, kein Zwischenbereich, keine zweite Kopie. Der Anfragebaum, die benannten Teile und die fertigen Bytes gehören dieser Aufgabe und werden freigegeben, wenn sie zurückkehrt — in Rust ist die Freigabe strukturell, nicht geplant.

Die Unit läuft mit einem privaten temporären Verzeichnis, das die Maschine verwirft, wenn der Dienst anhält.

Die beiden Schreiber im Dateisystem

Zwei Codepfade im ganzen Dienst erzeugen eine Datei, und jeder hat seine Berechtigung.

  • Der Schriftenspeicher pro Kunde. Für einen Kunden, der mit eigenen Schriften zeichnen darf, werden die Schriften, die seine Erzeugungen tatsächlich verwendet haben, in ein nach ihm benanntes Verzeichnis geschrieben und beim Start wieder in den Speicher geladen. Es ist Serverzustand statt eines Caches: Die Bytes kommen einmal an, und jede spätere Anfrage nennt sie nur noch.
  • Die Alarmwarteschlange. Eine Zeile wird geschrieben, wenn der Dienst auf seiner eigenen Seite ausfällt, und sie wird gekürzt, sobald die Website sie übernimmt. Stapel gehen alle fünf Sekunden oder bei hundert Alarmen hinaus, je nachdem, was zuerst eintritt, und die Warteschlange wird beim Start zurückgelesen, sodass ein Neustart keinen verliert. Sie enthält keinen Pfad, keinen Dateinamen und nichts, was Ihre Anfrage gewählt hat — eine Kennung, die Art des Fehlers, den Kundennamen, eine Störungsnummer und einen Zeitpunkt.

Was das Protokoll enthält

Vier Anweisungen stehen auf dem Erzeugungspfad. Ein herausgekommenes Dokument schreibt den Kundennamen, den diese Website mit dem Aufruf gesendet hat, die Nummer, die diese Website dem Aufruf gegeben hat, die Seitenzahl und die beiden Zeitmessungen. Eine Warnung der Engine schreibt den Kundennamen und die Art der Warnung; die Erzeugung gelingt in jedem Fall — eine Warnung ist eine Beobachtung, nie eine Ablehnung. Ein Fehler des Dienstes selbst schreibt eine Störungsnummer, den Kundennamen und was kaputtging. Eine Ablehnung schreibt den Kundennamen, den Status und die Art.

Eine Warnung nennt eine Ressource, die die Anfrage mitgeliefert und die Seite nie gemalt hat, unter der Bezeichnung, die die Engine ihr beim Schreiben der Datei zugewiesen hat: ein fortlaufender Name für eine Schrift, ein anderer für ein Bild, ein weiterer für einen Farbraum. Ihre eigenen Zeichenketten bleiben in Ihrem Dokument.

Die übrigen Anweisungen betreffen Lebenszyklus und Alarmierung: den Socket, den der Dienst beim Start bindet, den Stopp, um den er gebeten wurde, den Zustand des Vertrauensspeichers, gegen den der Alarm-Feed prüft, und was diese Website auf einen Stapel Alarme geantwortet hat. Die Ausgabe geht auf die Standardausgabe, auf der Stufe, die das Journal der Maschine sammelt.

Was eine Ablehnung zurückbringt

Jeder Fehler, den der Dienst auslöst, wird in den Body der Antwort auf den Aufruf serialisiert, der ihn ausgelöst hat, und recht viele davon zitieren die Anfrage. Das ist Absicht: Ein Kunde muss sehen können, welcher Teil dessen, was er gesendet hat, abgelehnt wurde.

Die Familien, die zitieren, was Sie gesendet haben: der ganze Text eines Codes, der sich nicht zeichnen ließ, für jede der fünf Arten von Barcodes und quadratischen Codes; der Wert, an dem die Beschreibung nicht gelesen werden konnte, mit Zeile und Spalte im gesendeten Body; das störende Zeichen, der Text einer Zahl und ein Variablenname in einem Koordinatenausdruck; die Namen, die Sie einer Schrift, einem Bild, einem Anhang, einer Vorlage, einer Ebene, einem Farbraum, einem Verlauf, einer Zeichnung, einem Feld gegeben haben, und eine Artikelkennung. Über die Engine darunter: ein Zeichen des gezeichneten Textes, der Titel eines Artikels und ein Feldname mit seiner Antwort.

All das geht an den Kunden, der es gesendet hat, in der Antwort auf diesen Aufruf, und endet dort. Nichts davon wird protokolliert, nichts davon erreicht die Platte, und nichts davon wird weitergemeldet: Die einundzwanzig Anweisungen, die überhaupt etwas schreiben, wurden einzeln gelesen, und keine davon enthält eine Fehlermeldung.

Eine Sache von Ihnen reist weiter: Der Kundenname, den diese Website mit Ihrem Aufruf sendet, wird bei jedem Aufruf in das Protokoll des Dienstes geschrieben und in die Alarmwarteschlange — und von dort an diese Website —, wenn der Dienst auf seiner eigenen Seite ausfällt. Sonst reist nichts von Ihnen: Dieser Fehler beantwortet Sie mit einem Satz ohne Dateisystempfad, und der Pfad bleibt im Protokoll des Betreibers.

Authentifizierung und was dem Dienst mitgeteilt wird

Die Authentifizierung gehört zu dieser Website. Ihr Aufruf kommt hier an, der API-Schlüssel wird mit den Konten dieser Website abgeglichen, und der Aufruf wird mit einem Header, der den Kundennamen enthält, an den Dienst weitergeleitet. Der Dienst hat keine eigene Authentifizierung: Er antwortet auf dem Loopback dieser Maschine, und nichts außerhalb davon kann ihn erreichen; dieser Header ist alles, was ihm über den Kunden mitgeteilt wird, und er ermittelt die Berechtigungen — eigene Schriften, Seitenobergrenze — aus einer TOML-Datei, die er einmal beim Start liest.

Einen API-Schlüssel zu widerrufen heißt daher, diese Liste neu zu schreiben, wirksam ab der nächsten Anfrage. Der Schlüssel selbst erreicht den Dienst nie.

Das eigene Zugriffsprotokoll dieser Website, eine gesonderte Frage

Der Frontend-Server vor diesen Seiten führt ein Zugriffsprotokoll, wie jeder Frontend-Server: Quelladresse, den Kontonamen, wenn die Anfrage einen trug, Zeitstempel, Anfragezeile, Statuscode und Body-Größe, Referrer, User-Agent und die beiden Namen des angefragten Hosts. Es wird täglich rotiert, und vierzehn komprimierte Tage werden aufbewahrt.

Es wird zu einem Zweck gelesen, der Gewinnung von Besuchern: welche Crawler vorbeikommen und in welchem Rhythmus, ob ein Agent, der sich als Crawler ausgibt, sich auch als solcher auflösen lässt, welche veröffentlichten URLs nie abgerufen wurden und welche Besucher über eine Suche kamen. Statische Dateien werden direkt ausgeliefert und stehen nicht in seinen Zeilen.

Eine Adresse, die wiederholt URLs verlangt hat, die diese Website nie ausgeliefert hat, wird in eine kurze Sperrliste geschrieben, die der Frontend-Server liest, und ihre späteren Anfragen werden an der Tür beantwortet. Diese Liste enthält Adressen und sonst nichts und wird von Hand bearbeitet.

Auf Ihrer eigenen Infrastruktur

Die Alarmmeldung wird aktiviert, indem ein Endpunkt genannt wird, an den gemeldet wird. Ohne einen solchen startet keine Meldeaufgabe und es gibt keine Warteschlangendatei, sodass der Schriftenspeicher der einzige Schreiber im Dateisystem bleibt — und das nur für einen Kunden, der Anspruch auf eigene Schriften hat.

Der Mechanismus Zeile für Zeile

Die Zusagen mit ihren Zahlen. Jede Zeile davon wurde aus den Quellen des Dienstes abgelesen und gilt für die Version im Produktivbetrieb.

Die Anfrage, Schritt für Schritt

  • Ein Endpunkt erzeugt ein PDF, über einen Multipart-Body. Der Teil namens json_data trägt die Beschreibung als Text; jeder andere Teil wird unter seinem eigenen Namen gehalten und ist die Binärdatei, die die Beschreibung unter diesem Namen anspricht.
  • Jeder Teil wird vollständig in den Speicher gelesen, nie in eine temporäre Datei gestreamt. Die Beschreibung wird in den Anfragebaum deserialisiert, und der Rohtext wird verworfen, sobald das zurückkehrt.
  • Der Anfragebaum und die benannten Teile werden in einen blockierenden Worker verschoben, und beide werden verworfen, wenn er zurückkehrt. Nichts überdauert die Aufgabe: kein Cache nach Anfrage, kein gemerktes Layout, kein gemeinsamer Puffer mit dem letzten Dokument.
  • Die Body-Obergrenze ist eine Einstellung des Dienstes, 512 Mebibyte im Auslieferungszustand. Eine Seitenobergrenze kann pro Server und pro Kunde gesetzt werden, und die engere der beiden gilt.

Die beiden Dateien, die der Dienst schreibt

Zwei Codepfade im ganzen Dienst erzeugen eine Datei. Hier ist jeder davon, Feld für Feld.

  • Der Schriftenspeicher pro Kunde: Für einen Kunden, der mit eigenen Schriften zeichnen darf, werden die Schriften, mit denen eine erfolgreiche Erzeugung tatsächlich Text gesetzt hat, in ein nach diesem Kunden benanntes Verzeichnis geschrieben und beim Start zurückgelesen. Er wächst um genau das — die Schriften, die ein herausgekommenes Dokument wirklich verwendet hat. Jede Datei wird unter einem temporären Namen im selben Verzeichnis geschrieben und an ihren Platz umbenannt, sodass ein gleichzeitiges Lesen nie eine halbe Schrift sieht; der Name ist auf ASCII-Buchstaben, Ziffern, einen Punkt, einen Bindestrich und einen Unterstrich beschränkt, höchstens 64 Zeichen.
  • Die Alarmwarteschlange: ein JSON-Objekt pro Zeile, fünf Felder und keine anderen — eine Kennung, über die die Website Duplikate entfernt, die Art des Fehlers, der Kundenname, wo eine Erzeugung schuld ist, die Störungsnummer, unter der dem Kunden geantwortet wurde, und ein Zeitpunkt nach RFC 3339. Sie wird nur geschrieben, wenn der Dienst auf seiner eigenen Seite versagt, nie bei einem Aufruf, den er als fehlerhaft abgelehnt hat. Ein Stapel geht alle fünf Sekunden oder bei hundert Alarmen hinaus, je nachdem, was zuerst eintritt, und wird aus der Datei gekürzt, sobald diese Website ihn übernommen hat; die Warteschlange wird beim Start zurückgelesen, und diese Website entfernt Duplikate über die Kennung, sodass ein Abgleich, dessen Bestätigung verloren ging, einmal gemeldet wird. Die Störungsnummer ist die einzige Brücke zum Protokoll des Dienstes: Der Alarm sagt, dass es etwas anzusehen gibt, und die Protokollzeile unter dieser Nummer sagt, was es war.

Die vier Anweisungen auf dem Erzeugungspfad

Vier Protokollanweisungen stehen auf dem Erzeugungspfad, und das sind alle vier. Ein herauskommendes Dokument schreibt Ihren Kundennamen, die Nummer, die diese Website dem Aufruf gegeben hat, wie viele Seiten herauskamen und wie lange es dauerte. Eine Warnung der Engine schreibt Ihren Kundennamen und welche Art von Warnung es war. Ein Fehler auf unserer Seite schreibt eine Störungsnummer, Ihren Kundennamen und was hier schiefging. Eine Ablehnung schreibt Ihren Kundennamen, den Status, welche Art von Ablehnung es war und — bei den drei Arten, die Sie nicht durch Ändern Ihrer Anfrage aufheben können — dieselbe Nummer, unter der Ihnen geantwortet wurde.

Ein PDF, das Sie zum Ergänzen senden, nimmt einen eigenen Weg, und auf ihm steht eine weitere Anweisung: Sobald die Datei zurückkommt, schreibt sie Ihren Kundennamen, die Nummer, die diese Website dem Aufruf gegeben hat, und die Seitenzahl der Datei. Eine Warnung, ein Fehler und eine Ablehnung auf diesem Weg werden von denselben drei Anweisungen wie oben geschrieben.

Diese Nummer steht aus einem einzigen Grund in Ihrer Antwort: damit ein Anruf wegen einer Ablehnung die Protokollzeile erreicht, unter der sie geschrieben wurde, statt einer Zeile, die ihr ähnelt. Sie wird bei einer fehlenden Lizenz, einem Dokument über seiner Seitenobergrenze und einem Fehler auf unserer Seite mitgegeben, sonst nie — eine Beschreibung, die wir nicht lesen konnten, nennt bereits den zu korrigierenden JSON-Schlüssel, und eine Nummer dort wäre eine Einladung, uns wegen Ihrer eigenen Tippfehler anzurufen. Die Nummer zählt nichts und nennt keine unserer Maschinen.

Weder eine Warnung noch eine Ablehnung wird mit ihrem Satz benannt: Jede wird mit einem Wort aus einer im Quellcode festgelegten Liste benannt, sodass nichts, was Ihre Anfrage gewählt hat, darüber ins Protokoll gelangen kann. Ein Wort dieser Liste liest sich wie eine ungezeichnet gebliebene Ressource, eine Schrift, deren Lizenz ihre Einbettung verbietet, eine Beschreibung, die wir nicht lesen konnten — die Art der Sache, nie die Sache selbst.

Alles andere liegt außerhalb des Erzeugungspfads: der beim Start gebundene Socket, der Stopp, um den der Dienst gebeten wurde, der Zustand des Vertrauensspeichers, gegen den der Alarm-Feed prüft, und die Antwort dieser Website auf einen Stapel Alarme. Der Dienst schreibt auf die Standardausgabe, auf der Stufe, die das Journal der Maschine sammelt.

Was in einer Antwort zurückreist

Eine erfolgreiche Erzeugung antwortet mit 200 und dem PDF als Body, dazu mit der Zahl seiner Seiten, der Zahl der Dinge, die der Engine beim Erzeugen auffielen, und der Zahl der Befunde, die zwischen ihm und den von der Anfrage verlangten Normen stehen, jeder Hinweis und jeder Befund neben seiner Zählung, sowie mit der Nummer, unter der der Aufruf erfolgte, sofern eine angegeben wurde. Wie lange es gedauert hat, geht ins Protokoll des Dienstes und reist in nichts zurück.

Eine Anfrage, mit der der Dienst nichts anfangen konnte, antwortet mit einem Statuscode und einem Satz in Klartext, der nennt, was sie aufgehalten hat: 400 für eine unbrauchbare Beschreibung, 402 für das, was eine Evaluierungslizenz einem Lizenzschlüssel überlässt, 413 für einen Body oder eine Seitenzahl über der Obergrenze, 500 für einen Fehler auf Seiten des Dienstes.

Dieser Satz zitiert genau das Stück Ihrer Anfrage, das sie aufgehalten hat, damit Sie es korrigieren können, ohne zu raten. Jeder Fehler, den der Dienst auslöst, reist ausnahmslos auf diesem Weg zurück, im Body der Antwort auf den Aufruf, der ihn ausgelöst hat — und hier steht, was ein zitiertes Stück sein kann.

  • Der Text eines Codes, der sich nicht zeichnen ließ, vollständig, für jede der fünf Arten von Barcodes und quadratischen Codes. Die Antwort nennt, welche der fünf die Anfrage meinte.
  • Der Wert, an dem die Beschreibung nicht gelesen werden konnte, mit Zeile und Spalte, an denen er im gesendeten Body steht.
  • In einem Ausdruck, der dort geschrieben wurde, wo eine Koordinate erwartet war, das Zeichen, an dem das Lesen anhielt, der Text der Zahl und der Name der Variablen.
  • Der Name, den Sie einer Schrift, einem Bild, einem Anhang, einer Vorlage, einer Ebene, einem Farbraum, einem Verlauf, einer Zeichnung oder einem Feld gegeben haben, und die Kennung eines Artikels.
  • Über die darunterliegende Engine: ein Zeichen des gezeichneten Textes, wo keine Schrift es zeichnen konnte, der Titel eines Artikels und der Name eines Feldes mit der darin stehenden Antwort.

Wo eine Ablehnung endet

Eine Ablehnung ist die Antwort auf Ihren eigenen Aufruf, und ihr ganzes Leben endet dort. Wird ein Aufruf abgewiesen, wird eine Zeile geschrieben: Ihr Kundenname, der Status, ein Wort aus einer festen Liste, das sagt, welche Art von Ablehnung es war, und — bei den drei Arten, die Sie nicht durch Ändern Ihrer Anfrage aufheben können — die Nummer, unter der Ihnen geantwortet wurde. Der Satz, den Sie erhalten haben, steht nicht darin, ebenso wenig etwas, das Ihre Anfrage gewählt hat: Die einundzwanzig Anweisungen im Dienst, die überhaupt etwas schreiben, wurden einzeln gelesen, und keine davon enthält eine Fehlermeldung. Nichts davon wird weitergemeldet — die Zeile, nach der diese Website abrechnet, enthält einen Kundennamen, einen Zeitpunkt, eine Kennung und eine Seitenzahl, sonst nichts.

Eine Sache von Ihnen reist weiter, und sie reist zweimal; das ist alles. Ihr Kundenname steht in jeder Zeile, die der Dienst über Ihren Aufruf schreibt. Er reist ein zweites Mal, wenn der Dienst auf seiner eigenen Seite versagt — eine Erzeugung, die in ihm fehlgeschlagen ist, oder ein Kundenschriftenspeicher, den er nicht lesen oder schreiben konnte: Der Alarm, den er auslöst, nennt den Kunden, für den gearbeitet wurde, damit derjenige, der geweckt wird, weiß, wessen Dokument es war, und er trägt keinen Pfad, keinen Dateinamen und nichts, was Ihre Anfrage gewählt hat. Sonst reist nichts von Ihnen: Ein Fehler beantwortet Sie mit einem Satz ohne Pfad aus unserem Dateisystem, und dieser Pfad bleibt im Protokoll des Betreibers, wo er hingehört.

Was das fertige PDF trägt

  • Das Dokumentinformations-Dictionary und das XMP-Paket werden aus dem gebaut, was Ihre Anfrage angibt: Titel, Autor, Thema, erzeugendes Programm. Ein JSON-Schlüssel, den Ihre Anfrage weglässt, fehlt auch in der Datei.
  • Ein Erstellungsdatum erscheint, wenn Ihre Anfrage eines angibt: Jedes Datum in einem fertigen Dokument stammt aus der Anfrage, die es verlangt hat. Wo eine Anfrage ausdrücklich verlangt, den Zeitpunkt der Erzeugung auf die Seite zu setzen, antworten die Uhr des Hosts und die genannte Zeitzone, und das geschriebene Datum ist das, was sie anzeigen.
  • Jedes PDF hat eine Dateikennung. Diese hier ist ein Hash der gerade geschriebenen Bytes, sodass dieselbe Beschreibung zweimal dieselbe Datei ergibt — so können Sie zwei Erzeugungen vergleichen und selbst sehen, dass sie bytegenau identisch sind. Zwei Anfragen ergeben jedes Mal eine neue Datei und damit eine neue Kennung: eine, die verlangt, den Zeitpunkt der Erzeugung auf die Seite zu setzen, und ein Schutz ohne eigenen Schlüssel, den der Dienst mit einem zufällig gewählten Schlüssel verschlüsselt.
  • Mit einem Lizenzschlüssel kommen die Seiten sauber heraus. Eine Kopie mit Testlizenz setzt auf jede erzeugte Seite ein Wasserzeichen und sagt das auf der Seite; außerdem zeichnet sie die Wörter als Formen statt als Buchstaben, trägt keine Schrift in der Datei, schreibt kein Formular und keine Struktur und lehnt eine Handvoll Aufrufe ganz ab. Die Seite darüber, was eine Lizenz gewährt, listet sie einzeln auf.

Ihr API-Schlüssel, und der Name, der für ihn steht

Der API-Schlüssel lebt auf dieser Website, und diese Website ist der einzige Ort, der ihn hält. Er wird hier gelesen, einmal pro Aufruf, und in einen Kundennamen verwandelt, der in einem eigenen Header an den Dienst weiterreist, sodass der Dienst den Schlüssel nie sieht; er arbeitet mit dem Namen.

Auf dieser Website wird pro Erzeugung eine Zeile geführt, die nur ergänzt wird: das Konto, der Kundenname, unter dem erzeugt wurde, die Kennung dieser Erzeugung, der Zeitpunkt und die Seitenzahl. Aus einem Monat solcher Zeilen wird eine Rechnung summiert, und die Zeile nennt den Kunden statt des API-Schlüssels, sodass das Widerrufen eines Schlüssels die Spur unversehrt lässt.

Das Zugriffsprotokoll der Website, vollständig

Der Frontend-Server vor diesen Seiten schreibt eine Zeile pro Anfrage: die Quelladresse, den Kontonamen, wenn die Anfrage einen trug, den Zeitstempel, die Anfragezeile, den Statuscode und die gesendeten Bytes, den Referrer, den User-Agent und die beiden Namen des angefragten Hosts.

Die Zeilen werden täglich rotiert, und vierzehn komprimierte Tage werden aufbewahrt; der älteste Besuch liegt also zwei Wochen zurück. Seine Zeilen sind die Seiten, die ein Besucher abgerufen hat; die eigenen statischen Dateien der Website und die an der Tür abgewiesenen Anfragen werden direkt ausgeliefert.

Ein Bericht im eigenen Code der Website wertet diese Zeilen aus, um fünf Fragen zur Gewinnung von Besuchern zu beantworten: welche Crawler vorbeikamen und in welchem Rhythmus, ob ein Agent, der sich als Crawler ausgibt, sich auch als solcher auflösen lässt, welche veröffentlichten URLs kein Crawler abgerufen hat, welche Besucher über eine Suche kamen und wo sie landeten, und welche Anfragen etwas suchten, das diese Website nie ausgeliefert hat.

Eine Adresse, die wiederholt URLs verlangt hat, die diese Website nie ausgeliefert hat, wird in eine kurze Sperrliste geschrieben, die der Frontend-Server liest, und ihre späteren Anfragen werden an der Tür beantwortet. Diese Liste ist kurz, enthält Adressen und sonst nichts und wird von Hand bearbeitet.

Den Dienst selbst betreiben

Ohne einen Endpunkt zum Melden gestartet, behält der Dienst seine eigenen Fehler in seinem Protokoll, und die beiden Schreiber reduzieren sich auf den Schriftenspeicher allein. Ohne ein Schriftverzeichnis für einen Kunden gestartet, leben dessen Schriften im Adressraum der Erzeugung, die sie verwendet hat, und genau so lange, wie sie dauert.

Wohin als Nächstes

Wie ein Programm seine Seiten anfordert Die Bedingungen, zu denen dies verkauft wird Fragen Sie uns alles, was diese Seite ausgelassen hat

Die Preise ansehen Die Beispiele ansehen