Rabbitmq i machanizm Exchange w przypadku wielu instancji

Rabbitmq i machanizm Exchange w przypadku wielu instancji
M0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 373
0

Uczę się rabbitmq i zastanawiam się jak ograniczyć odczyt z kolejki w przypadku wykorzystania mechanizmu Exchange. Mam jedną aplikacje, która działa w wielu instancjach. I w takim przypadku wysłanie czegoś na kolejkę powoduje odczyt przez wszystkie instancje. Chciałbym np. mieć X różnych serwisów, które odczytują dane z jednak kolejki. Co, który serwis ma odczytać określę za pomocą routingu. Glówny backend wysyła dane na jedną kolejkę z określenie odpowiedniego routingu. Obecnie odczyt następuje we wszystkich instancjach danego serwisu.
Obejściem tego jest wykorzystanie QueryDeclare i tworzenie osobno kolejki per serwis, ale według mnie jest to troszkę niezgrabne.

Czyli chciałbym, aby ExchangeDeclare w danym routingu działała podobnie do QueryDeclare. Czy jest to możliwe, czy źle do tego podchodzę?
Czy tutaj już case bardziej pod wykorzystanie kafki?

MS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 328
0

Używasz Masstransit, czy czegoś podobnego? To pewnie zaoszczędziło by sporo linijek kodu.
Jeżeli chcesz mieć koniecznie jedną kolejkę, to pewnie musisz dodać filtr po stronie consumerów (chyba nie ma innego rozwiązania).
Jeśli nie, to zobacz: https://www.rabbitmq.com/tutorials/tutorial-five-dotnet

Z Masstransit wyglądałoby to jakoś tak (by chatgpt):

Kopiuj
  // Konfiguracja routingu dla różnych serwisów
  cfg.ReceiveEndpoint("serviceA-queue", e =>
  {
      e.Bind("my_exchange", x =>
      {
          x.RoutingKey = "serviceA.key"; // Routing dla service A
          x.ExchangeType = "topic"; // Używamy exchange typu topic
      });
      e.ConfigureConsumer<MyConsumerA>(context);
  });
  
  cfg.ReceiveEndpoint("serviceB-queue", e =>
  {
      e.Bind("my_exchange", x =>
      {
          x.RoutingKey = "serviceB.key"; // Routing dla service B
          x.ExchangeType = "topic";
      });
      e.ConfigureConsumer<MyConsumerB>(context);
  });

  //publikacja:
  await bus.Publish(new MyMessage { Text = "Hello Service A!" }, context =>
  {
      context.SetRoutingKey("serviceA.key"); // Użyj routing key dla Service A
  });
SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1022
3

W rabbicie czytasz z kolejek, exchange to tylko wysyłanie. Jedyne rozwiązanie jakie widzę to kolejka per przypadek użycia (polecam, nie wiem czemu masz z tym problem) lub jakieś kombinowanie np. serwisy czytają z jednej kolejki, ale nie obsługują danego rodzaju wiadomości przez co rabbit routuje taką wiadomość do kolejnego consumenta aż się uda (nie polecam)

M0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 373
0

@slsy Akurat nie mam z tym problemu, aby użyć wielu kolejek(tak to robimy akurat), ale chciałem wypróbować troszkę inne podejśćie, kiedy doczytałem, że jest coś takiego jak routing w rabbitmq. Aczkolwiek słabo widzę wykorzystanie go w momencie kiedy ma się wiele instancji tego samego serwisu. Wszystkie przetworzą tą samą wiadomość.

Chyba, mój problem został wyjaśniony

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.