{"id":12547,"date":"2021-03-11T09:47:44","date_gmt":"2021-03-11T08:47:44","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=12547"},"modified":"2023-06-18T18:04:19","modified_gmt":"2023-06-18T16:04:19","slug":"how-to-scale-jitsi-meet","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/11\/how-to-scale-jitsi-meet\/","title":{"rendered":"How to Scale Jitsi Meet"},"content":{"rendered":"\n<p>In today&#8217;s world, video conferencing is getting more and more important \u2013 be it for learning, business events or social interaction in general. Most people use one of the big players like Zoom or Microsoft Teams, which both have their share of privacy issues. However, there is an alternative approach: self-hosting open-source software like Jitsi Meet. In this article, we are going to explore the different scaling options for deploying anything from a single Jitsi server to a sharded Kubernetes cluster.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Jitsi is an open-source video conferencing service that you can host on your own. Aside from its source code, Jitsi is available as a Debian\/Ubuntu package and as a Docker image. If you want to test Jitsi Meet, you may use the public instance at <a href=\"https:\/\/meet.jit.si\">meet.jit.si<\/a>.<\/p>\n\n\n\n<p>To understand how a self-hosted Jitsi Meet service can be scaled horizontally, we need to look at the different components that are involved in providing the service first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Components<\/h2>\n\n\n\n<p>A Jitsi Meet service is comprised of various different architectural components that can be scaled independently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jitsi Meet Frontend<\/h3>\n\n\n\n<p>The actual web interface is rendered by a WebRTC-compatible JavaScript application. It is hosted by a number of simple web servers and connects to videobridges to send and receive audio and video signals.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jitsi Videobridge (jvb)<\/h3>\n\n\n\n<p>The videobridge is a WebRTC-compatible server that routes audio and video streams between the participants of a conference. Jitsi&#8217;s videobridge is an XMPP (Extensible Messaging and Presence Protocol) server component.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jitsi Conference Focus (jicofo)<\/h3>\n\n\n\n<p>Jicofo manages media sessions between each of the participants of a conference and the videobridge. It also acts as a load balancer if multiple videobridges are used.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prosody<\/h3>\n\n\n\n<p>Prosody is a XMPP communication server that is used by Jitsi to create multi-user conferences.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jitsi Gateway to SIP (jigasi)<\/h3>\n\n\n\n<p>Jigasi is a server component that allows telephony SIP clients to join a conference. We won&#8217;t need this component for the proposed setup, though.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Jitsi Broadcasting Infrastructure (jibri)<\/h3>\n\n\n\n<p>Jibri allows for recording and\/or streaming conferences by using headless Chrome instances. We won&#8217;t need this component for the proposed setup, though.<\/p>\n\n\n\n<p>Now that we know what the different components of a Jitsi Meet service are, we can take a look at the different possible deployment scenarios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Single Server Setup<\/h2>\n\n\n\n<p>The simplest deployment is to run all of Jitsi&#8217;s components on a single server. Jitsi&#8217;s documentation features an excellent <a href=\"https:\/\/jitsi.github.io\/handbook\/docs\/devops-guide\/devops-guide-quickstart\">self-hosting guide for Debian\/Ubuntu<\/a>. It is best to use a bare-metal server with dedicated CPU cores and enough RAM. A steady, fast network connection is also essential (1 Gbit\/s). However, you will quickly hit the limits of a single Jitsi server if you want to host multiple conferences that each have multiple participants.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Single Jitsi Meet, Multiple Videobridges<\/h2>\n\n\n\n<p>The videobridges will typically have the most workload since they distribute the actual video streams. Thus, it makes sense to mainly scale this component. By default, all participants of a conference will use the same videobridge (without Octo). If you want to host many conferences on your Jitsi cluster, you will need a lot of videobridges to process all of the resulting video streams.<\/p>\n\n\n\n<p>Luckily, Jitsi&#8217;s architecture allows for scaling videobridges up and down pretty easily. If you have multiple videobridges, two things are very important for facilitating trouble-free conferences. Firstly, once a conference has begun, it is important that all other connecting clients will use the same videobridge (without Octo). Secondly, Jitsi needs to be able to balance the load of multiple conferences between all videobridges.<\/p>\n\n\n\n<p>When connecting to a conference, Jicofo will point the client to a videobridge that it should connect to. To consistently point all participants of a conference to the same videobridge, Jicofo holds state about which conferences run on which videobridge. When a new conference is initiated, Jicofo will load-balance between the videobridges and select one of the ones that are available.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Autoscaling of Videobridges<\/h2>\n\n\n\n<p>Let&#8217;s say you have to serve 1.000 concurrent users mid-day, but only 100 in the evening. Your Jitsi cluster does not need to constantly run 30 videobridges if 28 of them are idle between 5pm and 8am. Especially if your cluster is not running on dedicated hardware but in the cloud, it absolutely makes sense to autoscale the number of running videobridges based on usage to save a significant amount of money on your cloud provider&#8217;s next bill.<\/p>\n\n\n\n<p>Unfortunately, Prosody needs an existing XMPP component configuration for every new videobridge that is connected. And if you create a new component configuration, you need to reload the Prosody service \u2013&nbsp;that&#8217;s not a good idea in production. This means that you need to predetermine the maximum number of videobridges that can be running at any given time. However, you should probably do that anyways since Prosody (and Jicofo) cannot handle an infinite number of videobridges.<\/p>\n\n\n\n<p>Most of all cloud providers allow you to define an equivalent to autoscaling groups in AWS. Now, you create an autoscaling group with a minimum and a maximum number of videobridges that may be running simultaneously. In Prosody, you define the same number of XMPP components that you used for the maximum number in the autoscaling group.<\/p>\n\n\n\n<p>Next, you need a monitoring value that can be used to termine if additional videobridges should be started or running bridges should be stopped. Appropriate parameters can be CPU usage or network traffic of the videobridges. Of course, the exact limits will differ for each setup and use case.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sharded Jitsi Meet Instances with Multiple Videobridges<\/h2>\n\n\n\n<p>As previously suggested, Prosody and Jicofo cannot handle an unlimited number of connected videobridges or user requests. Additionally, it makes sense to have additional servers for failover and rolling updates. When Prosody and Jicofo need to be scaled, it makes sense to create multiple Jitsi shards that run independently from one another.<\/p>\n\n\n\n<p>The German HPI Schul-Cloud&#8217;s open-source Jitsi deployment in Kubernetes that is available <a href=\"https:\/\/github.com\/hpi-schul-cloud\/jitsi-deployment\">on GitHub<\/a> is suitable as a great starting point, since it&#8217;s architecture is pretty well documented. They use two shards in their production deployment.<\/p>\n\n\n\n<p>As far as I can tell, <a href=\"https:\/\/meet.ffmuc.net\/\">Freifunk M\u00fcnchen&#8217;s public Jitsi cluster<\/a> consists of four shards \u2013 though they deploy directly to the machines without the use of Kubernetes.<\/p>\n\n\n\n<p>Back to the HPI Schul-Cloud example: Inside a single shard, they deploy one pod each for the Jicofo and Prosody services, as well as a static web server hosting the Jitsi Meet JavaScript client application. The videobridges are managed by a Stateful Set in order to get predictable (incrementing) pod names. Based on the average network traffic to and from the videobridge pods, a horizontal pod autoscaler consistently adjusts the number of running videobridges to save on resources.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"802\" data-attachment-id=\"12643\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/11\/how-to-scale-jitsi-meet\/shard\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard.png\" data-orig-size=\"1053,825\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"shard\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard-1024x802.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard-1024x802.png\" alt=\"\" class=\"wp-image-12643\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard-1024x802.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard-300x235.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard-768x602.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/shard.png 1053w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Components in a Jitsi Meet shard<\/figcaption><\/figure><\/div>\n\n\n\n<p>Inside the Kubernetes cluster, an Ingress controller will accept HTTPS requests and terminate their TLS connections. The incoming connections now need to be load-balanced between the shards. Additionally, new participants that want to join a running conference need to be routed to the correct shard.<\/p>\n\n\n\n<p>To satisfy both requirements, a service running multiple instances of <a href=\"https:\/\/www.haproxy.org\/\">HAProxy<\/a> is used. HAProxy is a load-balancer for TCP and HTTP traffic. New requests are load-balanced between the shards using the round-robin algorithm for a fair load distribution. HAProxy uses DNS service discovery to find all existing shards. The following snippet is an extract of HAProxy&#8217;s configuration:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">backend jitsi-meet<br>  balance roundrobin<br>  mode http<br>  option forwardfor<br>  http-reuse safe<br>  http-request set-header Room %[urlp(room)]<br>  acl room_found urlp(room) -m found<br>  stick-table type string len 128 size 2k expire 1d peers mypeers<br>  stick on hdr(Room) if room_found<br>  # _http._tcp.web.jitsi.svc.cluster.local:80 is a SRV DNS record<br>  # A records don't work here because their order might change between calls and would result in different<br>  # shard IDs for each peered HAproxy<br>  server-template shard 0-5 _http._tcp.web.jitsi.svc.cluster.local:80 check resolvers kube-dns init-addr none<\/pre>\n\n\n\n<p>The configuration for HAProxy uses stick tables to route all traffic for an existing conference to the correct shard. Stick tables work similar to sticky sessions. In our example, HAProxy will store the mapping of a conference room URI to a specific shard in a dedicated key-value store that is shared with the other HAProxy instances. Thereby, all clients will be routed to the correct shard when joining a conference.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding.png\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"1024\" data-attachment-id=\"12645\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/11\/how-to-scale-jitsi-meet\/jitsi_sharding\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding.png\" data-orig-size=\"1043,1113\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"jitsi_sharding\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding-960x1024.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding-960x1024.png\" alt=\"\" class=\"wp-image-12645\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding-960x1024.png 960w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding-281x300.png 281w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding-768x820.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/jitsi_sharding.png 1043w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/a><figcaption>Load-balancing between multiple shards<\/figcaption><\/figure><\/div>\n\n\n\n<p>Another advantage that sharding gives you is that you can place shards in different geolocated regions and employ geobased routing. This way, users in North America, Europe or Asia can use different shards to optimize network latency.<\/p>\n\n\n\n<p>By splitting your Jitsi cluster in shards and scaling them horizontally, you can successfully serve an enormous amount of concurrent video conferences.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Octo Protocol<\/h2>\n\n\n\n<p>There is still a scaling problem when a lot of participants try to join the same conference, though. Up to this point, a single videobridge is responsible for routing all video stream traffic of a conference. This clearly limits the maximum number of participants of one conference.<\/p>\n\n\n\n<p>Additionally, imagine a globe-spanning conference between four people. Two in North America and two in Australia. So far, geobased routing still requires two of the participants to connect to a videobridge on another continent, which has some serious latency disadvantages.<\/p>\n\n\n\n<p>Fortunately, we can improve both situations by using the Octo protocol. Octo routes video streams between videobridge servers, essentially forming a cascade of forwarding servers. On the one hand, this removes the limit for a large number of participants in one conference due to the distributed client connections to multiple videobridges. On the other hand, Octo results in lower end-to-end media delay for gegraphically distributed participants.<\/p>\n\n\n\n<p>The downside of Octo is that its traffic is unencrypted. That is why lower-level protocols need to take care of encrypting the inter-bridge traffic. Freifunk M\u00fcnchen&#8217;s Jitsi cluster uses an overlay network with Nebula, VXLAN and a Wireguard VPN to connect the videobridge servers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Load Testing<\/h2>\n\n\n\n<p>When setting up a Jitsi cluster, it makes sense to perform load tests to determine your cluster&#8217;s limits before real people are starting to use the service. Jitsi&#8217;s developers have thankfully created a loadtesting tool that you can use: <a href=\"%20https:\/\/github.com\/jitsi\/jitsi-meet-torture\">Jitsi Meet Torture<\/a>. It simulates conference participants by sending prerecorded audio and video streams.<\/p>\n\n\n\n<p>The results of loadtests performed by HPI Schul-Cloud&#8217;s team may be an initial reference point \u2013&nbsp;they too are <a href=\"https:\/\/github.com\/hpi-schul-cloud\/jitsi-deployment\/blob\/master\/docs\/loadtests\/loadtestresults.md\">published on GitHub<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Jitsi Meet is free and open-source software that can be scaled pretty easily. It is possible to serve a large number of simultaneous conferences using sharding. However, even though Octo increases the maximum number of participants in a single conference, there are still some limitations in conference size \u2013 if nothing else because clients will have a hard time rendering lots of parallel video streams.<\/p>\n\n\n\n<p>Still, Jitsi Meet is a privacy-friendly alternative to commercial offerings like Zoom or Microsoft Teams that does not require participants to install yet another video conferencing app on their machines. Additionally, it can be self-hosted on quite a large scale, both in the public or private cloud \u2013 or on bare metal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Jitsi Meet Handbook: Architecture \u2013 <a href=\"https:\/\/jitsi.github.io\/handbook\/docs\/architecture\">https:\/\/jitsi.github.io\/handbook\/docs\/architecture<\/a><\/li><li>Jitsi Meet Handbook: DevOps Guide (scalable setup) \u2013 <a href=\"https:\/\/jitsi.github.io\/handbook\/docs\/devops-guide\/devops-guide-scalable\">https:\/\/jitsi.github.io\/handbook\/docs\/devops-guide\/devops-guide-scalable<\/a><\/li><li>HPI Schul-Cloud Architecture Documentation \u2013 <a href=\"https:\/\/github.com\/hpi-schul-cloud\/jitsi-deployment\/blob\/master\/docs\/architecture\/architecture.md\">https:\/\/github.com\/hpi-schul-cloud\/jitsi-deployment\/blob\/master\/docs\/architecture\/architecture.md<\/a><\/li><li>Jitsi Blog: New tutorial video: Scaling Jitsi Meet in the Cloud \u2013 <a href=\"https:\/\/jitsi.org\/blog\/new-tutorial-video-scaling-jitsi-meet-in-the-cloud\/\">https:\/\/jitsi.org\/blog\/new-tutorial-video-scaling-jitsi-meet-in-the-cloud\/<\/a><\/li><li>Meetrix.IO: Auto Scaling Jitsi Meet on AWS \u2013 <a href=\"https:\/\/meetrix.io\/blog\/webrtc\/jitsi\/jitsi-meet-auto-scaling.html\">https:\/\/meetrix.io\/blog\/webrtc\/jitsi\/jitsi-meet-auto-scaling.html<\/a><\/li><li>Meetrix.IO: How many Users and Conferences can Jitsi support on AWS \u2013 <a href=\"https:\/\/meetrix.io\/blog\/webrtc\/jitsi\/how-many-users-does-jitsi-support.html\">https:\/\/meetrix.io\/blog\/webrtc\/jitsi\/how-many-users-does-jitsi-support.html<\/a><\/li><li>Annika Wickert et al. FFMUC goes wild: Infrastructure recap 2020 #rc3 \u2013 <a href=\"https:\/\/www.slideshare.net\/AnnikaWickert\/ffmuc-goes-wild-infrastructure-recap-2020-rc3\">https:\/\/www.slideshare.net\/AnnikaWickert\/ffmuc-goes-wild-infrastructure-recap-2020-rc3<\/a><\/li><li>Annika Wikert and Matthias Kesler. FFMUC presents #ffmeet &#8211; #virtualUKNOF \u2013 <a href=\"https:\/\/www.slideshare.net\/AnnikaWickert\/ffmuc-presents-ffmeet-virtualuknof\">https:\/\/www.slideshare.net\/AnnikaWickert\/ffmuc-presents-ffmeet-virtualuknof<\/a><\/li><li>Freifunk M\u00fcnchen Jitsi Server Setup \u2013 <a href=\"https:\/\/ffmuc.net\/wiki\/doku.php?id=knb:meet-server\">https:\/\/ffmuc.net\/wiki\/doku.php?id=knb:meet-server<\/a><\/li><li>Boris Grozev and Emil Ivov. Jitsi Videobridge Performance Evaluation \u2013 <a href=\"https:\/\/jitsi.org\/jitsi-videobridge-performance-evaluation\/\">https:\/\/jitsi.org\/jitsi-videobridge-performance-evaluation\/<\/a><\/li><li>FFMUC Meet Stats: Grafana Dashboard \u2013 <a href=\"https:\/\/stats.ffmuc.net\/d\/U6sKqPuZz\/meet-stats\">https:\/\/stats.ffmuc.net\/d\/U6sKqPuZz\/meet-stats<\/a><\/li><li>Arjun Nemani. How to integrate and scale Jitsi Video Conferencing \u2013&nbsp;<a href=\"https:\/\/github.com\/nemani\/scalable-jitsi\">https:\/\/github.com\/nemani\/scalable-jitsi<\/a><\/li><li>Chad Lavoie. Introduction to HAProxy Stick Tables \u2013 <a href=\"https:\/\/www.haproxy.com\/blog\/introduction-to-haproxy-stick-tables\/\">https:\/\/www.haproxy.com\/blog\/introduction-to-haproxy-stick-tables\/<\/a><\/li><li>HPI Schul-Cloud Jitsi Deployment: Loadtest results \u2013 <a href=\"https:\/\/github.com\/hpi-schul-cloud\/jitsi-deployment\/blob\/master\/docs\/loadtests\/loadtestresults.md\">https:\/\/github.com\/hpi-schul-cloud\/jitsi-deployment\/blob\/master\/docs\/loadtests\/loadtestresults.md<\/a><\/li><li>Jitsi Videobridge Docs: Setting up Octo (cascaded bridges) \u2013 <a href=\"https:\/\/github.com\/jitsi\/jitsi-videobridge\/blob\/master\/doc\/octo.md\">https:\/\/github.com\/jitsi\/jitsi-videobridge\/blob\/master\/doc\/octo.md<\/a><\/li><li>Boris Grozev. Improving Scale and Media Quality with Cascading SFUs \u2013 <a href=\"https:\/\/webrtchacks.com\/sfu-cascading\/\">https:\/\/webrtchacks.com\/sfu-cascading\/<\/a><\/li><li><a href=\"https:\/\/github.com\/jitsi\/jitsi-meet-torture\">https:\/\/github.com\/jitsi\/jitsi-meet-torture<\/a><\/li><\/ul>\n\n\n\n<p>Photo by <a href=\"https:\/\/unsplash.com\/@surface?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Surface<\/a> on <a href=\"https:\/\/unsplash.com\/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\">Unsplash<\/a><\/p>\n\n\n\n<p><strong>Author:<\/strong> Martin Bock \u2014 <a href=\"https:\/\/martin-bock.com\" title=\"https:\/\/martin-bock.com\">martin-bock.com<\/a>, <a href=\"https:\/\/twitter.com\/martbock\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/twitter.com\/martbock\">@martbock<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In today&#8217;s world, video conferencing is getting more and more important \u2013 be it for learning, business events or social interaction in general. Most people use one of the big players like Zoom or Microsoft Teams, which both have their share of privacy issues. However, there is an alternative approach: self-hosting open-source software like Jitsi [&hellip;]<\/p>\n","protected":false},"author":925,"featured_media":12657,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,650,223],"tags":[7,428,72,413,414,154,48,415,430,104,429],"ppma_author":[794],"class_list":["post-12547","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-scalable-systems","category-ultra-large-scale-systems","tag-cloud","tag-conference","tag-deployment","tag-jitsi","tag-jitsi-meet","tag-kubernetes","tag-scaling","tag-sharding","tag-teams","tag-video","tag-zoom"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/surface-tJEsiCVE-TU-unsplash.jpg","jetpack-related-posts":[{"id":13114,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/15\/corona-klassenzimmer-ein-blick-auf-das-bildungsplattform-chaos-in-deutschland\/","url_meta":{"origin":12547,"position":0},"title":"Corona-Klassenzimmer: Ein Blick auf das Bildungsplattform-Chaos in Deutschland","author":"Stephanie Jauss","date":"15. March 2021","format":false,"excerpt":"Es vergeht kaum eine Schulwoche ohne Meldungen \u00fcber Probleme mit Bildungsplattformen. Schauen wir uns das breite Feld in Deutschland also mal genauer an.","rel":"","context":"In &quot;Teaching and Learning&quot;","block_context":{"text":"Teaching and Learning","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/teaching-and-learning\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/title-image.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/title-image.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/title-image.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/title-image.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/title-image.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/title-image.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":22123,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/21\/scaling-a-basic-chat\/","url_meta":{"origin":12547,"position":1},"title":"Scaling a Basic Chat","author":"Max Merz","date":"21. February 2022","format":false,"excerpt":"Authors: Max Merz \u2014 merzmax.de, @MrMaxMerzMartin Bock \u2014 martin-bock.com, @martbock The idea of this project was to create a simple chat application that would grow over time. As a result, there would be more and more clients that want to chat with each other, what might lead to problems in\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/sent-vs-received_test-3.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/sent-vs-received_test-3.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/sent-vs-received_test-3.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/02\/sent-vs-received_test-3.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":10190,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/03\/01\/autoscaling-of-docker-containers-in-google-kubernetes-engine\/","url_meta":{"origin":12547,"position":2},"title":"Autoscaling of Docker Containers  in Google Kubernetes Engine","author":"de032","date":"1. March 2020","format":false,"excerpt":"In this blog post we are taking a look at scaling possibilities within Kubernetes in a cloud environment. We are going to present and discuss various options that all have the same target: increase the availability of a service.","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/03\/1052ebad-d01f-4803-bde6-e943c4598ef9.jpeg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/03\/1052ebad-d01f-4803-bde6-e943c4598ef9.jpeg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/03\/1052ebad-d01f-4803-bde6-e943c4598ef9.jpeg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/03\/1052ebad-d01f-4803-bde6-e943c4598ef9.jpeg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/03\/1052ebad-d01f-4803-bde6-e943c4598ef9.jpeg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2020\/03\/1052ebad-d01f-4803-bde6-e943c4598ef9.jpeg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":27789,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/07\/24\/beyond-reactive-how-ai-is-revolutionizing-kubernetes-autoscaling\/","url_meta":{"origin":12547,"position":3},"title":"Beyond Reactive: How AI is Revolutionizing Kubernetes Autoscaling","author":"Hannah Holzheu","date":"24. July 2025","format":false,"excerpt":"Note:\u00a0This blog post was written for the module Enterprise IT (113601a) in the summer semester of 2025 Introduction Kubernetes has become the leading open-source platform for managing containerized applications. Its ability to automate deployment, scaling, and operations helps teams efficiently manage microservices architectures and dynamic cloud workloads. A cornerstone of\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/07\/AIvsRuleBased.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/07\/AIvsRuleBased.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/07\/AIvsRuleBased.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/07\/AIvsRuleBased.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":21651,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/18\/deploy-random-chat-application-on-aws-ec2-with-kubernetes\/","url_meta":{"origin":12547,"position":4},"title":"Deploying Random Chat Application on AWS EC2 with Kubernetes","author":"dv029","date":"18. September 2021","format":false,"excerpt":"1. Introduction For the examination of the lecture \u201cSoftware Development for Cloud Computing\u201d, I want to build a simple Random Chat Application. The idea of this application is based on the famous chat application called Omegle. Omegle is where people can meet random people in the world and can have\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/image-19.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":27583,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/28\/einsatz-von-kunstlicher-intelligenz-zur-automatischen-skalierung-von-kubernetes-clustern\/","url_meta":{"origin":12547,"position":5},"title":"Einsatz von K\u00fcnstlicher Intelligenz zur automatischen Skalierung von Kubernetes-Clustern","author":"Lars Gerigk","date":"28. February 2025","format":false,"excerpt":"Anmerkung:\u00a0Dieser Blogpost wurde f\u00fcr das Modul Enterprise IT (113601a) verfasst.Aus Gr\u00fcnden der besseren Lesbarkeit wird in dieser Arbeit auf eine geschlechtsneutrale Differenzierung verzichtet. S\u00e4mtliche Personenbezeichnungen gelten gleicherma\u00dfen f\u00fcr alle Geschlechter. Kurzfassung Die Branche der fortschreitenden Cloud Digitalisierung und die steigenden Anforderungen an hochverf\u00fcgbaren, skalierbaren Anwendungen haben Kubernetes zu einer der\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-27.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-27.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-27.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/image-27.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":794,"user_id":925,"is_guest":0,"slug":"mb364","display_name":"Martin Bock","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/6d5fb33fe1fbc43472f3f858ac087b037555f073f3f575330aeb1f3d2b65609c?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12547","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/925"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=12547"}],"version-history":[{"count":9,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12547\/revisions"}],"predecessor-version":[{"id":21800,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12547\/revisions\/21800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media\/12657"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=12547"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=12547"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=12547"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=12547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}