Zarządzanie konfiguracją w aplikacji Erlang

Muszę rozpowszechnić jakąś statyczną konfigurację w mojej aplikacji. Jaka jest najlepsza praktyka, aby to zrobić?

Widzę trzy opcje:

  1. wywołaj {[0] } bezpośrednio, gdy moduł wymaga uzyskania wartości konfiguracyjnej.
    • Plus: prostsze niż inne opcje.
    • Minus: jak testować takie moduły bez podnoszenia całej sprawy aplikacji?
    • Minus: jak uruchomić dany moduł z inną konfiguracją (jeśli wymagane)?
  2. przekazuje konfigurację (pobraną z application:get_env) do modułów aplikacji podczas uruchamiania.
    • Plus: moduły są łatwiejsze do przetestowania, można je uruchomić z inną konfiguracją.
    • Minus: dużo kodu kotła. Zmiana formatu konfiguracji wymaga ustalenia kilku miejsc.
  3. przytrzymaj konfigurację wewnątrz oddzielnego procesu konfiguracji.
    • Plus: mniej lub bardziej bezpieczne podejście. Łatwiej śledzić, gdzie pewne parametr jest używany I zmienić te miejsca.
    • Minus: trzeba wywołać proces konfiguracji przed uruchomieniem modułów.
    • Minus: jak uruchomić dany moduł z inną konfiguracją (jeśli jest to wymagane)?
Author: Ivan Dubrov, 2011-06-03

5 answers

Innym podejściem jest przekształcenie danych konfiguracyjnych w moduł źródłowy Erlang, który udostępnia dane konfiguracyjne poprzez eksport. Następnie możesz zmienić konfigurację w dowolnym momencie w uruchomionym systemie, po prostu ładując nową wersję modułu konfiguracyjnego.

 13
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-03 04:21:42

Do statycznej konfiguracji w moich własnych projektach, Lubię opcję (1). Pokażę Ci kroki, które wykonuję, aby uzyskać dostęp do parametru konfiguracyjnego o nazwie max_widgets w aplikacji o nazwie factory.

Najpierw utworzymy moduł o nazwie factory_env, który zawiera:

-define(APPLICATION, factory).

get_env(Key, Default) ->
    case application:get_env(?APPLICATION, Key) of
        {ok, Value} -> Value;
        undefined -> Default
    end.

set_env(Key, Value) ->
    application:set_env(?APPLICATION, Key, Value).

Następnie w module, który wymaga odczytu max_widgets zdefiniujemy makro w następujący sposób:

-define(MAX_WIDGETS, factory_env:get_env(max_widgets, 1000)).

Jest kilka fajnych rzeczy o tym podejściu:

  • ponieważ użyliśmy application:set_env/3 i application:get_env/2, My nie trzeba uruchamiać aplikacji factory, aby nasze testy przeszły pomyślnie.
  • max_widgets pobiera wartość domyślną, więc nasz kod nadal będzie działał, nawet jeśli parametr nie jest zdefiniowany.
  • drugi moduł może użyć innej domyślnej wartości dla max_widgets.

Wreszcie, kiedy będziemy gotowi do wdrożenia, umieścimy sys.plik config w naszym katalogu priv i załaduj go -config priv/sys.config podczas uruchamiania. Pozwala nam to na zmianę parametrów konfiguracyjnych na podstawie węzła, jeśli pożądane. To oddziela konfigurację od kodu-np. nie musimy robić kolejnego commita, aby zmienić max_widgets na 500.

 10
Author: David Weldon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-05 19:32:03

Przydałby Ci się proces (może gen_server?), aby zapisać parametry konfiguracyjne w jego stanie. Powinno to ujawnić interfejs get / set. Jeśli wartość nie została jawnie ustawiona, powinna ona pobrać wartość domyślną.

-export([get/1, set/2]).

...

get(Param) ->
  gen_server:call(?MODULE, {get, Param}).

...

handle_call({get, Param}, _From, State) ->
  case lookup(Param, State#state.params) of
    undefined ->
      application:get_env(...);
    Value ->
      {ok, Value}
  end.

...

Możesz następnie łatwo makietę tego modułu w swoich testach. Łatwo będzie również zaktualizować proces o nową konfigurację w czasie wykonywania.

Możesz użyć dopasowania wzorców i krotek, aby powiązać różne parametry konfiguracyjne z różnymi Moduły:

set({ModuleName, ParamName}, Value) ->
  ...

get({ModuleName, ParamName}) ->
  ...

Umieść proces pod drzewem nadzoru, więc jest uruchamiany przed wszystkimi innymi procesami, które będą potrzebować konfiguracji.

OH, cieszę się, że nikt nie zasugerował parametryzowanych modułów Jak na razie:)

 7
Author: Roberto Aloi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 13:17:13

Zrobiłbym opcję 1 dla konfiguracji statycznej. Zawsze możesz przetestować, ustawiając opcje za pomocą application:set_env/3,4. Powodem, dla którego chcesz to zrobić, jest to, że testy aplikacji będą musiały uruchomić całą aplikację w dowolnym momencie. A możliwość ustawienia konfiguracji specyficznej dla testu w tym momencie jest naprawdę fajna.

Kontroler aplikacji działa domyślnie, więc nie jest problemem, że musisz przejść przez aplikację (i tak musisz to zrobić!)

Wreszcie, jeśli proces wymaga konkretnej konfiguracji, Powiedz TAK w danych konfiguracyjnych! Możesz zapisać dowolny termin Erlanga, w szczególności możesz zapisać termin, który umożliwia nadpisanie parametrów konfiguracyjnych dla określonego węzła.

Dla dynamicznej konfiguracji , prawdopodobnie lepiej będzie użyć gen_server lub najnowszych funkcji gproc, które pozwalają przechowywać taką dynamiczną konfigurację.

 3
Author: I GIVE CRAP ANSWERS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-03 11:17:47

Widziałem też, jak ludzie używają a .hrl (Erlang header file), gdzie cała konfiguracja jest zdefiniowana i dołączona na początku dowolnego pliku, który wymaga konfiguracji.

To sprawia, że bardzo zwięzłe wyszukiwania konfiguracji, i można uzyskać konfigurację dowolnej złożoności.

Wierzę, że można również przeładować konfigurację w czasie wykonywania, wykonując przeładowanie modułu gorącym kodem. Wadą jest to, że jeśli używasz konfiguracji w kilku modułach i przeładowujesz tylko jeden z nich, tylko ten jeden moduł zostanie zaktualizowany.

Jednak nie sprawdziłem, czy to działa w ten sposób i nie mogłem znaleźć ostatecznej dokumentacji, jak to zrobić .hrl i hot code reloading współdziałają, więc upewnij się, że dokładnie to sprawdzisz, zanim go użyjesz.

 0
Author: Shnatsel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 14:38:18