This page is a translated version of the page Proton and the translation is 100% complete.

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

Odkazy pro vývojáře Protonu

Související odkazy

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.