Proton
Proton
Vygenerujte PDF verzi libovolného článku Wikipedie
|
Proton umožňuje uživatelům stáhnout si článek z Wikipedie jako PDF. Podporuje tisk vhodný pro stolní i mobilní zařízení.
Technické podrobnosti
Proton je jednoduchá služba, která generuje PDF pomocí Chromium řízené knihovnou Puppeteer. Skládá se ze dvou složek:
- Systém front, který řadí všechny požadavky do fronty (protože generování PDF je náročné na zdroje i čas)
- Vykreslovací kód, který dává pokyn Puppeteer vytisknout požadovanou stránku jako PDF.
Proton je strukturován jako webová služba a je napsán v JavaScriptu s využitím Node.js.
Jeho cílem je poskytovat krásné a čisté soubory PDF.
Na wikinách Wikimedie bude Proton zastoupen na RESTBase.
Používá knihovnu puppeteer-core, prohlížeč chromium není součástí puppeteer-core a je nutné jej stáhnout samostatně.
Proměnná prostředí PUPPETEER_EXECUTABLE_PATH
se používá k odkazování na spustitelný soubor chromium.
Nejlepší způsob, jak vygenerovat článek PDF, je použít funkci prohlížeče zabudovanou do PDF. Tato metoda poskytuje nejlepší výsledky a navíc nám umožňuje znovu použít stávající styly tisku dostupné pro desktopovou i mobilní verzi Wikipedie. Systém nezpracovává požadované HTML. Články se tisknou stejným způsobem, jako se zobrazují v náhledu tisku v prohlížeči uživatele. Vygenerované soubory PDF jsou velmi podobné (ne-li totožné) s tím, čeho může kdokoli dosáhnout pomocí Tisk do PDF ve svém prohlížeči Chrome. Pro dosažení nejlepších výsledků Proton zakáže JavaScript. Provádí se za účelem deaktivace všech transformací dynamického obsahu, jako jsou pomalu načítané obrázky na mobilních stránkách.
Poznámka: pro některé uživatele se může PDF, které získají z tisku prohlížeče, a to, které získají ze služby Proton, trochu lišit, protože konfigurace písem v uživatelském systému může mít specifická nastavení související s hintingem/kerningem písem.
QueueSystem – systém front
Systém Queue je srdcem rendereru Proton. Zpracovává tok každé úlohy prostřednictvím logiky čekání/zpracování/časový limit. Každá úloha ve frontě může mít dva stavy – čekání a zpracování. Systém front nejenže umožňuje spouštění určitého počtu úloh současně, ale také zpracovává časové limity úloh a jejich zrušení. Kvůli složitosti fronty jsme museli implementovat řešení, které nám umožňuje:
- omezit počet čekajících úloh
- po definovaném počtu sekund odmítnout čekající úlohu
- omezit počet vykreslovacích úloh (protože vykreslování PDF vyžaduje spoustu zdrojů)
- záchranná síť pro odmítnutí renderovacích úloh, které zabírají příliš mnoho času
- pro úsporu zdrojů, když je požadavek přerušen, fronta se pokusí zrušit úlohu, nezáleží na tom, v jakém stavu se přerušená úloha nachází (zpracování/vykreslování).
Systém front je založen na slibech Bluebird a využívá funkci zrušení (o které viz #Známé hacky níže).
Renderer
Renderer je jednoduchá fasáda pro přístup k metodě page.pdf()
z knihovny loutkářů.
Renderer je zodpovědný za nastavení správného prostředí chromium a zobrazované oblasti prohlížeče, vyžádání stránky Wikipedie a volání funkce page.pdf()
.
Navíc dohlíží na proces prohlížeče.
Každé vykreslení spustí novou instanci Chromium a po úspěšném vykreslení se proces Chromium ukončí.
Aby se šetřily zdroje a udržoval náš systém v dobrém stavu, Renderer požádá Chromium o vypnutí, a pokud z nějakého důvodu prohlížeč stále zpracovává požadavek, odešle procesu SIGKILL
do prohlížeče, aby se ujistil, že se tak nestalo. Nepoužívejte další CPU ani paměť.
Další funkce
Když se úloha nezdaří, protože fronta je plná nebo vyprší časové limity úlohy v jakémkoli stavu, služba Proton vrátí odpověď 503 Služba není k dispozici
s hlavičkou Retry-After.
Záhlaví Retry-After nástroje pro vyrovnávání zatížení, aby se shromáždil daný uzel Proton, aby mohl dokončit zpracování aktuálních úloh.
Systém nastaví hlavičku Retry-After na konfigurační hodnotu app.config.render_queue_timeout
.
Po této době by měly být všechny úlohy zpracování dokončeny a systém by měl být schopen přijímat nové úlohy.
Známé hacky
Proton využívá funkci zrušení BBPromise.
Funkce zrušení je ve výchozím nastavení zakázána, aby bylo možné zrušení slibu povolit BBPromise.config() musí být voláno pomocí cancellation:true
vlajka.
Trik je v tom, že konfigurace BBPromise musí být nastavena před vytvořením jakéhokoli příslibu.
Ale protože Proton používá Service-runner a Service-runner používá BBPromises pro všechno, dokonce ani čtení konfiguračních souborů nebylo snadné implementovat.
V aplikaci Proton nelze nastavit příznak cancellation
, protože kód Proton je spuštěn po inicializaci Service-runner.
Také to nemohlo být definováno v konfiguraci, protože Service-runner používá sliby při čtení konfigurace.
Ve verzi 2.6.6 Service-runner zavádí použití proměnné prostředí APP_ENABLE_CANCELLABLE_PROMISES
, která musí být nastavena na hodnotu true.
Pokud proměnná prostředí není nastavena, inicializace Protonu se nezdaří s chybou.
Pro podporu široké škály jazyků se doporučuje nainstalovat do nasazení následující fonty:
- fonts-liberation
- fonts-noto
- fonts-noto-cjk
- fonts-noto-cjk-extra
- fonts-noto-color-emoji
- fonts-noto-extra
- fonts-noto-mono
- fonts-noto-ui-core
- fonts-noto-ui-extra
- fonts-noto-unhinted
Vývoj
Vývoj probíhá v Proton service Git repository. Kontrola kódu probíhá v Gerritu. Chcete-li si nastavit účet, viz Začínáme. Služba používá šablonu projektu ServiceTemplateNode a dodržuje všechna pravidla vývoje služby.
Spouštění testů
Chcete-li spustit všechny testy swagger a mocha testy:
npm test
Chcete-li spustit všechny testy pokrytí:
npm run coverage
Technická dokumentace
- README.md má dokumentaci o vnitřních částech Protonu a konfiguračních proměnných.
- Nasazení Kubernetes – jak nasadit službu Proton (například).
- Reading/Web/Projects/Print Styles – Styly tisku a omezení jsou totožné se styly tisku v prohlížeči.
Odkazy pro vývojáře Protonu
- úložiště Proton Gerrit
- Proton GitHub úložiště - zrcadleno od Gerritu
- dokumentace k loutkářům
- dokumentace BBPromise
Související odkazy
- PDF export
- RESTBase : caching / storage API proxy pro PDF generované Protonem
- wikitech:Proton: podrobnosti o monitorování, nasazení a toku dat
Kontakt
Pokud potřebujete pomoc nebo máte dotazy/zpětnou vazbu, můžete nás kontaktovat na #wikimedia-infrastructure připojit se nebo konferenci wikitech-l.
Proton je udržována Product Infrastructure .
Jak získat pomoc:
|