{"id":405,"date":"2024-11-06T02:04:56","date_gmt":"2024-11-06T02:04:56","guid":{"rendered":"https:\/\/realstudy.net\/?p=405"},"modified":"2024-11-19T07:21:01","modified_gmt":"2024-11-19T07:21:01","slug":"nats-messaging-system","status":"publish","type":"post","link":"https:\/\/realstudy.net\/?p=405","title":{"rendered":"NATS &#8211; Messaging System"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"405\" class=\"elementor elementor-405\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f325689 e-flex e-con-boxed e-con e-parent\" data-id=\"f325689\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-769d720 elementor-widget elementor-widget-text-editor\" data-id=\"769d720\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>\nNATS, developed in the Go programming language, is a high-performance, lightweight open-source messaging system designed for cloud-native applications, IoT messaging, microservice architectures, and more. It is based on a simple and highly scalable Pub\/Sub model and offers various other messaging patterns and features.\n<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-39255a0 e-flex e-con-boxed e-con e-parent\" data-id=\"39255a0\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c983c79 elementor-widget elementor-widget-text-editor\" data-id=\"c983c79\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>The graph below, which compares the throughput of various message queues, clearly demonstrates NATS&#8217;s superior performance. NATS exhibits exceptionally high throughput, with both publishing and subscribing rates exceeding approximately 180,000 messages per second. In comparison, Kafka shows a publishing throughput of around 90,000 and a subscribing throughput of about 60,000, making it the next highest in terms of throughput but still operating at roughly half the speed of NATS.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dd055c6 elementor-widget elementor-widget-image\" data-id=\"dd055c6\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"640\" height=\"366\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/image.jpeg\" class=\"attachment-large size-large wp-image-375\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/image.jpeg 720w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/image-300x172.jpeg 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ea80ec1 e-flex e-con-boxed e-con e-parent\" data-id=\"ea80ec1\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-12e0afa elementor-widget elementor-widget-text-editor\" data-id=\"12e0afa\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>* <strong>Basic Messaging Patterns<\/strong><br \/>\u00a0 &gt; <strong>Publish-Subscribe<\/strong>: A publisher sends messages to a subject, and subscribers listening to that subject receive the messages.<br \/>\u00a0 &gt; <strong>Request-Reply<\/strong>: A client sends a request and waits for a response from a service.<br \/>\u00a0 &gt; <strong>Queue Groups<\/strong>: Messages are load-balanced among a group of subscribers, ensuring that each message is processed by only one subscriber in the group.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-ed22cb4 e-flex e-con-boxed e-con e-parent\" data-id=\"ed22cb4\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b348ccb elementor-widget elementor-widget-heading\" data-id=\"b348ccb\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">1. Running a NATS server<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5776ca1 elementor-widget elementor-widget-text-editor\" data-id=\"5776ca1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Download NATS Server Binaries:<\/strong> Download the latest version of the NATS server binaries from GitHub.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7780f elementor-widget elementor-widget-code-highlight\" data-id=\"9b7780f\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>wget https:\/\/github.com\/nats-io\/nats-server\/releases\/download\/v2.10.2\/nats-server-v2.10.2-linux-amd64.tar.gz\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eec43d0 elementor-widget elementor-widget-text-editor\" data-id=\"eec43d0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Unzip:<\/strong> Unzip the downloaded file.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7b9c1dd elementor-widget elementor-widget-code-highlight\" data-id=\"7b9c1dd\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>tar -xzf nats-server-v2.10.2-linux-amd64.tar.gz\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d988e1c elementor-widget elementor-widget-text-editor\" data-id=\"d988e1c\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Run Server:<\/strong> Runs the NATS server with default settings.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3cacca3 elementor-widget elementor-widget-code-highlight\" data-id=\"3cacca3\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>nats-server-v2.10.2-linux-amd64\/nats-server<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-375f63f e-flex e-con-boxed e-con e-parent\" data-id=\"375f63f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9d6899d elementor-widget elementor-widget-heading\" data-id=\"9d6899d\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">2. Python Test<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b953002 elementor-widget elementor-widget-text-editor\" data-id=\"b953002\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>All examples use Python&#8217;s nats-py library. The nats-py library can be installed with the following command<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-434496c elementor-widget elementor-widget-code-highlight\" data-id=\"434496c\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>pip install nats-py\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c2e41df e-flex e-con-boxed e-con e-parent\" data-id=\"c2e41df\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-412837b elementor-widget elementor-widget-heading\" data-id=\"412837b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">3. Publish-Subscribe<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a89f2e4 elementor-widget elementor-widget-text-editor\" data-id=\"a89f2e4\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>A <strong>Publisher<\/strong> sends messages to a specific subject.<\/div><div><strong>Subscribers<\/strong> listen to that subject and receive messages.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-433fda9 elementor-widget elementor-widget-image\" data-id=\"433fda9\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"359\" height=\"152\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_pubsub.jpg\" class=\"attachment-large size-large wp-image-384\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_pubsub.jpg 359w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_pubsub-300x127.jpg 300w\" sizes=\"(max-width: 359px) 100vw, 359px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ea0c48d elementor-widget elementor-widget-text-editor\" data-id=\"ea0c48d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Publisher<\/strong> (publisher.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e5706e elementor-widget elementor-widget-code-highlight\" data-id=\"7e5706e\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\n\nasync def main():\n    nc = NATS()\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Message to publish\n    message = \"Hello, this is a NATS message.\"\n\n    # Publish the message\n    await nc.publish(\"greetings\", message.encode('utf-8'))\n    print(\"Published a message.\")\n\n    await nc.close()\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e8226f elementor-widget elementor-widget-text-editor\" data-id=\"1e8226f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Subscriber<\/strong> (publisher.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9d4c00 elementor-widget elementor-widget-code-highlight\" data-id=\"a9d4c00\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\n\nasync def message_handler(msg):\n    data = msg.data.decode('utf-8')\n    print(f\"Received message: {data}\")\n\nasync def main():\n    nc = NATS()\n\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Subscribe to the subject\n    await nc.subscribe(\"greetings\", cb=message_handler)\n    print(\"Subscribed to subject 'greetings'.\")\n\n    # Keep the subscriber running\n    while True:\n        await asyncio.sleep(1)\n\nif __name__ == '__main__':\n    asyncio.run(main())\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b37bb6 elementor-widget elementor-widget-text-editor\" data-id=\"2b37bb6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>How to run<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a8bdb07 elementor-widget elementor-widget-code-highlight\" data-id=\"a8bdb07\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Run the Subscriber\npython subscriber.py\n\n# In another terminal, Run the Publisher\npython publisher.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b905c8b e-flex e-con-boxed e-con e-parent\" data-id=\"b905c8b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-402eb9b elementor-widget elementor-widget-heading\" data-id=\"402eb9b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">4. Request-Reply<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-65b7c16 elementor-widget elementor-widget-text-editor\" data-id=\"65b7c16\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Requester<\/strong> sends a request message to a subject and waits for a reply.<\/div><div><strong>Replier<\/strong> subscribes to that subject and responds to requests.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a88656a elementor-widget elementor-widget-image\" data-id=\"a88656a\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"359\" height=\"195\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_reqrep.jpg\" class=\"attachment-large size-large wp-image-389\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_reqrep.jpg 359w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_reqrep-300x163.jpg 300w\" sizes=\"(max-width: 359px) 100vw, 359px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5252c37 elementor-widget elementor-widget-text-editor\" data-id=\"5252c37\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Requester<\/strong> (requester.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ef619e elementor-widget elementor-widget-code-highlight\" data-id=\"0ef619e\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\nfrom nats.aio.errors import ErrTimeout\n\nasync def main():\n    nc = NATS()\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Request message\n    message = \"What is the current time?\"\n\n    try:\n        # Send a request\n        response = await nc.request(\"time.request\", message.encode('utf-8'), timeout=2)\n        print(f\"Received response: {response.data.decode('utf-8')}\")\n    except ErrTimeout:\n        print(\"Request timed out.\")\n\n    await nc.close()\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8057edb elementor-widget elementor-widget-text-editor\" data-id=\"8057edb\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Replier<\/strong> (replier.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2b2aef elementor-widget elementor-widget-code-highlight\" data-id=\"f2b2aef\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom datetime import datetime\nfrom nats.aio.client import Client as NATS\n\nasync def main():\n    nc = NATS()\n\n    async def request_handler(msg):\n        # Print the request message\n        request = msg.data.decode('utf-8')\n        print(f\"Received request: {request}\")\n\n        # Generate current time\n        current_time = datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n        response = f\"The current time is {current_time}.\"\n\n        # Send the response\n        print(f\"response subject: {msg.reply}\")\n        await nc.publish(msg.reply, response.encode('utf-8'))\n        print(\"Sent a response.\")\n\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Subscribe to the subject\n    await nc.subscribe(\"time.request\", cb=request_handler)\n    print(\"Subscribed to subject 'time.request' and ready to handle requests.\")\n\n    # Keep the replier running\n    while True:\n        await asyncio.sleep(1)\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-36d7e88 elementor-widget elementor-widget-text-editor\" data-id=\"36d7e88\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>How to run<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-28b7c5d elementor-widget elementor-widget-code-highlight\" data-id=\"28b7c5d\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Run the Subscriber\npython replier.py\n\n# In another terminal, Run the Publisher\npython requester.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e803f9b e-flex e-con-boxed e-con e-parent\" data-id=\"e803f9b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70486cd elementor-widget elementor-widget-heading\" data-id=\"70486cd\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">5. Queue Groups (Load Balancing)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3376115 elementor-widget elementor-widget-text-editor\" data-id=\"3376115\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Multiple workers subscribe to the same subject within a queue group.<\/div><div>Messages are load-balanced among the workers; each message is delivered to only one worker in the group.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fe5c9d7 elementor-widget elementor-widget-image\" data-id=\"fe5c9d7\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"152\" src=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_queue.jpg\" class=\"attachment-large size-large wp-image-393\" alt=\"\" srcset=\"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_queue.jpg 385w, https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_queue-300x118.jpg 300w\" sizes=\"(max-width: 385px) 100vw, 385px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-236391d elementor-widget elementor-widget-text-editor\" data-id=\"236391d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Task Publisher<\/strong> (task_publisher.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e672e67 elementor-widget elementor-widget-code-highlight\" data-id=\"e672e67\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\n\nasync def main():\n    nc = NATS()\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Publish tasks\n    for i in range(1, 11):\n        task = f\"Task number {i}\"\n        await nc.publish(\"tasks\", task.encode('utf-8'))\n        print(f\"Published task: {task}\")\n        await asyncio.sleep(0.5)\n\n    await nc.close()\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c2bbb00 elementor-widget elementor-widget-text-editor\" data-id=\"c2bbb00\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Worker<\/strong> (worker.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-237dd80 elementor-widget elementor-widget-code-highlight\" data-id=\"237dd80\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nimport sys\nfrom nats.aio.client import Client as NATS\n\nasync def main(worker_id):\n    nc = NATS()\n\n    async def task_handler(msg):\n        task = msg.data.decode('utf-8')\n        print(f\"Worker {worker_id} processing {task}...\")\n        # Simulate task processing\n        await asyncio.sleep(1)\n        print(f\"Worker {worker_id} completed {task}\")\n\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Subscribe to the subject within a queue group\n    await nc.subscribe(\"tasks\", queue=\"workers\", cb=task_handler)\n    print(f\"Worker {worker_id} has started.\")\n\n    # Keep the worker running\n    while True:\n        await asyncio.sleep(1)\n\nif __name__ == '__main__':\n    worker_id = sys.argv[1] if len(sys.argv) > 1 else '1'\n    asyncio.run(main(worker_id))<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f259a02 elementor-widget elementor-widget-text-editor\" data-id=\"f259a02\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>How to run<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e0261d elementor-widget elementor-widget-code-highlight\" data-id=\"3e0261d\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Start multiple workers in separate terminals\npython worker.py 1\npython worker.py 2\npython worker.py 3\n\n# In another terminal, Run the Task Publisher\npython task_publisher.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7e4f854 e-flex e-con-boxed e-con e-parent\" data-id=\"7e4f854\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-20b4f2b elementor-widget elementor-widget-heading\" data-id=\"20b4f2b\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">6. Message Headers<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e8b064 elementor-widget elementor-widget-text-editor\" data-id=\"7e8b064\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div>Messages can include headers to pass metadata along with the message body.<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b311003 elementor-widget elementor-widget-text-editor\" data-id=\"b311003\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Publisher with Headers<\/strong> (header_publisher.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9319c97 elementor-widget elementor-widget-code-highlight\" data-id=\"9319c97\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\n\nasync def main():\n    nc = NATS()\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Set headers\n    headers = {\n        \"Content-Type\": \"application\/json\",\n        \"X-Request-ID\": \"12345\"\n    }\n\n    # Message to publish\n    message = '{\"message\": \"This message includes headers.\"}'\n\n    # Publish the message with headers\n    await nc.publish(\"updates\", message.encode('utf-8'), headers=headers)\n    print(\"Published a message with headers.\")\n\n    await nc.close()\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8675414 elementor-widget elementor-widget-text-editor\" data-id=\"8675414\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>Subscriber Reading Headers<\/strong> (header_subscriber.py)<\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b57cbb4 elementor-widget elementor-widget-code-highlight\" data-id=\"b57cbb4\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import asyncio\nfrom nats.aio.client import Client as NATS\n\nasync def main():\n    nc = NATS()\n\n    async def message_handler(msg):\n        data = msg.data.decode('utf-8')\n        headers = msg.headers\n\n        print(f\"Received message: {data}\")\n        if headers:\n            for key, value in headers.items():\n                print(f\"Header {key}: {value}\")\n        else:\n            print(\"No headers received.\")\n\n    await nc.connect(\"nats:\/\/127.0.0.1:4222\")\n\n    # Subscribe to the subject\n    await nc.subscribe(\"updates\", cb=message_handler)\n    print(\"Subscribed to subject 'updates'.\")\n\n    # Keep the subscriber running\n    while True:\n        await asyncio.sleep(1)\n\nif __name__ == '__main__':\n    asyncio.run(main())<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1ff17c5 elementor-widget elementor-widget-text-editor\" data-id=\"1ff17c5\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div><strong>How to run<\/strong><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-52c58df elementor-widget elementor-widget-code-highlight\" data-id=\"52c58df\" data-element_type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard word-wrap\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp># Run the subscriber\npython header_subscriber.py\n\n# In another terminal, Run the publisher\npython task_publisher.py<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>NATS, developed in the Go programming language, is a high-performance, lightweight open-source messaging system designed for cloud-native applications, IoT messaging,&hellip;<\/p>\n","protected":false},"author":1,"featured_media":372,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[21],"tags":[],"class_list":["post-405","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-computer_en"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/realstudy.net\/wp-content\/uploads\/2024\/11\/nats_overview.jpeg","_links":{"self":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts\/405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=405"}],"version-history":[{"count":13,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts\/405\/revisions"}],"predecessor-version":[{"id":999,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/posts\/405\/revisions\/999"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=\/wp\/v2\/media\/372"}],"wp:attachment":[{"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/realstudy.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}