{"id":54288,"date":"2025-12-01T06:15:40","date_gmt":"2025-12-01T06:15:40","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54288"},"modified":"2025-12-01T06:15:40","modified_gmt":"2025-12-01T06:15:40","slug":"dotnet-rabbitmq-with-net-demo-and-lab-example","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/dotnet-rabbitmq-with-net-demo-and-lab-example\/","title":{"rendered":"DOTNET: RabbitMQ with .net Demo and Lab Example"},"content":{"rendered":"\n<p>We\u2019ll run <strong>RabbitMQ in Docker on an AWS EC2 instance<\/strong>, and use your <strong>Windows laptop<\/strong> for both the <strong>producer<\/strong> and <strong>consumer<\/strong>.<\/p>\n\n\n\n<p>I\u2019ll walk you through:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create &amp; configure EC2<\/li>\n\n\n\n<li>Install Docker &amp; run RabbitMQ container<\/li>\n\n\n\n<li>Securely expose RabbitMQ over IP<\/li>\n\n\n\n<li>Write .NET Producer (Windows)<\/li>\n\n\n\n<li>Write .NET Consumer (Windows)<\/li>\n\n\n\n<li>Test end-to-end<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Provision AWS EC2 for RabbitMQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Launch EC2 instance<\/h3>\n\n\n\n<p>In AWS Console:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to <strong>EC2 \u2192 Instances \u2192 Launch instance<\/strong>.<\/li>\n\n\n\n<li>Name: <code>rabbitmq-ec2<\/code>.<\/li>\n\n\n\n<li>AMI:\n<ul class=\"wp-block-list\">\n<li><strong>Ubuntu Server 22.04 LTS<\/strong> (or Amazon Linux if you prefer).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Instance type: <code>t3.small<\/code> or <code>t3.micro<\/code> is OK for demo.<\/li>\n\n\n\n<li>Key Pair: select or create one (for SSH).<\/li>\n\n\n\n<li>Network:\n<ul class=\"wp-block-list\">\n<li>VPC: default (or your custom VPC).<\/li>\n\n\n\n<li>Subnet: any public subnet.<\/li>\n\n\n\n<li><strong>Auto-assign Public IP: Enable<\/strong> \u2705 (important).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 Security group ports<\/h3>\n\n\n\n<p>Create or configure a security group, e.g., <code>rabbitmq-sg<\/code>, with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SSH<\/strong>: TCP 22, Source = your IP only (e.g., <code>x.x.x.x\/32<\/code>).<\/li>\n\n\n\n<li><strong>RabbitMQ AMQP<\/strong>: TCP <strong>5672<\/strong>, Source = your IP (for .NET code) or office IP range.<\/li>\n\n\n\n<li><strong>RabbitMQ Management UI<\/strong>: TCP <strong>15672<\/strong>, Source = your IP (for browser access).<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Don\u2019t leave 0.0.0.0\/0 open in production. For demo it\u2019s \u201cokay-ish\u201d, but better to restrict.<\/p>\n<\/blockquote>\n\n\n\n<p>Launch the instance.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Install Docker &amp; run RabbitMQ on EC2<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 SSH into the EC2 instance<\/h3>\n\n\n\n<p>From your Windows laptop:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-i<\/span> \"<span class=\"hljs-selector-tag\">your-key<\/span><span class=\"hljs-selector-class\">.pem<\/span>\" <span class=\"hljs-selector-tag\">ubuntu<\/span><span class=\"hljs-keyword\">@EC2_PUBLIC_IP<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>(Replace <code>your-key.pem<\/code> path and <code>EC2_PUBLIC_IP<\/code> with the instance\u2019s public IP.)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Install Docker (Ubuntu example)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Update packages<\/span>\nsudo apt-get update\n\n<span class=\"hljs-comment\"># Install Docker<\/span>\nsudo apt-get install -y docker.io\n\n<span class=\"hljs-comment\"># Enable &amp; start Docker<\/span>\nsudo systemctl enable docker\nsudo systemctl start docker\n\n<span class=\"hljs-comment\"># Verify<\/span>\ndocker --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.3 Run RabbitMQ Docker container (with remote access)<\/h3>\n\n\n\n<p>Important: the default <code>guest<\/code> user <strong>cannot<\/strong> log in remotely (only from localhost), so we\u2019ll create a new user.<\/p>\n\n\n\n<p>Run RabbitMQ with management:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">sudo<\/span> <span class=\"hljs-selector-tag\">docker<\/span> <span class=\"hljs-selector-tag\">run<\/span> <span class=\"hljs-selector-tag\">-d<\/span> \\\n  <span class=\"hljs-selector-tag\">--hostname<\/span> <span class=\"hljs-selector-tag\">my-rabbit<\/span> \\\n  <span class=\"hljs-selector-tag\">--name<\/span> <span class=\"hljs-selector-tag\">rabbitmq-demo<\/span> \\\n  <span class=\"hljs-selector-tag\">-p<\/span> 5672<span class=\"hljs-selector-pseudo\">:5672<\/span> \\\n  <span class=\"hljs-selector-tag\">-p<\/span> 15672<span class=\"hljs-selector-pseudo\">:15672<\/span> \\\n  <span class=\"hljs-selector-tag\">rabbitmq<\/span><span class=\"hljs-selector-pseudo\">:3-management<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wait a few seconds, then:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo docker ps\n<\/code><\/span><\/pre>\n\n\n<p>You should see <code>rabbitmq:3-management<\/code> running.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.4 Create a dedicated user for remote access<\/h3>\n\n\n\n<p>Connect into the container:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo docker exec -it rabbitmq-demo bash\n<\/code><\/span><\/pre>\n\n\n<p>Inside the container:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Add a user - choose your own username &amp; password<\/span>\nrabbitmqctl add_user myuser mypassword\n\n<span class=\"hljs-comment\"># Give full permissions on the default vhost \"\/\"<\/span>\nrabbitmqctl set_permissions -p \/ myuser <span class=\"hljs-string\">\".*\"<\/span> <span class=\"hljs-string\">\".*\"<\/span> <span class=\"hljs-string\">\".*\"<\/span>\n\n<span class=\"hljs-comment\"># (Optional) Give administrator tag for UI access<\/span>\nrabbitmqctl set_user_tags myuser administrator\n\n<span class=\"hljs-keyword\">exit<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now you\u2019ll use <code>myuser \/ mypassword<\/code> from Windows.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Verify RabbitMQ Management UI from your laptop<\/h2>\n\n\n\n<p>On your <strong>Windows laptop<\/strong>, open browser:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/EC2_PUBLIC_IP:15672<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Log in with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Username: <code>myuser<\/code><\/li>\n\n\n\n<li>Password: <code>mypassword<\/code><\/li>\n<\/ul>\n\n\n\n<p>You should see the RabbitMQ dashboard \ud83c\udf89<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Prepare .NET projects on Windows laptop<\/h2>\n\n\n\n<p>We\u2019ll create <strong>two console apps<\/strong> on your laptop:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>RabbitMqProducer<\/code> \u2013 sends messages to EC2 RabbitMQ<\/li>\n\n\n\n<li><code>RabbitMqConsumer<\/code> \u2013 receives &amp; processes them<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Create solution &amp; projects<\/h3>\n\n\n\n<p>In PowerShell \/ CMD:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">mkdir RabbitMqEc2Demo\ncd RabbitMqEc2Demo\n\ndotnet <span class=\"hljs-keyword\">new<\/span> sln -n RabbitMqEc2Demo\n\ndotnet <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">console<\/span> -n RabbitMqProducer\ndotnet <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">console<\/span> -n RabbitMqConsumer\n\ndotnet sln add RabbitMqProducer\/RabbitMqProducer.csproj\ndotnet sln add RabbitMqConsumer\/RabbitMqConsumer.csproj\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">4.2 Install RabbitMQ client in both apps<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">cd<\/span> <span class=\"hljs-selector-tag\">RabbitMqProducer<\/span>\n<span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-selector-tag\">package<\/span> <span class=\"hljs-selector-tag\">RabbitMQ<\/span><span class=\"hljs-selector-class\">.Client<\/span>\n<span class=\"hljs-selector-tag\">cd<\/span> ..\n\n<span class=\"hljs-selector-tag\">cd<\/span> <span class=\"hljs-selector-tag\">RabbitMqConsumer<\/span>\n<span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-selector-tag\">package<\/span> <span class=\"hljs-selector-tag\">RabbitMQ<\/span><span class=\"hljs-selector-class\">.Client<\/span>\n<span class=\"hljs-selector-tag\">cd<\/span> ..\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Producer code (from Windows \u2192 EC2 RabbitMQ)<\/h2>\n\n\n\n<p>Edit <code>RabbitMqProducer\/Program.cs<\/code> and replace with:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">using System.Text;\nusing RabbitMQ.Client;\n\nConsole.WriteLine(<span class=\"hljs-string\">\"RabbitMQ Producer starting...\"<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Replace with your EC2 public IP or DNS<\/span>\n<span class=\"hljs-keyword\">var<\/span> rabbitMqHost = <span class=\"hljs-string\">\"EC2_PUBLIC_IP_OR_DNS\"<\/span>;  <span class=\"hljs-comment\">\/\/ e.g. \"3.110.45.123\"<\/span>\n<span class=\"hljs-keyword\">var<\/span> queueName = <span class=\"hljs-string\">\"demo_queue\"<\/span>;\n\n<span class=\"hljs-keyword\">var<\/span> factory = <span class=\"hljs-keyword\">new<\/span> ConnectionFactory\n{\n    HostName = rabbitMqHost,\n    Port = <span class=\"hljs-number\">5672<\/span>,\n    UserName = <span class=\"hljs-string\">\"myuser\"<\/span>,      <span class=\"hljs-comment\">\/\/ user created on EC2 RabbitMQ<\/span>\n    Password = <span class=\"hljs-string\">\"mypassword\"<\/span>,  <span class=\"hljs-comment\">\/\/ password you set<\/span>\n    VirtualHost = <span class=\"hljs-string\">\"\/\"<\/span>         <span class=\"hljs-comment\">\/\/ default vhost<\/span>\n};\n\nusing <span class=\"hljs-keyword\">var<\/span> connection = factory.CreateConnection();\nusing <span class=\"hljs-keyword\">var<\/span> channel = connection.CreateModel();\n\n<span class=\"hljs-comment\">\/\/ Declare queue - safe to call many times<\/span>\nchannel.QueueDeclare(\n    queue: queueName,\n    <span class=\"hljs-attr\">durable<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-attr\">exclusive<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-attr\">autoDelete<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-attr\">arguments<\/span>: <span class=\"hljs-literal\">null<\/span>);\n\nConsole.WriteLine($<span class=\"hljs-string\">\"Connected to RabbitMQ at {rabbitMqHost}. Queue: {queueName}\"<\/span>);\n\n<span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">1<\/span>; i &lt;= <span class=\"hljs-number\">10<\/span>; i++)\n{\n    <span class=\"hljs-keyword\">var<\/span> message = $<span class=\"hljs-string\">\"Hello from Windows Producer! Message #{i}\"<\/span>;\n    <span class=\"hljs-keyword\">var<\/span> body = Encoding.UTF8.GetBytes(message);\n\n    <span class=\"hljs-keyword\">var<\/span> properties = channel.CreateBasicProperties();\n    properties.Persistent = <span class=\"hljs-literal\">true<\/span>; <span class=\"hljs-comment\">\/\/ store on disk<\/span>\n\n    channel.BasicPublish(\n        exchange: <span class=\"hljs-string\">\"\"<\/span>,\n        <span class=\"hljs-attr\">routingKey<\/span>: queueName,\n        <span class=\"hljs-attr\">basicProperties<\/span>: properties,\n        <span class=\"hljs-attr\">body<\/span>: body);\n\n    Console.WriteLine($<span class=\"hljs-string\">\"&#91;x] Sent: {message}\"<\/span>);\n}\n\nConsole.WriteLine(<span class=\"hljs-string\">\"All messages sent. Press any key to exit.\"<\/span>);\nConsole.ReadKey();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Consumer code (from Windows \u2192 EC2 RabbitMQ)<\/h2>\n\n\n\n<p>Edit <code>RabbitMqConsumer\/Program.cs<\/code> and replace with:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">using System.Text;\nusing RabbitMQ.Client;\nusing RabbitMQ.Client.Events;\n\nConsole.WriteLine(<span class=\"hljs-string\">\"RabbitMQ Consumer starting...\"<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Same EC2 host &amp; credentials<\/span>\n<span class=\"hljs-keyword\">var<\/span> rabbitMqHost = <span class=\"hljs-string\">\"EC2_PUBLIC_IP_OR_DNS\"<\/span>;  <span class=\"hljs-comment\">\/\/ e.g. \"3.110.45.123\"<\/span>\n<span class=\"hljs-keyword\">var<\/span> queueName = <span class=\"hljs-string\">\"demo_queue\"<\/span>;\n\n<span class=\"hljs-keyword\">var<\/span> factory = <span class=\"hljs-keyword\">new<\/span> ConnectionFactory\n{\n    HostName = rabbitMqHost,\n    Port = <span class=\"hljs-number\">5672<\/span>,\n    UserName = <span class=\"hljs-string\">\"myuser\"<\/span>,\n    Password = <span class=\"hljs-string\">\"mypassword\"<\/span>,\n    VirtualHost = <span class=\"hljs-string\">\"\/\"<\/span>,\n    DispatchConsumersAsync = <span class=\"hljs-literal\">true<\/span>\n};\n\nusing <span class=\"hljs-keyword\">var<\/span> connection = factory.CreateConnection();\nusing <span class=\"hljs-keyword\">var<\/span> channel = connection.CreateModel();\n\nchannel.QueueDeclare(\n    queue: queueName,\n    <span class=\"hljs-attr\">durable<\/span>: <span class=\"hljs-literal\">true<\/span>,\n    <span class=\"hljs-attr\">exclusive<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-attr\">autoDelete<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-attr\">arguments<\/span>: <span class=\"hljs-literal\">null<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Optional QoS to process one message at a time<\/span>\nchannel.BasicQos(prefetchSize: <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-attr\">prefetchCount<\/span>: <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-attr\">global<\/span>: <span class=\"hljs-literal\">false<\/span>);\n\nConsole.WriteLine($<span class=\"hljs-string\">\"Connected to RabbitMQ at {rabbitMqHost}. Waiting for messages on queue: {queueName}\"<\/span>);\n\n<span class=\"hljs-keyword\">var<\/span> consumer = <span class=\"hljs-keyword\">new<\/span> AsyncEventingBasicConsumer(channel);\n\nconsumer.Received += <span class=\"hljs-keyword\">async<\/span> (model, ea) =&gt;\n{\n    <span class=\"hljs-keyword\">var<\/span> body = ea.Body.ToArray();\n    <span class=\"hljs-keyword\">var<\/span> message = Encoding.UTF8.GetString(body);\n\n    Console.WriteLine($<span class=\"hljs-string\">\"&#91;x] Received: {message}\"<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ Simulate some processing work<\/span>\n    <span class=\"hljs-keyword\">await<\/span> Task.Delay(<span class=\"hljs-number\">500<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ Acknowledge the message<\/span>\n    channel.BasicAck(deliveryTag: ea.DeliveryTag, <span class=\"hljs-attr\">multiple<\/span>: <span class=\"hljs-literal\">false<\/span>);\n};\n\nchannel.BasicConsume(\n    queue: queueName,\n    <span class=\"hljs-attr\">autoAck<\/span>: <span class=\"hljs-literal\">false<\/span>,\n    <span class=\"hljs-attr\">consumer<\/span>: consumer);\n\nConsole.WriteLine(<span class=\"hljs-string\">\"Press &#91;enter] to exit.\"<\/span>);\nConsole.ReadLine();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Run the full flow<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">7.1 Start the consumer (Windows)<\/h3>\n\n\n\n<p>Open terminal on your laptop:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cd RabbitMqEc2Demo\/RabbitMqConsumer\ndotnet run\n<\/code><\/span><\/pre>\n\n\n<p>You should see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">RabbitMQ<\/span> <span class=\"hljs-selector-tag\">Consumer<\/span> <span class=\"hljs-selector-tag\">starting<\/span>...\n<span class=\"hljs-selector-tag\">Connected<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">RabbitMQ<\/span> <span class=\"hljs-selector-tag\">at<\/span> <span class=\"hljs-selector-tag\">EC2_PUBLIC_IP_OR_DNS<\/span>. <span class=\"hljs-selector-tag\">Waiting<\/span> <span class=\"hljs-selector-tag\">for<\/span> <span class=\"hljs-selector-tag\">messages<\/span> <span class=\"hljs-selector-tag\">on<\/span> <span class=\"hljs-selector-tag\">queue<\/span>: <span class=\"hljs-selector-tag\">demo_queue<\/span>\n<span class=\"hljs-selector-tag\">Press<\/span> <span class=\"hljs-selector-attr\">&#91;enter]<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">exit<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>(Queue might be empty initially.)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">7.2 Run the producer (Windows)<\/h3>\n\n\n\n<p>Open another terminal:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">cd RabbitMqEc2Demo\/RabbitMqProducer\ndotnet run\n<\/code><\/span><\/pre>\n\n\n<p>You should see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">RabbitMQ<\/span> <span class=\"hljs-selector-tag\">Producer<\/span> <span class=\"hljs-selector-tag\">starting<\/span>...\n<span class=\"hljs-selector-tag\">Connected<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">RabbitMQ<\/span> <span class=\"hljs-selector-tag\">at<\/span> <span class=\"hljs-selector-tag\">EC2_PUBLIC_IP_OR_DNS<\/span>. <span class=\"hljs-selector-tag\">Queue<\/span>: <span class=\"hljs-selector-tag\">demo_queue<\/span>\n<span class=\"hljs-selector-attr\">&#91;x]<\/span> <span class=\"hljs-selector-tag\">Sent<\/span>: <span class=\"hljs-selector-tag\">Hello<\/span> <span class=\"hljs-selector-tag\">from<\/span> <span class=\"hljs-selector-tag\">Windows<\/span> <span class=\"hljs-selector-tag\">Producer<\/span>! <span class=\"hljs-selector-tag\">Message<\/span> <span class=\"hljs-selector-id\">#1<\/span>\n...\n<span class=\"hljs-selector-attr\">&#91;x]<\/span> <span class=\"hljs-selector-tag\">Sent<\/span>: <span class=\"hljs-selector-tag\">Hello<\/span> <span class=\"hljs-selector-tag\">from<\/span> <span class=\"hljs-selector-tag\">Windows<\/span> <span class=\"hljs-selector-tag\">Producer<\/span>! <span class=\"hljs-selector-tag\">Message<\/span> <span class=\"hljs-selector-id\">#10<\/span>\n<span class=\"hljs-selector-tag\">All<\/span> <span class=\"hljs-selector-tag\">messages<\/span> <span class=\"hljs-selector-tag\">sent<\/span>. <span class=\"hljs-selector-tag\">Press<\/span> <span class=\"hljs-selector-tag\">any<\/span> <span class=\"hljs-selector-tag\">key<\/span> <span class=\"hljs-selector-tag\">to<\/span> <span class=\"hljs-selector-tag\">exit<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now check the <strong>consumer<\/strong> terminal; you should see each message being received &amp; processed:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;x]<\/span> <span class=\"hljs-selector-tag\">Received<\/span>: <span class=\"hljs-selector-tag\">Hello<\/span> <span class=\"hljs-selector-tag\">from<\/span> <span class=\"hljs-selector-tag\">Windows<\/span> <span class=\"hljs-selector-tag\">Producer<\/span>! <span class=\"hljs-selector-tag\">Message<\/span> <span class=\"hljs-selector-id\">#1<\/span>\n<span class=\"hljs-selector-attr\">&#91;x]<\/span> <span class=\"hljs-selector-tag\">Received<\/span>: <span class=\"hljs-selector-tag\">Hello<\/span> <span class=\"hljs-selector-tag\">from<\/span> <span class=\"hljs-selector-tag\">Windows<\/span> <span class=\"hljs-selector-tag\">Producer<\/span>! <span class=\"hljs-selector-tag\">Message<\/span> <span class=\"hljs-selector-id\">#2<\/span>\n...\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">7.3 Inspect via RabbitMQ Management UI<\/h3>\n\n\n\n<p>In browser:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">http:<span class=\"hljs-comment\">\/\/EC2_PUBLIC_IP:15672<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Log in with <code>myuser \/ mypassword<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Queues<\/strong> \u2192 click <code>demo_queue<\/code><\/li>\n\n\n\n<li>You can see:\n<ul class=\"wp-block-list\">\n<li>Ready \/ unacked messages counts<\/li>\n\n\n\n<li>Consumers count<\/li>\n\n\n\n<li>Message rates<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Try experiments:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stop consumer, run producer \u2192 messages accumulate in queue.<\/li>\n\n\n\n<li>Start consumer again \u2192 it drains messages from queue.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Hardening \/ Production Thoughts (for your training)<\/h2>\n\n\n\n<p>You can mention this in your tutorial:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <strong>non-default credentials<\/strong>, strong passwords.<\/li>\n\n\n\n<li>Restrict Security Group to your office VPN \/ corporate IPs.<\/li>\n\n\n\n<li>Consider <strong>TLS<\/strong> for RabbitMQ traffic (amqps).<\/li>\n\n\n\n<li>Use <strong>separate vhosts<\/strong> for environments (dev \/ stage \/ prod).<\/li>\n\n\n\n<li>Use <strong>Docker volumes<\/strong> or EBS volumes for persistent data.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>We\u2019ll run RabbitMQ in Docker on an AWS EC2 instance, and use your Windows laptop for both the producer and consumer. I\u2019ll walk you through: 1. Provision AWS EC2 for&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54288","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54288"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54288\/revisions"}],"predecessor-version":[{"id":54289,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54288\/revisions\/54289"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}