Aktywne Wpisy
Undying +538
Muszę się wyżalić, po niecałych 6 latach w kołchozie udało mi się znaleźć inną pracę, na tym samym stanowisku, w firmie 35km dalej i za stawkę około 3000 brutto większą. Mega się cieszę, ale przełożony dzisiaj o mało mi nie zaje*al za wypowiedzenie xd nasłuchałem się że nie mam co liczyć na podobną kasę tutaj, żebym to sobie dobrze przemyślał, że dojazdy mnie wykończą, że będę tego żałował i że mogłem przyjść
Ryptun +802
Mamy eventy w Azure Event Hubs, które na razie (bo nie mamy jeszcze proda - trochę taka zabaw póki co) - generujemy ręcznie poprzez feature Azurowy "Data Generator", gdzie możemy podać jsona i dodać do "kolejki", a w naszej appce spring bootowej consumer sobie je pobiera i wywołuje odpowiednią akcję. Gdzieś w środku logiki uderzamy webclientem do zewnętrznego serwisu.
Jeszcze nie wiadomo w jaki sposób docelowo będą generowane te eventy.
Co potrzebuję:
1. Dodać trace id (minimum z wymagań) i jakiś correlation id, te dane muszą być propagowane do każdego z serwisów.
I teraz pytanie, z czego najlepiej skorzystać?
Czytam o Spring Cloud Sleuth oraz Micrometer. Lead coś wspominał, żeby obczaić czy Micrometer nie wystarczy lub coś innego niż Sleuth, ale z tego co ja czytam to Micrometer chyba nie jest do tracingu.
2. Potrzebuję zastanowić się jak to zrobić w dwóch przypadkach:
- dla obecnej sytuacji, gdzie generujemy event ręcznie z jsonem - raczej w tym przypadku to nie my powinniśmy generować trace id itd, tylko już po stronie consumera w logice?
- Jeśli jest jakiś producent w appce, który generuje eventy - wtedy już producent będzie tworzył trace id/ correlation id itp.
Powiedzmy, że mam pomysł na otrzymywanie eventu w formie obiektu:
class Request<T> {
String traceId;
String correlationId;
T request; //tutaj json z danymi
}
czy odpalając całe flow w spring appce dla tego eventu, zaczynając od consumera, który wywołuje jakąś logikę (.handle(event)) powinienem do każdej metody przekazywać ten traceId, correlationId, żeby przy uderzeniu do zewnętrznego serwisu posłać te dane?
Nie za bardzo wiem jak to ma działać :)
#programista15k #programista25k #programowanie #java #spring #azure
To zaleźy.
To zależy. ( ͡° ͜ʖ ͡°)
A teraz od czego? Od tego co i jak
Serwis A dostaje request, generowany jest kontekst (trace id) który jest dołączany do eventu/wiadomości i ląduje sobie na kolejce (Kafka, Azure Event Hub, RabbitMQ, cokolwiek) i tam sobie czeka. Konsument wiadomości pobiera tą wiadomość razem z kontekstem (wygenerowanym trace id) i przekazuje dalej do serwisu B za pomocą requestu HTTP w którym kontekst dołączany jest do żądania. Po obsłudze serwis B wysyła request
@markaron: W tym mam problem. Ale może tak ma być? Bo Przekazanie wiadomości z serwisu A do B to nie są jakieś chain http calle. Zanim ten serwis A przekaże do serwisu B to jest wywoływany łańcuch metod, gdzie przekazuje różne parametry. I
Rozumiem, że chodzi ci o coś w rodzaju?
public class MyController
{
@jakastamjavovaadnotacja
public MyResponse Foo(...) {
var event = getEvent();
method1(event);
method2(event);
method3(event);
sendToNextService(event);
}
}
Coś takiego, pisałem z palca i wymyślałem:
@PostMapping("run-task")
public ResponseEntity<TaskResult> runTask(@RequestBody RequestObj obj) {
taskService.handleTask(obj).isStatus ? ResponseEntity.ok(.)
}
inna klasa:
public TaskResult handleTask(RequestObj obj) {
WykopObjTask wykopobj = wykopService.findInRepoBasedOnFields(obj.getField1, obj.getField2);
RedditObjTask redditObj = Wykop.builder.fields(obj.getfield);
return anotherService.run(redditObj).isStatus ? TaskResult200 : TaskResult400;
}
innKlasa:
public TaskResult run(RedditObj redditObj) {
SubReddit subReddit = redditobj.getSth();
//another builder with result of a new object eg.
AllTasksFromSubreddit allTasksFromSubreddit = builder...
TaskResult taskResult = webclient.post().uri().header().bodValue....
}
class Program
{
static ActivitySource s_source = new ActivitySource("Sample.DistributedTracing");
static async Task Main(string[] args)
{
await