Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

RabbitMQ na VPS: instalacja, kolejki, exchanges, routing keys i monitoring

Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Message Queuing

RabbitMQ to najpopularniejszy open source message broker, implementujący protokół AMQP (Advanced Message Queuing Protocol). Pozwala odsprzęgnąć komponenty systemu — producent wysyła wiadomości do brokera, konsument przetwarza je we własnym tempie. Idealne do przetwarzania asynchronicznego: wysyłka emaili, generowanie raportów, powiadomienia push, synchronizacja danych między mikroserwisami.

Instalacja RabbitMQ na Ubuntu 24.04

RabbitMQ wymaga Erlang/OTP jako środowiska uruchomieniowego. Najlepiej instalować z oficjalnego repozytorium Team RabbitMQ, które zawiera kompatybilne wersje obu pakietów.

# Dodaj klucz GPG i repozytorium Erlang
curl -fsSL https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc \
  | gpg --dearmor -o /usr/share/keyrings/erlang-solutions.gpg

echo "deb [signed-by=/usr/share/keyrings/erlang-solutions.gpg] \
  https://packages.erlang-solutions.com/ubuntu noble contrib" \
  > /etc/apt/sources.list.d/erlang.list

# Dodaj repozytorium RabbitMQ
curl -fsSL https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey \
  | gpg --dearmor -o /usr/share/keyrings/rabbitmq.gpg

echo "deb [signed-by=/usr/share/keyrings/rabbitmq.gpg] \
  https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ noble main" \
  > /etc/apt/sources.list.d/rabbitmq.list

# Instalacja Erlang i RabbitMQ
apt update
apt install -y erlang-base erlang-asn1 erlang-crypto erlang-eldap \
  erlang-ftp erlang-inets erlang-mnesia erlang-os-mon erlang-parsetools \
  erlang-public-key erlang-runtime-tools erlang-snmp erlang-ssl \
  erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl \
  rabbitmq-server

# Uruchom i włącz autostart
systemctl enable rabbitmq-server
systemctl start rabbitmq-server

# Sprawdz status
systemctl status rabbitmq-server
rabbitmqctl status

Management UI — panel administracyjny

RabbitMQ ma wbudowany panel webowy (Management Plugin) dostępny na porcie 15672. Włącz go i utwórz administratora — domyślny użytkownik guest działa tylko z localhost.

# Włącz Management Plugin
rabbitmq-plugins enable rabbitmq_management

# Utwórz administratora
rabbitmqctl add_user admin silnehaslo123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

# Usuń domyślnego guesta (opcjonalnie, zalecane na produkcji)
rabbitmqctl delete_user guest

# Panel dostępny pod:
# http://IP_VPS:15672
# Login: admin / silnehaslo123

# Zabezpiecz port przez firewall (dostep tylko z Twojego IP)
ufw allow from TWOJ_IP to any port 15672
ufw deny 15672

Tworzenie exchanges i kolejek przez rabbitmqadmin

rabbitmqadmin to CLI klient Management API. Pozwala zarządzać exchanges, kolejkami i bindingami z terminala — przydatne do automatyzacji i skryptów inicjalizacji.

# Pobierz rabbitmqadmin
wget http://localhost:15672/cli/rabbitmqadmin
chmod +x rabbitmqadmin
mv rabbitmqadmin /usr/local/bin/

# Utwórz exchange typu direct
rabbitmqadmin declare exchange \
  name=app.direct type=direct durable=true

# Utwórz exchange typu topic (wildcards)
rabbitmqadmin declare exchange \
  name=app.topic type=topic durable=true

# Utwórz exchange typu fanout (broadcast)
rabbitmqadmin declare exchange \
  name=app.fanout type=fanout durable=true

# Utwórz kolejki (durable = przezywa restart brokera)
rabbitmqadmin declare queue \
  name=emails durable=true

rabbitmqadmin declare queue \
  name=notifications durable=true

rabbitmqadmin declare queue \
  name=reports durable=true

# Powiaz kolejki z exchange (binding)
rabbitmqadmin declare binding \
  source=app.direct destination=emails routing_key=email

rabbitmqadmin declare binding \
  source=app.direct destination=notifications routing_key=notification

# Topic exchange — routing z wildcardami
rabbitmqadmin declare binding \
  source=app.topic destination=reports routing_key="report.#"

# Lista exchange i kolejek
rabbitmqadmin list exchanges
rabbitmqadmin list queues

Dead-letter queue i TTL

Dead-letter queue (DLQ) przechwytuje wiadomości, które nie zostały przetworzone — NACK bez requeue, przekroczony TTL lub pełna kolejka. Skonfiguruj DLQ przy tworzeniu głównej kolejki:

# Utwórz exchange dla dead-letter
rabbitmqadmin declare exchange \
  name=dlx type=direct durable=true

# Utwórz dead-letter queue
rabbitmqadmin declare queue \
  name=emails.dead durable=true

# Powiaz DLQ z exchange DLX
rabbitmqadmin declare binding \
  source=dlx destination=emails.dead routing_key=email.dead

# Utwórz glówna kolejke z DLQ i TTL 24h
rabbitmqadmin declare queue name=emails.main durable=true \
  arguments='{"x-dead-letter-exchange":"dlx","x-dead-letter-routing-key":"email.dead","x-message-ttl":86400000,"x-max-length":10000}'

