1"use strict";(self.webpackChunkrabbitmq_website=self.webpackChunkrabbitmq_website||[]).push([["19701"],{78157(e,t,n){n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var i=n(82103),r=n(74848),s=n(28453);let a={title:"Serving Millions of Clients with Native MQTT",tags:["Technical Deep Dive","Performance","MQTT"],authors:["dansari"]},o,l={authorsImageUrls:[void 0]},c=[];function d(e){let t={a:"a",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"RabbitMQ's core protocol has been AMQP 0.9.1.\nTo support MQTT, STOMP, and AMQP 1.0, the broker transparently proxies via its core protocol.\nWhile this is a simple way to extend RabbitMQ with support for more messaging protocols,\nit degrades scalability and performance."}),"\n",(0,r.jsxs)(t.p,{children:["In the last 9 months, we re-wrote the ",(0,r.jsx)(t.a,{href:"/docs/mqtt",children:"MQTT plugin"})," to not proxy via AMQP 0.9.1 anymore.\nInstead, the MQTT plugin parses MQTT messages and sends them directly to queues.\nThis is what we call ",(0,r.jsx)(t.strong,{children:"Native MQTT"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"The results are spectacular:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"Memory usage drops by up to 95% and hundreds of GBs with many connections."}),"\n",(0,r.jsx)(t.li,{children:"For the first time ever, RabbitMQ is able to handle millions of connections."}),"\n",(0,r.jsx)(t.li,{children:"End-to-end latency drops by 50% - 70%."}),"\n",(0,r.jsx)(t.li,{children:"Throughput increases by 30% - 40%."}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"Native MQTT turns RabbitMQ into an MQTT broker opening the door for a broader set of IoT use cases."}),"\n",(0,r.jsx)(t.p,{children:"Native MQTT ships in RabbitMQ 3.12."})]})}function p(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453(e,t,n){n.d(t,{R:()=>a,x:()=>o});var i=n(96540);let r={},s=i.createContext(r);function a(e){let t=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:t},e.children)}},82103(e){e.exports=JSON.parse('{"permalink":"/blog/2023/03/21/native-mqtt","editUrl":"https://github.com/rabbitmq/rabbitmq-website/tree/main/blog/2023-03-21-native-mqtt/index.md","source":"@site/blog/2023-03-21-native-mqtt/index.md","title":"Serving Millions of Clients with Native MQTT","description":"RabbitMQ\'s core protocol has been AMQP 0.9.1.","date":"2023-03-21T00:00:00.000Z","tags":[{"inline":true,"label":"Technical Deep Dive","permalink":"/blog/tags/technical-deep-dive"},{"inline":true,"label":"Performance","permalink":"/blog/tags/performance"},{"inline":true,"label":"MQTT","permalink":"/blog/tags/mqtt"}],"readingTime":25.24,"hasTruncateMarker":true,"authors":[{"name":"David Ansari","url":"https://github.com/ansd","socials":{"github":"https://github.com/ansd","linkedin":"https://www.linkedin.com/in/ansd/","mastodon":"https://m.ansd.xyz/@ansd","bluesky":"https://bsky.app/profile/ansd.xyz"},"imageURL":"https://github.com/ansd.png","key":"dansari","page":null}],"frontMatter":{"title":"Serving Millions of Clients with Native MQTT","tags":["Technical Deep Dive","Performance","MQTT"],"authors":["dansari"]},"unlisted":false,"prevItem":{"title":"Announcing RabbitMQ Community Discord Server","permalink":"/blog/2023/04/04/announcing-rabbitmq-community-discord-server"},"nextItem":{"title":"Migrating from Mirrored Classic Queues to Quorum Queues","permalink":"/blog/2023/03/02/quorum-queues-migration"}}')}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.