Wysoka skalowalność wspomina tutaj flagi funkcji:
5 rzeczy toksycznych dla skalowalności , „5. Brak flag funkcji”
Czym dokładnie są flagi funkcji?
Wysoka skalowalność wspomina tutaj flagi funkcji:
5 rzeczy toksycznych dla skalowalności , „5. Brak flag funkcji”
Czym dokładnie są flagi funkcji?
Odpowiedzi:
`` Flaga funkcji '' (lub Przełącznik funkcji ) to możliwość łatwego włączania / wyłączania funkcji (podsekcji) aplikacji w:
Wydaje mi się, że przykładem jest to, że przydatne jest posiadanie kontroli, aby nieco zmniejszyć zestaw funkcji, jeśli trzeba, powiedzmy, zmniejszyć zapytania db, jeśli obciążenie jest zbyt duże.
Jest jednak mnóstwo innych powodów , dla których warto to wykorzystać - jednym z głównych jest włączenie ciągłego dostarczania : wprowadzanie rzeczy do produkcji / na żywo, ale wyłączanie / przełączanie funkcji, dopóki nie zostanie ukończona. Często używamy czegoś, co nazywamy „plikiem cookie dla programistów”, aby pokazać niedokończone funkcje tylko zespołowi programistów. W ten sposób możemy przetestować częściowo ukończoną pracę w środowisku produkcyjnym (o tak! Czy jest lepsza integracja?) Na wielu wydaniach / wdrożeniach, zanim ją „odblokujemy” (zakończymy) i stanie się ona widoczna dla publiczności.
Oto prosty pakiet, który pomoże ci to zrobić na ziemi ASP.NET MVC: https://github.com/cottsak/DevCookie (pełne ujawnienie: jestem autorem)
Fowler ma również znacznie dłuższy artykuł niż ten, do którego link znajduje się powyżej, z dużo większą ilością szczegółów .
Ten post (również na stronie Fowlera) wyjaśnia różne typy strategii przełączania . DevCookie obsługuje strategię opartą na mainline / trunk i jest w artykule nazywane „ przełącznikiem wydania ”.
Odpowiedź Adila podkreśla, że istnieje wiele terminów i powodów, dla których możesz potrzebować części tej infrastruktury. Pamiętaj, że możesz potrzebować tylko niektórych z tych rzeczy. Na przykład mogę chcieć tylko włączyć prosty i sprawny przepływ pracy przy wdrażaniu / dostarczaniu, więc wystarczy prosta infrastruktura. Jeśli następnie zdecydujesz się przejść do pełnego eksperymentu #leanstartup z A / B, testami kohortowymi i takimi rzeczami, jak kontrolowane wdrażanie, powinieneś rozważyć narzędzie analityczne (np. Heap ), które ułatwia te metodologie rozwoju oparte na danych jako odrębne rozwiązanie . Infrastruktura przełączająca, która wykonuje wszystkie powyższe czynności, doprowadzi do rozdęcia i niepotrzebnej złożoności.
Jeśli dotarłeś tak daleko, może zechcesz przejrzeć inne moje przemyślenia na temat Mainline Development, przełączania funkcji i innych głupich pomysłów, takich jak TEST, QA, SIT, STAND, CROUCH .
Flaga funkcji to technika wyłączania niektórych funkcji aplikacji poprzez konfigurację bez wdrażania nowego kodu.
Flagi funkcji odgrywają kluczową rolę w schemacie CI, w którym funkcje są stale wdrażane, ale niekoniecznie „wypuszczane” do produkcji.
Więcej informacji tutaj:
-- EDYTOWAĆ:
Flagi funkcji, przełączniki funkcji, eksperymenty i kontrolowane wdrażanie to synonimy prostego, ale potężnego pomysłu: oddzielne wdrażanie kodu od wdrażania funkcji. Mówiąc najprościej, jest to możliwość przeniesienia zatwierdzeń funkcji do produkcji, jednocześnie wybierając, kto z Twoich klientów - jeśli w ogóle ktoś - zobaczy tę funkcję.
Zostały spopularyzowane częściowo przez Gatekeepera Facebooka . LiX LinkedIn to kolejny dobry przykład.
Przyjęcie tego prostego pomysłu stanowi podstawę wielu najlepszych praktyk, w tym:
Ciągłe wdrażanie / dostarczanie - wiele kodów wypychanych do produkcji w ciągu jednego dnia.
Trunk / Mainline Development - gałęzie funkcji powinny być tworzone tylko dla żądań ściągnięcia, a nie dla długotrwałego rozwoju funkcji.
Nigdy więcej pociągów zwalniających, które grzęzną.
QA / Perf Testing in Production - prawdziwa kontrola jakości i testowanie wydajności odbywa się na infrastrukturze produkcyjnej z ruchem produkcyjnym. Nie trać czasu na tworzenie rozbudowanych laboratoriów wydajnościowych i środowisk przejściowych.
Eksperymentowanie - dowiedz się, w jaki sposób nowa funkcja wpływa na Twoje wskaźniki KPI.
Unikanie poprawek lub wycofywania kodu w przypadku wystąpienia problemów - zarówno poprawki, jak i wycofywanie kodu są stresujące, zajmują dużo czasu i prowadzą do większej liczby problemów niż to konieczne. Zamiast tego wyłącz tę funkcję lub zmniejsz ją.
Inni wspominali o bibliotekach open source. Dobrym przykładem pełnego rozwiązania - takiego jak Gatekeeper i LiX - jest Split . Pracuję dla Splitu.
Jest tu wiele świetnych odpowiedzi, a wszystkie dotyczą ważnej, podstawowej definicji spopularyzowanej w poście Martina Fowlera :
Są to fragmenty kodu, które „[pozwalają] zespołom modyfikować zachowanie systemu bez zmiany kodu”.
Więc historycznie myśleliśmy o nich jako reprezentowane przez pseudokod:
if(app_settings["beta-mode"] == "true")
showAwesomeNewGui();
else
sameOldSnoozeFeset();
To całkowicie dokładny sposób myślenia o tym, a zarówno Matt, jak i Adil ładnie go rozwijają, korzystając z różnych taktycznych przypadków użycia flagi funkcji.
Ale chciałbym zaproponować poprawioną definicję, która odzwierciedla, jak rzeczywistość ewoluowała w ciągu sześciu lat i zmieniła się od czasu, gdy dotnetdev zadał pierwotne pytanie. Pracuję dla Rollout.io , platformy flagowej , więc miałem miejsce w pierwszym rzędzie na tę ewolucję.
Mówiąc najprościej, flagi funkcji nie są już tylko sposobem włączania i wyłączania niektórych funkcji w aplikacji. To tak, jakby odpowiedzieć „co to jest pozycja faktury”, mówiąc „to opis i kwota w walucie”. To prawda, ale nie prowadzi to do szerszego punktu samej faktury.
Flagi funkcji to taktyczne fragmenty nadrzędnego rozwiązania strategicznego w nowoczesnym oprogramowaniu. Są to środki, dzięki którym odraczasz ważną logikę decyzyjną w swoim kodzie do czasu wykonania, kiedy masz więcej informacji. I, co być może najważniejsze, nie występują już w izolacji, z pojedynczym sprawdzeniem, czy numer wersji jest większy niż 2,7, czy nie; organizacje, które ich używają, zazwyczaj uwzględniają je w ramach kompleksowego, ogólnosystemowego podejścia do produktu.
Jak wspominali inni, Facebook i LinkedIn są pionierami w tym zakresie, ale w 2018 roku robi to całe mnóstwo organizacji. Odkładają pytania związane z logiką decyzyjną o środowisko wykonawcze jako część strategii rozwoju, strategii operacyjnej (lub strategii DevOps, jeśli chcesz) i strategii produktu. Oto przykłady takich pytań.
Aby mieć aplikację, która odracza znaczną liczbę takich decyzji do czasu wykonania, nie możesz wrzucać flag funkcji do swojej aplikacji w sposób ad-hoc lub pogrzebać się w długu technicznym. W dzisiejszych czasach potrzebujesz kompleksowej strategii zarządzania flagami funkcji, która obejmuje kilka różnych składników.
A więc ostatecznie, czym są flagi funkcji?
Cóż, są ważną częścią szerszej strategii posiadania aplikacji, którą można dostosować zarówno do potrzeb technicznych, jak i rynkowych.
Flaga funkcji (znana również jako przerzucanie funkcji lub przełączanie funkcji ) to przełącznik służący do włączania lub wyłączania potencjalnie kosztownej funkcji w razie potrzeby (np. Gdy witryna jest obciążana nieoczekiwanym ruchem). To da ci trochę czasu, zanim zwiększysz skalę lub dopóki skok obciążenia nie zniknie.
W mojej firmie mieliśmy na to własne rozwiązanie. Stworzyliśmy usługę udostępniającą do pobrania plik config ( .json
) dla każdej aplikacji. W tej konfiguracji zapisaliśmy flagi funkcji. Na podstawie tej konfiguracji aplikacja może wyświetlać lub ukrywać bieżącą funkcję. (Na przykład pokaż lub ukryj element menu na pasku bocznym).
Stworzyliśmy również wewnętrzną stronę administracyjną, na której możemy skonfigurować flagi funkcji. Przez jakiś czas działało całkiem nieźle, ale później chcielibyśmy przeprowadzić kierowanie na użytkowników i testy A / B. Aby rozwijać się samodzielnie Wydawało się to zbyt trudne, więc wybraliśmy rozwiązanie innej firmy. Jak już wspomniano, istnieje na to wiele rozwiązań.
Wybraliśmy ConfigCat, ponieważ jednocześnie obsługuje niestandardowe grupy docelowe i procentowe wdrożenie. Możesz sprawdzić obsługiwane pakiety SDK Open Source na github .
Flagi funkcji (lub przełączniki funkcji) umożliwiają zdalne włączanie funkcji w aplikacji bez konieczności ponownego kompilowania / ponownego wdrażania aplikacji. Dzięki temu możesz wdrożyć kod w środowisku produkcyjnym, ale nie zwolnij funkcji, dopóki nie będziesz gotowy. Możesz kierować reklamy do określonych użytkowników, więc możesz udostępnić użytkownikom beta nową funkcję do przetestowania.
W naszej firmie korzystaliśmy wcześniej z LaunchDarkly i innych sugestii od FeatureFlags.io . Próbowaliśmy również użyć zdalnej konfiguracji Firebase, aby spróbować to zadziałać, ale okazało się, że nie było to odpowiednie do tego celu.
Skończyło się na opracowaniu naszej własnej wersji o nazwie Bullet Train , którą udostępniliśmy jako open source. Łączy w sobie zarówno flagi funkcji / przełączniki, jak i zdalną konfigurację.
Flagi funkcji są używane do kilku celów. Ogólną ideą jest delegowanie kontroli nad tym, który użytkownik widzi daną funkcję, do jakiegoś zdalnego pulpitu nawigacyjnego lub zaplecza.
Gdy funkcja zostanie oznaczona w kodzie, możesz teraz skorzystać z kilku metod, aby określić, który użytkownik widzi ją w Twojej aplikacji: 1. Włącz / Wyłącz - pokaż funkcję wszystkim użytkownikom lub żadnemu z nich. 2. Stopniowe udostępnianie - pokazuj tę funkcję tylko procentowi użytkowników, a następnie stopniowo wyświetlaj ją wszystkim użytkownikom. 3. Kierowanie - pokaż funkcję określonym użytkownikom na podstawie właściwości lub cech tego użytkownika.
Narzędzia, które pomagają w kontrolowaniu flag funkcji (wartości logiczne) i konfiguracji funkcji (łańcuchy, liczby itp.) Są zwykle nazywane platformami zarządzania funkcjami. Istnieje świetna usługa do zarządzania funkcjami o nazwie Configz.io
Z punktu widzenia kodowania flaga funkcji może być tak prosta, jak if
instrukcja, która otacza nowy fragment kodu, który piszesz. Kiedy if
instrukcja uzyska wartość true (flaga funkcji jest włączona), zostanie wykonany nowy kod.
W rzeczywistym przykładzie dostarczania oprogramowania, powyższe if
stwierdzenie będzie oceniane inaczej w zależności od środowiska, w którym oprogramowanie jest uruchomione. Na przykład, jeśli aplikacja jest wykonywana na serwerze kontroli jakości, flaga funkcji zwróci wartość „prawda”, a nowa funkcja będzie widziany. Jeśli jest wykonywany na serwerze produkcyjnym, flaga funkcji zwróci wartość false i funkcja zostanie ukryta.
Z własnego doświadczenia podczas mojej kariery korzystałem z flag funkcji w następujący sposób:
Oddzielenie wdrożeń kodu od udostępniania funkcji klientom. To było moje pierwsze pierwsze użycie flag funkcji w naszym procesie rozwoju. Użyliśmy go do usunięcia zależności między naszym zespołem ds. Marketingu i produktu a zespołem inżynierów, który zajmował się rozwojem i wydaniami. Flagi funkcji pozwoliły nam wdrożyć nasz kod na tygodnie przed premierą, podczas gdy poprzednio wdrażaliśmy kod w noc przed wydaniem!
Testowanie w produkcji. Zanim użyliśmy flag funkcji, kiedy publikowaliśmy nasz kod, było to zdarzenie typu wszystko albo nic, albo wszyscy nasi klienci otrzymali tę funkcję, albo żaden z nich nie. Użyliśmy flag funkcji, aby umożliwić nam wprowadzenie nowej funkcji dla niewielkiego odsetka użytkowników na raz. Pozwoliło nam to zebrać cenne opinie i dane na temat nowej funkcji bez ryzyka jakichkolwiek potencjalnych problemów dla całej bazy klientów.
Włączanie / wyłączanie funkcji dla każdego środowiska w cyklu rozwojowym. Używaliśmy tego szeroko w programowaniu, aby umożliwić znacznie płynniejszy proces wdrażania - mamy potok ciągłej integracji / ciągłego wdrażania, w którym użycie flag funkcji jest kluczowe.
Tworzenie wyłącznika awaryjnego. Niektóre funkcje naszej aplikacji otuliliśmy flagą funkcji, która pozwala nam „zabić” tę funkcję w przypadku jakichkolwiek problemów z aplikacją w tym czasie. Na przykład, jeśli znajdziemy się pod dużym obciążeniem, jesteśmy w stanie wyłączyć niektóre nieistotne funkcje witryny, aby pomóc w rozwiązaniu problemu.
Możesz przeczytać więcej o flagach funkcji tutaj.
Możesz dodawać flagi funkcji do swojego kodu na wiele sposobów.
Na początku napisanie własnej biblioteki może wydawać się dobrym pomysłem i zwykle można zacząć w ten sposób. Jednak wkrótce możesz napotkać problemy, gdy chcesz zaimplementować bardziej zaawansowane przypadki użycia flag funkcji, takie jak wprowadzenie do procentu użytkowników lub kierowanie na określone grupy użytkowników. Innym problemem związanym z tworzeniem własnej implementacji flag funkcji jest to, że jeśli używasz wielu języków, będziesz musiał wielokrotnie implementować kod.
Najlepszym i najłatwiejszym sposobem korzystania z flag funkcji jest skorzystanie z internetowej usługi zarządzania flagami funkcji, takiej jak Floodgate . W ten sposób możesz wykorzystać platformę do całego podnoszenia ciężarów, co pozwala skoncentrować się na tworzeniu funkcji dla swojej aplikacji.
Oto przykład dodawania flagi funkcji Floodgate do aplikacji przy użyciu zestawu .NET SDK.
using FloodGate.SDK;
var floodgateClient = new FloodGateClient("API-KEY");
var flag = floodgateClient.GetValue("a-new-feature", false);
if (flag)
{
// Execute the code for my new feature here...
}
Jeśli pracujesz w zespole programistów i nie używasz flag funkcji i występują problemy z wdrożeniami i zarządzaniem kodem w zespole. Korzystanie z flag funkcji może być świetnym sposobem rozwiązania tych problemów. Jest też fajny efekt uboczny flag funkcji, które przyspieszają rozwój twoich zespołów.
Martin Fowler podaje tutaj bardzo dogłębny opis flag funkcji , z którymi polecam się zapoznać.
Rozumiem, że flagi funkcji pomagają w bramkowaniu funkcjonalności, decydując, którzy użytkownicy otrzymają określone funkcje.
Załóżmy na przykład, że chcesz, aby tylko użytkownicy wersji beta widzieli nową funkcję. Możesz „włączyć” tę funkcję dla użytkowników wersji beta, a pozostali użytkownicy jej nie zobaczą.
LDUser user = new LDUser("user@test.com");
boolean showFeature = ldClient.toggle("your.feature.key", user, false);
if (showFeature) {
// application code to show the feature
}
else {
// the code to run if the feature is off
}
Mam testowanie flagi fabularnych LaunchDarkly w niektórych testach front-end JS A / B - wydaje się działać dobrze. Możesz również sprawdzić tę witrynę, aby znaleźć przełączniki funkcji i biblioteki flag funkcji .
Feature Flags w zasadzie daje możliwość włączania i wyłączania funkcji bez dokonywania jakichkolwiek zmian w kodzie lub wydawania nowej wersji. Jest to ważne rozwiązanie, szczególnie dla twórców aplikacji mobilnych, ponieważ nie mają oni żadnej kontroli nad użytkownikami, którzy aktualizują ich aplikację do nowej wersji.
Istnieje kilka firm oferujących tę usługę programistom aplikacji mobilnych.
W mojej firmie używamy flag funkcji dla każdej nowej funkcji, którą wprowadzamy w naszej aplikacji SaaS. Oprócz korzyści płynących z wydajności pozwala nam również stopniowo wprowadzać nowe funkcje - najpierw wprowadzając nowe funkcje dla zaawansowanych użytkowników, uzyskując od nich opinie i improwizując, zanim będziemy mogli udostępnić je wszystkim użytkownikom.
Pozwala nam również dostosować ofertę do indywidualnych użytkowników - zaawansowani użytkownicy chcą wszystkich funkcji; prości użytkownicy mogą chcieć tylko podstawowych rzeczy i mogą być zdezorientowani przez wszystkie potężne, złożone funkcje. Pozwala również naszemu zespołowi sprzedaży na sprzedaż wyższą.
I oczywiście, jak zauważyli inni, jeśli stwierdzimy, że funkcja powoduje pogorszenie wydajności, możemy po prostu ją wyłączyć (dla wszystkich klientów lub dla jednego klienta, który powoduje problem).