# Sprawdz konfiguracje kolejki
rabbitmqadmin show queue name=emails.main

Przykład producent/konsument w Node.js (amqplib)

// producer.js — wysyłanie wiadomości
const amqp = require('amqplib');

async function sendEmail(to, subject, body) {
  const conn = await amqp.connect('amqp://admin:silnehaslo123@localhost');
  const channel = await conn.createChannel();

  await channel.assertExchange('app.direct', 'direct', { durable: true });

  const message = JSON.stringify({ to, subject, body });
  channel.publish('app.direct', 'email', Buffer.from(message), {
    persistent: true,        // wiadomosc przezywa restart brokera
    contentType: 'application/json',
  });

  console.log('Email queued:', to);
  await channel.close();
  await conn.close();
}

// consumer.js — przetwarzanie wiadomości
async function startWorker() {
  const conn = await amqp.connect('amqp://admin:silnehaslo123@localhost');
  const channel = await conn.createChannel();

  await channel.assertQueue('emails', { durable: true });
  channel.prefetch(1); // przetwarza 1 wiadomosc na raz

  channel.consume('emails', async (msg) => {
    if (!msg) return;
    const data = JSON.parse(msg.content.toString());
    try {
      await sendEmailSMTP(data);
      channel.ack(msg); // potwierdzenie — wiadomosc usunieta z kolejki
    } catch (err) {
      console.error('Failed:', err);
      channel.nack(msg, false, false); // NACK — trafi do DLQ
    }
  });
}

Monitoring — metryki i alerty

RabbitMQ eksportuje metryki przez Management API i opcjonalnie przez Prometheus endpoint. Kluczowe metryki do monitorowania:

Metryka Endpoint API Alert gdy
Głębokość kolejki /api/queues → messages > 10 000 (backlog)
Wiadomości unacked /api/queues → messages_unacknowledged > 100 per consumer
Pamięć RAM /api/nodes → mem_used > 80% mem_limit
DLQ rozmiar /api/queues/%2F/emails.dead > 0 (każda failed msg)
Publish rate /api/overview → message_stats Nagły spadek do 0
# Włącz Prometheus plugin
rabbitmq-plugins enable rabbitmq_prometheus

# Metryki Prometheus dostępne na porcie 15692
curl http://localhost:15692/metrics | grep rabbitmq_queue_messages

# Sprawdz metryki przez Management API
curl -u admin:silnehaslo123 http://localhost:15672/api/queues/%2F/emails \
  | python3 -m json.tool | grep -E "messages|consumers"

Najczęstsze pytania

Czym różni się RabbitMQ od Redis jako kolejka wiadomości? +
RabbitMQ to dedykowany message broker implementujący protokół AMQP — obsługuje zaawansowane wzorce routingu (exchanges, binding keys, fanout, topic), potwierdzenia dostarczenia (acknowledgements), dead-letter queues i priorytetowanie wiadomości. Redis z modułem Streams lub bibliotekami jak BullMQ jest prostszy w konfiguracji i wystarczający dla podstawowych kolejek zadań. Wybierz RabbitMQ gdy potrzebujesz: gwarancji dostarczenia (at-least-once), skomplikowanego routingu, wielu konsumentów, lub integracji z systemami enterprise (Java/Spring AMQP).
Co to jest exchange w RabbitMQ i jakie są typy? +
Exchange to router wiadomości — producent wysyła wiadomości do exchange, nie bezpośrednio do kolejki. Exchange decyduje, do których kolejek trafią wiadomości na podstawie binding keys. Typy: direct (routing key musi dokładnie pasować do binding key — np. emails → queue_emails), fanout (wiadomość trafia do WSZYSTKICH podłączonych kolejek — broadcast), topic (routing key z wildcardami: * to jedno słowo, # to zero lub więcej słów — np. order.*.created), headers (routing na podstawie nagłówków wiadomości, nie klucza).
Jak RabbitMQ gwarantuje dostarczenie wiadomości? +
RabbitMQ używa acknowledgements (ACK/NACK). Konsument pobiera wiadomość, przetwarza ją, a następnie wysyła ACK — wtedy RabbitMQ usuwa wiadomość z kolejki. Jeśli konsument padnie przed ACK, wiadomość wraca do kolejki i jest dostarczona innemu konsumentowi. Dla producentów: publisher confirms gwarantują że wiadomość dotarła do brokera. Durable queues + persistent messages zapewniają przetrwanie restartu RabbitMQ — wiadomości są zapisywane na dysku.
Co to jest dead-letter queue w RabbitMQ? +
Dead-letter queue (DLQ) to kolejka, do której trafiają wiadomości odrzucone — gdy konsument wyśle NACK bez requeue, wiadomość przekroczy TTL (time-to-live) lub kolejka osiągnie maksymalną pojemność. DLQ pozwala analizować failed messages bez ich utraty. Konfiguracja: przy tworzeniu kolejki ustaw x-dead-letter-exchange i x-dead-letter-routing-key. Standardowy wzorzec: main_queue → DLQ → alert (np. Slack/email gdy DLQ zaczyna rosnąć).

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.