The Twelve-Factor App

IV. Usługi wspierające

Traktuj usługi wspierające jako przydzielone zasoby

Usługą wspierającą jest każda, z której aplikacja korzysta przez sieć jako część normalnego działania. Zaliczamy do nich np. magazyny danych (takie jak MySQL albo CouchDB), systemy wysyłania/kolejkowania wiadomości (takie jak RabbitMQ czy Beanstalkd), usługi SMTP do zewnętrznej wysyłki emaili (np. Postfix) oraz systemy cachowania pamięci (np. Memcached).

Usługa wspierająca taka jak baza danych jest zazwyczaj zarządzana przez tych samych programistów, którzy zajmują się wdrażaniem aplikacji. Dodatkowo aplikacja może również korzystać z usług oferowanych przez osoby trzecie. Do przykładów zaliczają się usługi SMTP (Postmark),usługi zbierające metryki (New Relic czy Loggly), usługi przechowywania danych (takie jak Amazon S3), czy również usługi dostępne przez publiczne API (jak np. Twitter, Google Maps, lub Last.fm).

Aplikacje 12factor nie rozróżniają usług lokalnych od zewnętrznych. Dla aplikacji wszystkie są załączonymi zasobami, dostepnymi przez adres URL lub inny standard zdefiniowany w konfiguracji. Przy wdrożeniu aplikacji nie może być problemów ze zmianą lokalnej bazy MySQL na oferowaną przez zewnętrznego usługodawcę (np. Amazon RDS) bez żadnych zmian w kodzie aplikacji. Podobnie lokalny serwer SMTP może być zamieniony na zewnętrzną usługę SMTP (taką jak Postmark) bez zmian kodu. W obu przypadkach zmiana powinna wystąpić jedynie w konfiguracji aplikacji.

Każda usługa jest traktowana jako zasób. Zasobem będzie np. baza MySQL; dwie bazy danych (używane do shardingu) w warstwie aplikacji) kwalifikują się jako dwa odrębne zasoby. Aplikacja 12factor traktuje te bazy danych jako załączone zasoby, co wskazuje, że nie są z nią trwale powiązane.

Produkcyjne wdrożenie aplikacji korzystajace z czterech usług wspierających.

Zasoby mogą być dołączane i odłączane jeśli zajdzie taka potrzeba. W momencie gdy baza danych aplikacji z powodu usterek sprzętowych nie działa poprawnie, administrator może przełączyć bazę danych aplikacji na nowy serwer odtworzoną z ostatniego zapisu przywracania danych. Obecna produkcyjna baza może więc zostać przełączona bez żadnych zmian w kodzie aplikacji.