Dostarczanie danych przez REST i ich aktualizacja

Odpowiedz Nowy wątek
2019-03-18 09:18
eL
0

Sprawa wygląda tak że mam serwis który wczytuje z pliku yaml pewne dane tekstowe i wystawia je na endpoint w stylu localhost:8080/info
Inne serwisy mogą sobie zrobić request i dociągnąć te informacje i wszystko śmiga ładnie.
Problem w tym że mam też drugi endpoint który może te informacje aktualizować i wówczas na endpoincie GET localhost:8080/info powinny być oczywiście zwrócone nowe dane.
Jeśli serwis zostanie zresetowany to wracamy do wartości domyślnych.

Aktualnie mam Spring'a który tworzy taką konfigurację na podstawie pliku:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties("Info.default")
class InfoProperties {

    private String url;
    private String port;
    private String somethingElse;

//getter

Do tego jest klasa serwisu która trzyma taki obiekt i ma 2 metody:


@Service
class InfoProvider {

    private InfoProperties properties;

    public InfoProvider (InfoProperties properties) {
         this.properties = properties;
    }   

  InfoProperties getInfo() {
        return properties;
    }

    void updateProperties(InfoProperties properties){
        this.properties = properties;
    }
}

I to w sumie działa. W testach jak robie kilka zapytań na get to najpierw mam domyślne wartości a potem po update dostaje wartości zaaktualizowane. Ręcznie testowałem i też jest ok.
Wydawałoby się więc że wszystko ładnie śmiga ale @jarekr000000 często krytykuje springowe beany i tak się zastanawiam czy to się może wykrzaczyć w jakichś sytuacjach

Jeśli to jest faktycznie bezsensu to może jakieś inne propozycje?

edytowany 1x, ostatnio: eL, 2019-03-18 09:21

Pozostało 580 znaków

2019-03-18 09:32
0

To dziwne, że działa bo nie powinno. Tzn. jak masz szczęście to działa.
Konkretnej to getInfo powinno często dawać stare dane. Zasymuluj to pod obciążeniem na kilku wątkach.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.

Pozostało 580 znaków

2019-03-18 09:39
eL
0

@jarekr000000: właśnie spodziewam się że to może nie działać bo z tego co kojarzę to Spring dla każdego requesta tworzy nowy wątek z max pulą 200 (by default) więc między wątkami to się może zwyczajnie rozjechać. Natomiast potestowałem (chociaż fakt że bez większego obciążenia) i działa stąd też pomyślałem że może o czymś nie wiem.

Pytanie więc jak to sensownie poprawić? DB nie widzę sensu stawiać bo to bardzo mała ilość danych więc może jakiś inny pomysł?

Pozostało 580 znaków

2019-03-18 09:43

Volatile. To takie minimum.

Jakkolwiek zrobienie symulacji i sprawdzenie jak to działa uważam, za sensowne ćwiczenie. Mozesz te watki odpalić w testach, bez bawet http. Od razu wołaj serwis.


Bardzo lubie Singletony, dlatego robię po kilka instancji każdego.
edytowany 3x, ostatnio: jarekr000000, 2019-03-18 09:45

Pozostało 580 znaków

2019-03-18 09:47
eL
0

Ok faktycznie to ma sens natomiast intryguje mnie trochę to zdanie To takie minimum.
Można z tym zrobić coś więcej?

Mi pierwsza rzecz do głowy przyszła żeby dać synchronized na updateProperties. Volatile nigdy nie używałem. - kkojot 2019-03-18 09:50
@kkojot i to by była zła (niewystarczająca) zmiana - jarekr000000 2019-03-18 09:59

Pozostało 580 znaków

2019-03-18 10:02
0

Skoro synchronized na updateProperties() jest niewystarczające, to podpinam się pod temat. Jak to przetestować wielowątkowo, żeby sprawdzić, że w odpowiedzi zawsze są aktualne i poprawne dane? JMeterem da się coś takiego ogarnąć?


Chyba idealne zadanie dla gatling.io - Kamil Żabiński 2019-03-18 10:11

Pozostało 580 znaków

2019-03-18 19:09
0

synchronized nie działa, bo sychronizuje tylko metodę updateProperties, getInfo w teorii będzie zwracać błędne wyniki.

Na pewno? synchronized sprawi, że każdy wątek zaktualizuje swoją zmienną properties, więc każdy z nich zwróci tą samą wartość w getInfo() - kkojot 2019-03-19 08:54

Pozostało 580 znaków

2019-03-18 23:03
0

Skoro używasz RESTa zasadne wydaje się użycie ETAGa do takiej funkcjonalności, przykładowy opis jak skonfigurować to w Springu https://www.baeldung.com/etags-for-rest-with-spring

Pozostało 580 znaków

2019-03-20 22:22
0

AtomicReference nie wystarczy?


Prowadzę bloga o byciu lepszym programistą.

Pozostało 580 znaków

2019-03-20 22:29
0

@puradawid: AtomicReference to volatile + kilka dodatkowych metod atomicznych, więc wystarczy. Zresztą kod mówi sam za siebie: https://github.com/openjdk-mi[...]omic/AtomicReference.java#L60

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0