Komunikacja po HTTP między serwerami w celu wymiany danych

0

Potrzebuję porady. Nie jestem do końca pewien czy to co wymyśliłem ma w ogóle sens, więc wszelka krytyka uzasadniona.

Mam kilka instancji tej samej aplikacji w różnych sieciach. Aplikacją jest serwer ASP.net Core. Chciałbym, żeby aplikacje te mogły się wymieniać krótkimi, prostymi wiadomościami o swoim statusie. Coś na zasadzie sieci P2P. Instancje nie znają nawzajem swoich adresów IP, mogłyby się komunikować gdybym jednemu z nich podał adres drugiego.

Ich adresy IP nie są stałe, więc najpierw musiałem wymyślić sposób "nawiązywania połączenia" między nimi. Skoro są to serwery http, to wymyśliłem że jeżeli Serwer1 chce się połączyć z Serwer2, to wysyła mu API request na URL "http://adres_ip/sync". Serwer2 może teraz pobrać adres IP i port z requestu (var nodeIp = _accessor.HttpContext?.Connection?.RemoteIpAddress?.MapToIPv4()), zapisuje sobie te dane w bazie danych. Od tej chwili Serwer2 mógłby w dowolnym momencie wysyłać wiadomości Serwerowi1 bo zna jego adres IP.

W teorii, bo czy w praktyce miałoby to prawo działać? Bo jeżeli wysłałbym request do innej sieci, to serwer w innej sieci odbierze publiczny adres mojego routera i zapewne port TCP (dzięki któremu protokół http może wysłać odpowiedź). Czyli Serwer2 nie poznałby dokładnego adresu Serwera1. Z drugiej strony jednak jakoś te sieci P2P działają. Gdzie jest luka w moim rozumowaniu?

2

A nie myślałeś o jakimś message brokerze? Np Kafka?

0
iteredi napisał(a):

W teorii, bo czy w praktyce miałoby to prawo działać? Bo jeżeli wysłałbym request do innej sieci, to serwer w innej sieci odbierze publiczny adres mojego routera i zapewne port TCP (dzięki któremu protokół http może wysłać odpowiedź). Czyli Serwer2 nie poznałby dokładnego adresu Serwera1. Z drugiej strony jednak jakoś te sieci P2P działają. Gdzie jest luka w moim rozumowaniu?

  1. Sieci mają mniej czy bardziej stałe "adresy spotkaniowe" które umożliwiają włączenie się do sieci.
  2. Sporo fajnych możliwości dają pakiety datagramowe (UDP). Http to sporo za dużo

Z poszerzenia wiedzy oprócz message brokerów znajdź sobie managery clouda, które kombinują, aby wiedzieć który z serwerów http się podniósł, z którym jest źle (meldował problemy albo zamilkł)

0

Jeśli nie musi być to P2P, to faktycznie jakiś centralny message broker może pomóc.
Jeśli musi być to P2P, to może jakiś service discovery, w którym każdy serwis się rejestruje i może podejrzeć kto jest dostępny. Tylko wtedy właśnie problemem będą serwisy za NAT-em, firewalle itp.

0

Możesz do takie wymiany informacji użyć SignalR do komunikacji w czasie rzeczywistym. https://docs.microsoft.com/pl-pl/aspnet/core/signalr/introduction?view=aspnetcore-2.2

0

jeśli to jest hobbystyczny projekt to załóż sobie na dowolnym darmowym serwerze konto na php + mysql (nie wiem czy są darmowe pod asp.net) i napisz prosty serwer, który będzie robił za pośrednika pomiędzy serwerami. Jeśli jest to projekt komercyjny to za 100-200 zł na rok możesz mieć VPSa na którym postawisz to co będziesz chciał.

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