Dostarczanie danych przez REST i ich aktualizacja

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

Rejestracja: 8 lat temu

Ostatnio: 6 godzin temu

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

Rejestracja: 4 lata temu

Ostatnio: 2 minuty temu

Lokalizacja: U krasnoludów - pod górą

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.


jeden i pół terabajta powinno wystarczyć każdemu

Pozostało 580 znaków

eL
2019-03-18 09:39
eL

Rejestracja: 8 lat temu

Ostatnio: 6 godzin temu

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

Rejestracja: 4 lata temu

Ostatnio: 2 minuty temu

Lokalizacja: U krasnoludów - pod górą

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.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000, 2019-03-18 09:45

Pozostało 580 znaków

eL
2019-03-18 09:47
eL

Rejestracja: 8 lat temu

Ostatnio: 6 godzin temu

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

Rejestracja: 12 lat temu

Ostatnio: 7 godzin temu

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 - KamilAdam 2019-03-18 10:11

Pozostało 580 znaków

2019-03-18 19:09

Rejestracja: 2 lata temu

Ostatnio: 1 godzina temu

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

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

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

Rejestracja: 1 rok temu

Ostatnio: 1 rok temu

0

AtomicReference nie wystarczy?


Prowadzę bloga o byciu lepszym programistą.

Pozostało 580 znaków

2019-03-20 22:29

Rejestracja: 2 lata temu

Ostatnio: 1 godzina temu

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

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