The Twelve-Factor App

IX. Zahoditelnost

Maximalizujte robustnost pomocí rychlého spouštění a korektního vypnutí.

Procesy twelve-factor aplikace jsou zahoditelné, to znamená, že mohou být kdykoliv spuštěny nebo vypnuty. Usnadňuje to elastické škálování, rychlé nasazování kódu, změny konfigurace a zvyšuje se robustnost celého produkčního nasazení.

Procesy by se měly snažit minimalizovat čas spuštění. Ideálně by procesu mělo zabrat jen pár sekund od spuštění příkazu, do doby, kdy je připraven přijímat požadavky nebo úlohy. Krátký čas spuštění přináší větší obratnost pro procesy zajišťující nasazení a škálování. Napomáhá také celkové robustnosti, protože správce procesů může v případě potřeby snadno přesouvat procesy na nové fyzické stroje.

Procesy se korektně ukončí po přijetí signálu SIGTERM od správce procesů. Pro webový proces znamená korektní ukončení to, že přestane naslouchat na příslušném portu (tedy začne odmítat nové požadavky), aktuálně běžící požadavky zpracuje a pak se vypne. V tomto modelu předpokládáme, že HTTP požadavky jsou poměrně krátké (ne delší než pár sekund). V případě dlouho trvajícího spojení by se měl klient umět znovu sám připojit, dojde-li ke ztrátě spojení.

Pro proces typu worker je korektní ukončení dosaženo vrácením aktuální úlohy zpět do pracovní fronty. Například v RabbitMQ může worker poslat NACK, u Beanstalkd se úloha vrátí do fronty automaticky, pokud se worker odpojí. Systémy postavené na zamykání, jako například Delayed Job musí uvolnit zámek pro záznam své úlohy. V tomto modelu předpokládáme, že všechny úlohy jsou opakovatelné, čehož se typicky dosáhne obalením výsledku do transakce anebo tím, že operaci učiníme idempotentní.

Procesy by měly být dostatečně robustní pro případ náhle smrti, dojde-li například k selhání podkladového hardwaru. I když se to stává velmi zřídka narozdíl od koretního ukončení signálem SIGTERM, stále se to ale může stát. Doporučený postup je použít robustní systém, jako je Beanstalkd, který vrací úlohy zpět do fronty v případě odpojení klienta nebo vypršení časového limitu. V každém případě, twelve-factor aplikace je navržena tak, aby zvládna neočekávané a nekorektní ukončení. Crash-only design je tedy pro tento koncept logickým východiskem.