Zadanie 6. Migracja danych¶
Implementacja wysyłania danych do serwisu rekomendacji¶
Pojawia się potrzeba biznesowa, aby zbierać informacje za każdym razem, kiedy ktoś chce pobrać szczegóły produktu.
Każdy request po produkt ma wysyłać do serwisu rekomendacji taką informację, z pomocą metody createImpression.
Moglibyśmy zaimplementować taką zmianę bezpośrednio w naszym kontrolerze, ale zdecydowaliśmy się wyseparować ten kontekst, bo nasza aplikacja wspiera stosowanie tzw. middleware.
Zdecydowaliśmy, że aby nie zaciemniać kontrolera, stworzymy middleware, który uruchomi się w łańcuchu razem z naszym kontrolerem.
Zastosowanie nowego middleware uzależnimy od nowej flagi.
1. Nowa flaga¶
Do tablicy w main/src/Flags.php dodaj klucz
2. Wstępna implementacja middleware¶
2.1. Utwórz plik main/src/Products/ProductImpressionMiddleware.php
Do konstruktora dodaj zależność od RecommendationsServiceInterface.
Taka implementacja sprawi, że gdy nasz middleware zostanie uruchomiony, będzie miał możliwość uruchomić następny callback w łańcuchu i zmanipulować odpowiedź lub wykonać dodatkową logikę.
Wykorzystamy to, by uruchomić nasz dotychczasowy kontroler i w zależności od odpowiedzi, wysłać informacje o wyświetleniu do serwisu rekomendacji.
2.2. Zmodyfikuj klasę Application, by w zależności od stanu flagi uwzględniała nasz nowy middleware.
<?php
/* ... */
if(FeatureFlag::isEnabled('create_impression_on_product_lookup')) {
$this->app->get('/products/{id}', Products\ProductImpressionMiddleware::class, Products\ProductLookupController::class);
}else{
$this->app->get('/products/{id}', Products\ProductLookupController::class);
}
<?php
/*...*/
$diArray = [
Products\ProductsListController::class => function (ProductRepository $repository) {
return new Products\ProductsListController($repository);
},
Products\ProductLookupController::class => function (ProductRepository $repository) {
return new Products\ProductLookupController($repository);
}
];
if(FeatureFlag::isEnabled('create_impression_on_product_lookup')) {
$diArray[RecommendationsService::class] = function(){
$address = getenv('RECOMMENDATIONS_SERVICE_URL');
return new RecommendationsService($address);
};
$diArray[Products\ProductImpressionMiddleware::class] = function (RecommendationsService $service) {
return new Products\ProductImpressionMiddleware($service);
};
}
$container = new Container($diArray);
3. Testy automatyczne¶
3.1. Stwórz klasę testów ProductImpressionMiddlewareTest, kopiując ProductLookupControllerTest.
3.2. Zmodyfikuj wszystkie testy tak, by oznaczały się jako pominięte, jeśli flaga create_impression_on_product_lookup jest wyłączona
3.3. Zmodyfikuj testy tak, by uruchamiały middleware ProductImpressionMiddleware w łańcuchu z ProductLookupController.
3.4. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
3.5. Commit.
Rozwiązanie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | |
4. Implementacja rozwiązania¶
4.1 Zmodyfikuj ProductImpressionMiddleware, tak by w razie poprawnej odpowiedzi z kontrolera ProductLookupController wysłał informacje o wyświetleniu do serwisu rekomendacji.
4.2. Przetestuj swoje rozwiązanie za pomocą testów automatycznych, uruchamiając je ze zmienną środowiskową, która włączy flagę
4.3 Zmodyfikuj pipeline.sh, by uruchamiał testy kolejny raz, ale z włączoną flagą
4.4. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
4.5. Commit.
5. Wdrożenie¶
5.1. Zmodyfikuj plik docker-compose.yml i ustaw zmienną środowiskową FEATURE_FLAG_CREATE_IMPRESSION_ON_PRODUCT_LOOKUP na 1.
5.2. Uruchom ponownie usługę
lub jeśli masz to uruchomione w terminalu, to
5.3. Sprawdź, czy wszystko działa i nic nie wybucha
http://127.0.0.1:8181/products/1
5.4. Sprawdź, czy serwis rekomendacji zwraca dane
http://127.0.0.1:8182/recommendations/2
5.5. Zmodyfikuj stan flagi create_impression_on_product_lookup w main/src/Flags.php, ustawiając wartość na true
5.6. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
5.7. Commit.
W idealnym świecie, po tym wdrożeniu dane zaczynają się zbierać, ale nic ich jeszcze nie wyświetla. Przygotowana przez nas integracja z poprzedniego ćwiczenia ciągle nie jest włączona.
Dodatkowy skrypt migrujący istniejące dane¶
Po wielu analizach ktoś doszukał się historycznych danych, którymi musimy zasilić nasz serwis rekomendacji, zanim zaczniemy go używać i pokażemy rekomendacje klientom.
| Id | Impressions |
|---|---|
| 1 | 120 |
| 2 | 200 |
| 3 | 333 |
1. Implementacja rozwiązania¶
1.1. Utwórz plik main/public/migrate-reco.php
1.2. Zainicjalizuj autoloader i obsługę Feature Flag.
1.3. Zakończ działanie skryptu, jeśli flaga create_impression_on_product_lookup jest wyłączona.
1.4. Wykorzystując klasę \Tbd\Main\Recommendations\RecommendationsService napisz rozwiązanie, które wyśle odpowiednią liczbę zdarzeń do systemu.
Serwis jest dostępny pod adresem http://127.0.0.1:8182.
1.5. Uruchom skrypt.
W idealnym świecie, dane z produkcji zbierają się od ostatniego wdrożenia, teraz dodatkowo uzupełniamy dane o informacje historyczne. Serwis jest w tym momencie gotowy.
Wdrożenie wszystkich funkcji¶
1. Zwracanie rekomendacji¶
1.1. Przetestuj swoje rozwiązanie za pomocą testów automatycznych, uruchamiając je ze zmienną środowiskową, która włączy obie flagi
FEATURE_FLAG_CREATE_IMPRESSION_ON_PRODUCT_LOOKUP=1 FEATURE_FLAG_SHOW_RECOMMENDATIONS_ON_PRODUCT_LOOKUP=1 composer run tests
1.2. Zmodyfikuj pipeline.sh, by dodatkowo uruchamiał testy w konfiguracjach:
- obie flagi włączone
- tylko flaga FEATURE_FLAG_SHOW_RECOMMENDATIONS_ON_PRODUCT_LOOKUP włączona
- tylko flaga FEATURE_FLAG_CREATE_IMPRESSION_ON_PRODUCT_LOOKUP włączona
- obie flagi wyłączone
1.3. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
1.4. Zmodyfikuj plik docker-compose.yml i ustaw zmienną środowiskową FEATURE_FLAG_SHOW_RECOMMENDATIONS_ON_PRODUCT_LOOKUP na 1.
1.5. Uruchom ponownie usługę
lub jeśli masz to uruchomione w terminalu, to
1.6. Sprawdź, czy wszystko działa i nic nie wybucha
http://127.0.0.1:8181/products/1
1.7. Sprawdź, czy serwis rekomendacji zwraca dane
http://127.0.0.1:8182/recommendations/2
1.8. Zmodyfikuj stan flagi show_recommendations_on_product_lookup w main/src/Flags.php, ustawiając wartość na true
1.9. Uruchom pipeline.sh, by mieć pewność, że wszystko jest ok.
1.10. Commit.