In real world, this is done by programs, but for now, let’s just simulate this using rabbitmqadmin commands.
# Server declares a request queue
➜ docker exec -it rabbitmq rabbitmqadmin declare queue --name=rpc_queue --durable=false --auto-delete=false
# Client declares a reply queue
➜ docker exec -it rabbitmq rabbitmqadmin declare queue --name=rpc_reply_demo --durable=false --auto-delete=true
# Client sends a request. Notice that there is a correlation ID. Later, when a message is received in the reply queue, we should check the correlation ID of the message.
➜ docker exec -it rabbitmq rabbitmqadmin publish message \
--exchange=amq.default \
--routing-key=rpc_queue \
--payload="8" \
--properties='{"content_type":"text/plain","correlation_id":"corr-001","reply_to":"rpc_reply_demo"}'
Message published and routed successfully
# Server consumes the request
➜ docker exec -it rabbitmq rabbitmqadmin get messages --queue=rpc_queue --count=1 --ack-mode=ack_requeue_false
┌───────────────┬─────────────┬──────────┬─────────────┬───────────────┬────────────────────────────┬─────────┬──────────────────┐
│ payload_bytes │ redelivered │ exchange │ routing_key │ message_count │ properties │ payload │ payload_encoding │
├───────────────┼─────────────┼──────────┼─────────────┼───────────────┼────────────────────────────┼─────────┼──────────────────┤
│ 1 │ false │ │ rpc_queue │ 0 │ content_type: "text/plain" │ 8 │ string │
│ │ │ │ │ │ correlation_id: "corr-001" │ │ │
│ │ │ │ │ │ reply_to: "rpc_reply_demo" │ │ │
│ │ │ │ │ │ │ │ │
└───────────────┴─────────────┴──────────┴─────────────┴───────────────┴────────────────────────────┴─────────┴──────────────────┘
# Server publishes a response to the message it received by using the reply_to value, which is the reply queue. The message must contain the same correlation ID so the client knows it's a reply to the prior message.
➜ docker exec -it rabbitmq rabbitmqadmin publish message \
--exchange=amq.default \
--routing-key=rpc_reply_demo \
--payload="21" \
--properties='{"content_type":"text/plain","correlation_id":"corr-001"}'
Message published and routed successfully
# Client receives the message with the same correlation ID and knows it's a reply from the prior message.
➜ docker exec -it rabbitmq rabbitmqadmin get messages --queue=rpc_reply_demo --count=10 --ack-mode=ack_requeue_false
┌───────────────┬─────────────┬──────────┬────────────────┬───────────────┬────────────────────────────┬─────────┬──────────────────┐
│ payload_bytes │ redelivered │ exchange │ routing_key │ message_count │ properties │ payload │ payload_encoding │
├───────────────┼─────────────┼──────────┼────────────────┼───────────────┼────────────────────────────┼─────────┼──────────────────┤
│ 2 │ false │ │ rpc_reply_demo │ 0 │ content_type: "text/plain" │ 21 │ string │
│ │ │ │ │ │ correlation_id: "corr-001" │ │ │
│ │ │ │ │ │ │ │ │
└───────────────┴─────────────┴──────────┴────────────────┴───────────────┴────────────────────────────┴─────────┴──────────────────┘