Bird
Raised Fist0
RabbitMQdevops~7 mins

Shovel and Federation for multi-DC in RabbitMQ - Commands & Configuration

Choose your learning style10 modes available
Introduction
When you have RabbitMQ servers in different data centers, you need a way to move messages between them reliably. Shovel and Federation are tools that help copy or share messages across these separate RabbitMQ setups, so your apps can work together smoothly even if they are far apart.
When you want to copy messages from a queue in one data center to another queue in a different data center automatically.
When you need to share messages between RabbitMQ brokers without merging them into one cluster.
When you want to keep message traffic flowing even if one data center temporarily loses connection.
When you want to reduce network load by only federating specific exchanges or queues instead of all messages.
When you want to build a multi-region RabbitMQ setup for disaster recovery or geographic distribution.
Config File - shovel-federation.conf
shovel-federation.conf
## Shovel configuration example
[
  {rabbitmq_shovel, [
    {shovels, [
      {my-shovel, [
        {sources, [{broker, "amqp://user:password@source-dc-host"}]},
        {destinations, [{broker, "amqp://user:password@target-dc-host"}]},
        {queue, "source-queue"},
        {ack_mode, on_confirm},
        {publish_properties, [persistent]},
        {reconnect_delay, 5}
      ]}
    ]}
  ]},
  {rabbitmq_federation, [
    {exchanges, [
      {"federated-exchange", [
        {upstream, [{uri, "amqp://user:password@remote-dc-host"}]}
      ]}
    ]}
  ]}
].

This config file sets up two things:

  • Shovel: It copies messages from a queue named source-queue on one RabbitMQ server to another server automatically. It reconnects if the connection drops.
  • Federation: It links an exchange called federated-exchange to a remote RabbitMQ server, so messages published there are shared across data centers.
Commands
This command creates a shovel named 'my-shovel' that copies messages from 'source-queue' on the source server to 'target-queue' on the target server. It ensures messages are confirmed and persistent, and it will try reconnecting every 5 seconds if the connection drops.
Terminal
rabbitmqctl set_parameter shovel my-shovel '{"src-uri":"amqp://user:password@source-dc-host","src-queue":"source-queue","dest-uri":"amqp://user:password@target-dc-host","dest-queue":"target-queue","ack-mode":"on-confirm","publish-properties":["persistent"],"reconnect-delay":5}'
Expected OutputExpected
Setting parameter "my-shovel" for component "shovel" ...
This command defines a federation upstream named 'my-upstream' that points to the remote RabbitMQ server where messages will be fetched from.
Terminal
rabbitmqctl set_parameter federation-upstream my-upstream '{"uri":"amqp://user:password@remote-dc-host"}'
Expected OutputExpected
Setting parameter "my-upstream" for component "federation-upstream" ...
This command creates a federation upstream set named 'my-upstream-set' that includes the upstream 'my-upstream'. This groups upstreams for easier management.
Terminal
rabbitmqctl set_parameter federation-upstream-set my-upstream-set '{"upstreams":["my-upstream"]}'
Expected OutputExpected
Setting parameter "my-upstream-set" for component "federation-upstream-set" ...
This command applies federation to the exchange named 'federated-exchange', linking it to the upstream set so it receives messages from the remote server.
Terminal
rabbitmqctl set_parameter federation-exchange federated-exchange '{"upstream-set":"my-upstream-set"}'
Expected OutputExpected
Setting parameter "federated-exchange" for component "federation-exchange" ...
This command lists all current shovel and federation parameters to verify the setup is applied correctly.
Terminal
rabbitmqctl list_parameters
Expected OutputExpected
shovel my-shovel {"src-uri":"amqp://user:password@source-dc-host","src-queue":"source-queue","dest-uri":"amqp://user:password@target-dc-host","dest-queue":"target-queue","ack-mode":"on-confirm","publish-properties":["persistent"],"reconnect-delay":5} federation-upstream my-upstream {"uri":"amqp://user:password@remote-dc-host"} federation-upstream-set my-upstream-set {"upstreams":["my-upstream"]} federation-exchange federated-exchange {"upstream-set":"my-upstream-set"}
Key Concept

If you remember nothing else from this pattern, remember: Shovel copies messages between queues across servers, while Federation shares messages at the exchange level to connect RabbitMQ brokers in different data centers.

Common Mistakes
Using incorrect URIs with wrong usernames or passwords in shovel or federation parameters.
The connection will fail and messages won't be transferred between servers.
Double-check and test the AMQP URIs with correct credentials and hostnames before applying parameters.
Not setting 'ack-mode' to 'on-confirm' in shovel configuration.
Messages might be lost if the shovel assumes delivery without confirmation.
Always set 'ack-mode' to 'on-confirm' to ensure messages are safely copied.
Applying federation to exchanges that do not exist or have no bindings.
No messages will flow because the exchange is inactive or unused.
Create and bind exchanges properly before federating them.
Summary
Use 'rabbitmqctl set_parameter' commands to configure shovels and federation upstreams and exchanges.
Shovel moves messages queue-to-queue across RabbitMQ servers with confirmation and persistence.
Federation links exchanges across servers to share messages without merging clusters.
Verify your setup by listing parameters and checking connectivity between data centers.

Practice

