{"id":12879,"date":"2021-03-10T21:55:34","date_gmt":"2021-03-10T20:55:34","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=12879"},"modified":"2023-06-18T18:04:31","modified_gmt":"2023-06-18T16:04:31","slug":"how-to-scale-real-time-tweet-delivery-architecture-at-twitter","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/10\/how-to-scale-real-time-tweet-delivery-architecture-at-twitter\/","title":{"rendered":"How to Scale: Real-time Tweet Delivery Architecture at Twitter"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"508\" data-attachment-id=\"12880\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/10\/how-to-scale-real-time-tweet-delivery-architecture-at-twitter\/twittter\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter.jpg\" data-orig-size=\"1710,848\" 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;1&quot;}\" data-image-title=\"twittter\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter-1024x508.jpg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter-1024x508.jpg\" alt=\"\" class=\"wp-image-12880\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter-1024x508.jpg 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter-300x149.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter-768x381.jpg 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter-1536x762.jpg 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/twittter.jpg 1710w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>There is a lot to say about Twitters infrastructure, storage and design decisions. Starting as a Ruby-on-Rails website Twitter has grown significantly over the years. With 145 million monetizable daily users (Q3 2019), 500 million tweets (2014) and almost 40 billion US dollar market capitalization (Q4 2020) Twitter is clearly high scale. The microblogging platform, publicly launched in July 2006, is one of the biggest players in the game nowadays. But what\u2019s the secret handling 300K QPS (queries per second) and provide a real-time tweet delivery? Read about how Redis Clusters and Tweet Fanouts revolutionized the user\u2019s home timeline.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>Sidenote:&nbsp;<\/strong>In the past Twitter used&nbsp;<em>Ruby&nbsp;<\/em>in their backend system. Because of the dysfunctional garbage collector and loosely typed syntax they switched to the functional and object-oriented programming language&nbsp;<em>Scala<\/em>.<\/p>\n\n\n\n<p><strong>1. Pull and Push (different timelines)<\/strong><\/p>\n\n\n\n<p>There are two different approaches at Twitter: Pull- and push-based delivery. While the pull approach needs the device to pull content from an API or service, the push approach delivers timelines to the device without the device having to pull permanently via a socket connection. Targeted timelines are personalized by people one\u2019s following while queried timelines generally are based on specific search criteria. There are different services assigned to different approaches, as seen in figure 1.<\/p>\n\n\n\n<p>For the sake of completeness, let\u2019s have a quick look into Twitter\u2019s different timelines.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>User timeline:&nbsp;<\/strong>Totality of all one\u2019s (re)tweets<\/li><li><strong>Home timeline:&nbsp;<\/strong>Totality of all the (re)tweets people post or like one person follows<\/li><li><strong>Search timeline:&nbsp;<\/strong>Totality of tweets based on searches<\/li><\/ul>\n\n\n\n<p>This blog post focuses on the user\u2019s home timeline (pull based, targeted). Check the linked sources below if you want to know more about the other timelines and pushed based services like push notifications and follow streams.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"256\" data-attachment-id=\"12882\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/10\/how-to-scale-real-time-tweet-delivery-architecture-at-twitter\/bildschirmfoto-2021-03-10-um-21-13-38\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38.png\" data-orig-size=\"1112,278\" 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=\"Bildschirmfoto-2021-03-10-um-21.13.38\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38-1024x256.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38-1024x256.png\" alt=\"\" class=\"wp-image-12882\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38-1024x256.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38-300x75.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38-768x192.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.13.38.png 1112w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Figure 1: Pull and pushed based services [4]<\/figcaption><\/figure>\n\n\n\n<p><strong>2. Architecture Overview<\/strong><\/p>\n\n\n\n<p><strong>Challenge:&nbsp;<\/strong>Around 400 million daily tweets seem to be a lot, but especially Twitter\u2019s read-write ratio is special. In general, there are a lot more reads to handle than writes. 300K QPS (queries per second) are spent reading timelines and only 6000 requests per second are spent on writes. Especially with celebrities, tweets must reach several million people in a few seconds. Furthermore, there are a lot of complex rules on which content will be displayed in which timeline and how retweets, replies and mentions are handled. To meet this challenge, Twitter rebuilt large parts of its architecture in 2013. And consequently, more work is now being put into reading instead of writing processes.<\/p>\n\n\n\n<p><strong>How it works:&nbsp;<\/strong>Let us dive in this in order to understand how Twitter is handling a tweet from the beginning to the followers home timelines within seconds. As seen in figure 2, there is an API called&nbsp;<em>write API,&nbsp;<\/em>which is hit by the tweet after clicking on the&nbsp;<em>send&nbsp;<\/em>button. A quick HTTP response (after eliminating duplicated tweets by watching for the business logic of a tweet format in the HTTP header) will be returned to the client within 50 milliseconds to confirm a successful call (200). Due to the asynchronous nature of the process there is no need to maintain a permanent connection.<\/p>\n\n\n\n<p>Next up is the so-called&nbsp;<em>fanout&nbsp;<\/em>which is responsible for spreading out the tweet to all people following the author by inserting it to all their home timelines. For caching all the home timelines, a bunch of&nbsp;<em>Redis Clusters&nbsp;<\/em>are used. The in-memory key-value store is one of the most important parts of Twitter\u2019s architecture to deliver in real-time and its ability to scale. This timeline cache allows twitter to move the hard work away from the device and the sorting and merging process to be done in advance in the upstream cache. The device only has to pull its new timeline with help of the timeline service. Within 5 seconds, all the new tweets are displayed in the user\u2019s home timeline at once. Although the goal is 5 seconds it can take up to 5 minutes, especially when celebrities like Lady Gaga or Kylie Jenner tweet, retweet and mention each other. As a result, sometimes the reply can arrive before the actual tweet is received. As you can see, there is a lot more work to do in regards of reading instead of writing processes &#8211; especially for people with millions of followers.<\/p>\n\n\n\n<p>At the same time (after hitting the API) the tweet is also saved in&nbsp;<em>Manhattan<\/em>, a persistent database Twitter is using. More precisely, only small content like text or emojis are saved in&nbsp;<em>Manhattan<\/em>, larger data like pictures or videos is saved in a database called&nbsp;<em>Blobstore.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12883\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/10\/how-to-scale-real-time-tweet-delivery-architecture-at-twitter\/bildschirmfoto-2021-03-10-um-21-15-17\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17.png\" data-orig-size=\"1128,986\" 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=\"Bildschirmfoto-2021-03-10-um-21.15.17\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17-1024x895.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17-1024x895.png\" alt=\"\" class=\"wp-image-12883\" width=\"420\" height=\"367\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17-1024x895.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17-300x262.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17-768x671.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.15.17.png 1128w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><\/a><figcaption>Figure 2: Twitter Tweet Delivery Architecture [1]<\/figcaption><\/figure>\n\n\n\n<p><strong>3. Fanout<\/strong><\/p>\n\n\n\n<p>After getting a first overview of the architecture, let\u2019s have a closer look at the fanout logic and data caching. In the past Twitter has used\u00a0<em>Memcached\u00a0<\/em>servers to cache the tweet upstreams before delivering them to the users. Now they are using\u00a0<em>Redis Clusters\u00a0<\/em>for the caching process.\u00a0<em>Memcached,\u00a0<\/em>known as a key-value store, deals in binary blobs without further structured information. In contrast, Redis Clusters deal in structured data, which helps to be way faster and more efficient. Especially when it comes to appending new tweets to the home timeline, the native list structure of\u00a0<em>Redis\u00a0<\/em>is a perfect fit because parsing is expensive.<\/p>\n\n\n\n<p>The user\u2019s home timeline is stored three times in the clusters because of fault tolerance and redundancy reasons. In total around 300 tweets per timeline are held in cache, sorted by user ids. To check the relations in order to insert the tweet in the right home timelines, a&nbsp;<em>social graph&nbsp;<\/em>is used. The s<em>ocial graph&nbsp;<\/em>contains information about users&#8217; connections and relationships and is realized by a service called&nbsp;<em>FlockDb (GraphDb).&nbsp;<\/em>In general,&nbsp;<em>FlockDb&nbsp;<\/em>maintains the follower and followings lists. With the help of this tree-structured graph, it\u2019s possible to filter out all the people following the tweet\u2019s author.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.35.13.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12887\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/10\/how-to-scale-real-time-tweet-delivery-architecture-at-twitter\/bildschirmfoto-2021-03-10-um-21-35-13\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.35.13.png\" data-orig-size=\"708,724\" 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=\"Bildschirmfoto-2021-03-10-um-21.35.13\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.35.13.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.35.13.png\" alt=\"\" class=\"wp-image-12887\" width=\"335\" height=\"342\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.35.13.png 708w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/Bildschirmfoto-2021-03-10-um-21.35.13-293x300.png 293w\" sizes=\"auto, (max-width: 335px) 100vw, 335px\" \/><\/a><figcaption>Figure 2: Tweet Delivery Home Timeline [4]<\/figcaption><\/figure>\n\n\n\n<p>Every tweet is stored only by its unique tweet id, the author\u2019s id and some additional bits to reduce unnecessary data and increase performance. Appropriately,&nbsp;<em>Redis&nbsp;<\/em>is really good at storing variable-length entries, so there\u2019s no need for all these records to actually be the same length. Before pulling the updated home timeline to the device, the&nbsp;<em>Timeline Service&nbsp;<\/em>(in interaction with other services) is responsible for the final&nbsp;<em>hydration<\/em>.<\/p>\n\n\n\n<p><em>Hydrated tweets\u00a0<\/em>are processed and ready for delivery. Regularly, the service composes the tweet from its user id, user icon, tweet text, geoinformation etc. within 50 milliseconds. If the user is inactive the process can take up to 3 seconds. Speaking of inactive users, the in-memory\u00a0<em>Redis\u00a0<\/em>Clusters only store home timelines of active users in the cache to save storage. So they act like\u00a0<em>LRU\u00a0<\/em>(least recently used) caches and throw out old data. In general, an active user is someone who was logged in within the last 30 days. If this is not the case, the process of reassembling and reconstructing the home timeline usually takes around 3 seconds. By querying the social graph service, Twitter checks which people the inactive user is following and subsequently hits the disk for every single one of them and shoves their home timeline back into Redis. Inactive users aren\u2019t stored in RAM to keep latency low, too.<\/p>\n\n\n\n<p><strong>Good to know:&nbsp;<\/strong>In case your tweet is actually not a tweet but a retweet, Twitter can append the id of the original tweet to your retweet. When you retweet, you\u2019re generating a new tweet with it\u2019s own id behind the scenes, but it\u2019s linked to the retweeted one.<\/p>\n\n\n\n<p><strong>4. Lessons learned<\/strong><\/p>\n\n\n\n<p>Although Twitter\u2019s home timeline is only one part of Twitter\u2019s real-time tweet delivery architecture, its impact is huge. This central part of the platform is one of the most important things in order to be able to scale, efficiently and to deal with the millions of users. Consequently, we can learn a lot about the way twitters engineers think and which decisions have been made. According to the principle\u00a0<em>\u201ebest of bread\u201c<\/em> Twitter does not think much of standardized procedures but adapts itself actively to the circumstances and chooses the technology that fits the best. The need for bleeding edge scalability certainly supports this attitude.<\/p>\n\n\n\n<p><strong>Main learnings from the real-time tweet delivery architecture summarized:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Be clear about your most important goal. Speed? Reliability? Correctness of data? Often you can\u2019t get it all at once, especially when you scale.<\/li><li>Check your write-read ratio before designing your architecture. Where do you need to put work in?<\/li><li>Don\u2019t get too attached to technologies or standards if they do not fit your problem (anymore).<\/li><li>Consider exactly which data from which users really MUST be kept in the cache instead of simply storing everything.<\/li><li>Think about high value users like celebrities etc. &#8211; They often show you the limits of your current infrastructure. Ask yourself how do you\u00a0<em>want\u00a0<\/em>to deal with those?<\/li><\/ul>\n\n\n\n<p><strong>5. Conclusion<\/strong><\/p>\n\n\n\n<p>Obviously, Twitter did not scale from the beginning. Real time delivery always requires continuous adaptation and improvement to keep up with growing numbers. And sometimes it\u2019s not real-time at all when Lady Gaga\u2019s Tweets need to be received by 80 million followers. Also, it\u2019s not that rare that tweet replies are delivered faster than the tweet itself. However, this is accepted in order to guarantee real-time delivery as good as possible. In conclusion, you can say that Twitter as one of the big player knows exactly where to put work in. This is the only way to guarantee Twitter&#8217;s unique selling proposition, which brings different people together to discuss topics from all over the world. Its extremely broad variety of topics, great user experience and easy way to tweet helps to stay up to date and connect, without losing focus and <em>speed<\/em> &#8211; the ultimate goal today and in future.<\/p>\n\n\n\n<p><strong>6. Main Sources<\/strong><\/p>\n\n\n\n<p>[1] http:\/\/highscalability.com\/blog\/2013\/7\/8\/the-architecture-twitter-uses-to-deal-with-150m-active- users.html<br>[2] https:\/\/www.businessofapps.com\/data\/twitter-statistics\/<br>[3] https:\/\/blog.twitter.com\/engineering\/en_us\/topics\/infrastructure\/2017\/the-infrastructure-behind-twitter-scale.html<br>[4] www.youtube.com\/watch?v=J5auCY4ajK8 \/ http:\/\/www.infoq.com\/presentations\/Twitter-Timeline- Scalability<br>[5] https:\/\/stackshare.io\/twitter\/twitter<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>There is a lot to say about Twitters infrastructure, storage and design decisions. Starting as a Ruby-on-Rails website Twitter has grown significantly over the years. With 145 million monetizable daily users (Q3 2019), 500 million tweets (2014) and almost 40 billion US dollar market capitalization (Q4 2020) Twitter is clearly high scale. The microblogging platform, [&hellip;]<\/p>\n","protected":false},"author":1018,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,650,223],"tags":[448,449,204,221],"ppma_author":[843],"class_list":["post-12879","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-scalable-systems","category-ultra-large-scale-systems","tag-scalability","tag-tweet","tag-twitter","tag-ultra-large-scale-systems"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":9663,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/02\/24\/how-to-increase-robustness-of-a-large-scale-system-by-testing\/","url_meta":{"origin":12879,"position":0},"title":"How to increase robustness of a large scale system by testing","author":"Johannes Mauthe","date":"24. February 2020","format":false,"excerpt":"When a distributed software system grows bigger and bigger, one will end up with a big amount of various components which all need to scale independently. In order to achieve these components working smooth together, it is necessary to figure out at which time a component needs to be scaled,\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:\/\/lh3.googleusercontent.com\/8h_z-5W6olzeJeyXw7NwIHYdRJs3FyHcLk-NSsfw_eWM-2oCE1FnZFBxC3qw2IqdnSal43O8bc5uMGFaBvbKLZjhRu4Q2nlitp7AbAeNTc3BOFW2u_6xtpR3jIEvNLDPpsrmL8c9","width":350,"height":200},"classes":[]},{"id":36,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2015\/11\/26\/systems-engineering-and-management-ws-20152016\/","url_meta":{"origin":12879,"position":1},"title":"Systems Engineering and Management WS 2015\/2016","author":"Thomas Pohl","date":"26. November 2015","format":false,"excerpt":"The course Systems Engineering and Management is designed to bridge the gap between theoretical studies in Ultra Large\u00a0Scale Systems\u00a0and\u00a0professional state of the art development. Students should find a platform to explore modern tooling and environments for building, integrating, testing and scaling their applications. It turned out as a good idea\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":"","width":0,"height":0},"classes":[]},{"id":22183,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/26\/is-the-future-of-social-networks-decentralized\/","url_meta":{"origin":12879,"position":2},"title":"Is the future of social networks decentralized?","author":"Niklas Janssen","date":"26. August 2022","format":false,"excerpt":"Current social networks like Facebook, Twitter or Instagram mostly have a centralized approach ([1], [2], [6]). They are centralized in the sense, that all data is processed in data centers that are under a corporation's control. It is hard to beat the economies of scale that can be achieved by\u2026","rel":"","context":"In &quot;Rich Media Systems&quot;","block_context":{"text":"Rich Media Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/rich-media-systems\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/p2p_structure.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/p2p_structure.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/p2p_structure.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/p2p_structure.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/p2p_structure.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":23138,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/31\/an-overview-of-large-scale-deep-learning\/","url_meta":{"origin":12879,"position":3},"title":"An overview of Large Scale Deep Learning","author":"mk374","date":"31. March 2022","format":false,"excerpt":"article by Annika Strau\u00df (as426) and Maximilian Kaiser (mk374) Introduction Improving Deep Learning with ULS for superior model training Single Instance Single Device (SISD) Multi Instance Single Device (MISD) Multi Instance Multi Device (MIMD) Single Instance Multi Device (SIMD) Model parallelism Data parallelism Improving ULS and its components with the\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\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/quantum-physics-g1357f44f5_1920-Kopie.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":23961,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/10\/microservices-any-good\/","url_meta":{"origin":12879,"position":4},"title":"Microservices &#8211; any good?","author":"Kim Bastiaanse","date":"10. February 2023","format":false,"excerpt":"As software solutions continue to evolve and grow in size and complexity, the effort required to manage, maintain and update them increases. To address this issue, a modular and manageable approach to software development is required.\u00a0Microservices architecture provides a solution by breaking down applications into smaller, independent services that can\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\/2023\/02\/Microservice.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":6076,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2019\/03\/12\/large-scale-deployment-for-deep-learning-models-with-tensorflow-serving\/","url_meta":{"origin":12879,"position":5},"title":"Large Scale Deployment for Deep Learning Models with TensorFlow Serving","author":"Florian Wintel","date":"12. March 2019","format":false,"excerpt":"Image source Introduction \"How do you turn a trained model into a product, that will bring value to your enterprise?\" In recent years, serving has become a hot topic in machine learning. With the ongoing success of deep neural networks, there is a growing demand for solutions that address the\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\/2023\/08\/serving_architecture-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/serving_architecture-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/08\/serving_architecture-1.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":843,"user_id":1018,"is_guest":0,"slug":"th149","display_name":"Tamara Hezel","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/23f02afe92e5349d7c0a0513da87fb511d2f5684b81d65c15b340d45c7131f0e?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\/12879","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\/1018"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=12879"}],"version-history":[{"count":15,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12879\/revisions"}],"predecessor-version":[{"id":13172,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/12879\/revisions\/13172"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=12879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=12879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=12879"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=12879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}