(1/5)
1. What is the main purpose of RabbitMQ Shovel in a multi-data center (multi-DC) setup?
easy
A. To encrypt messages within a single RabbitMQ server
B. To share user credentials across multiple RabbitMQ servers
C. To automatically scale RabbitMQ nodes in a cluster
D. To copy messages between queues on different RabbitMQ servers

Solution

  1. Step 1: Understand Shovel's role

    Shovel is designed to move or copy messages from one queue to another, even across different RabbitMQ servers.
  2. Step 2: Compare options

    Options B, C, and D describe unrelated features like credential sharing, scaling, or encryption, which are not Shovel's purpose.
  3. Final Answer:

    To copy messages between queues on different RabbitMQ servers -> Option D
  4. Quick Check:

    Shovel copies messages = A [OK]
Hint: Shovel moves messages between queues on different servers [OK]
Common Mistakes:
  • Confusing Shovel with Federation
  • Thinking Shovel manages user credentials
  • Assuming Shovel handles encryption
2. Which of the following is the correct minimal configuration snippet to define a Shovel in RabbitMQ's configuration file?
easy
A. listeners: amqp: port: 5672
B. shovels: my_shovel: source-uri: amqp:// source-queue: source_queue destination-uri: amqp://remote destination-queue: dest_queue
C. clusters: nodes: [rabbit@node1, rabbit@node2]
D. federation: upstreams: my_upstream: uri: amqp://remote exchanges: ["my_exchange"]

Solution

  1. Step 1: Identify Shovel configuration format

    Shovel config uses 'shovels' key with shovel name and source/destination URIs and queues.
  2. Step 2: Match options to Shovel syntax

    shovels: my_shovel: source-uri: amqp:// source-queue: source_queue destination-uri: amqp://remote destination-queue: dest_queue matches the correct syntax for defining a shovel. Options A, B, and C relate to listeners, federation, and clustering, not shovel.
  3. Final Answer:

    shovels: my_shovel: source-uri: amqp:// source-queue: source_queue destination-uri: amqp://remote destination-queue: dest_queue -> Option B
  4. Quick Check:

    Shovel config starts with 'shovels:' = D [OK]
Hint: Shovel config uses 'shovels:' with source and destination URIs [OK]
Common Mistakes:
  • Confusing federation config with shovel config
  • Using cluster or listener config for shovel
  • Missing source or destination queue keys
3. Given a federation upstream configured to share an exchange named logs from a remote RabbitMQ server, what will happen if a message is published to the local logs exchange?
medium
A. The message will stay local and not be sent to the remote server
B. The message will be forwarded to the remote exchange automatically
C. The message will be received from the remote exchange and appear locally
D. The message will be duplicated on both local and remote exchanges

Solution

  1. Step 1: Understand Federation direction

    Federation pulls messages from remote to local, not the other way around.
  2. Step 2: Analyze message flow

    Publishing locally to the exchange does not send messages upstream; messages flow from remote to local only.
  3. Final Answer:

    The message will stay local and not be sent to the remote server -> Option A
  4. Quick Check:

    Federation pulls from remote; local publish stays local = B [OK]
Hint: Federation pulls messages from remote to local, not vice versa [OK]
Common Mistakes:
  • Thinking federation pushes messages upstream
  • Assuming messages duplicate automatically
  • Confusing federation with shovel direction
4. You configured a Shovel to move messages from a local queue to a remote queue, but no messages appear on the remote side. Which is the most likely cause?
medium
A. The Shovel's destination URI is incorrect or unreachable
B. The local queue is empty, so no messages to move
C. The Federation plugin is not enabled on the local server
D. The RabbitMQ server is running in standalone mode

Solution

  1. Step 1: Check Shovel connectivity

    If the destination URI is wrong or unreachable, messages cannot be delivered remotely.
  2. Step 2: Eliminate other causes

    Local queue being empty means no messages to move, but question implies messages exist. Federation plugin is unrelated to Shovel. Standalone mode does not prevent Shovel operation.
  3. Final Answer:

    The Shovel's destination URI is incorrect or unreachable -> Option A
  4. Quick Check:

    Shovel needs correct destination URI = A [OK]
Hint: Check destination URI if shovel moves no messages [OK]
Common Mistakes:
  • Confusing Federation plugin with Shovel
  • Ignoring network or URI errors
  • Assuming local queue always has messages
5. In a multi-DC RabbitMQ setup, you want to ensure messages published in any data center are available in all others with minimal delay and no duplicates. Which combination is best?
hard
A. Use only Shovel to copy messages between queues in data centers
B. Use only Federation to share queues between data centers
C. Use Federation to share exchanges and Shovel to copy queues between data centers
D. Use clustering across data centers with mirrored queues

Solution

  1. Step 1: Understand Federation and Shovel roles

    Federation shares exchanges or queues, enabling message sharing with minimal delay. Shovel copies messages between queues reliably.
  2. Step 2: Combine for best multi-DC setup

    Using Federation for exchange sharing ensures messages are available across DCs. Shovel ensures queues are synchronized, preventing duplicates and delays.
  3. Final Answer:

    Use Federation to share exchanges and Shovel to copy queues between data centers -> Option C
  4. Quick Check:

    Federation + Shovel = best multi-DC sync [OK]
Hint: Combine Federation for sharing and Shovel for copying queues [OK]
Common Mistakes:
  • Relying on clustering across data centers (not recommended)
  • Using only one method causing delays or duplicates
  • Confusing queue sharing with exchange sharing
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard