{"id":24229,"date":"2023-02-27T00:14:10","date_gmt":"2023-02-26T23:14:10","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=24229"},"modified":"2023-06-18T17:09:04","modified_gmt":"2023-06-18T15:09:04","slug":"hyperrace-finding-the-right-architecture-approach-for-an-online-racing-game","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/27\/hyperrace-finding-the-right-architecture-approach-for-an-online-racing-game\/","title":{"rendered":"HyperRace &#8211; finding the right architecture approach for an online racing game"},"content":{"rendered":"<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-introduction\">Introduction<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-requirements\">Requirements<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-architecture-approaches\">Architecture approaches<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-architecture-approaches\">Hosted Peer-to-Peer (Hosted P2P)<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-dedicated-server\">Dedicated Server<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-hybrid-solutions-services\">Hybrid solutions &amp; services<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-game-states-racing-world-player-data\">Game States: Racing World &amp; Player Data<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-state-simulation-client-prediction-server-side-reconciliation-interpolation\">State Simulation<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-client-prediction\">Client prediction<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-avoid-desynchronization-with-server-reconciliation\">Server reconciliation<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-interpolation\">Interpolation<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-conclusion\">Conclusion<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-sources\">Sources<\/a><\/li><\/ul><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-introduction\"><strong>Introduction<\/strong><\/h2>\n\n\n\n<p>You all know racing games. From the realistic, simulated ones like Formula 1 or Forza Motorsport to the playful, arcade-heavy ones like Super Mario Kart or Need For Speed.<\/p>\n\n\n\n<p>The range is large, but somehow pretty standard. So we want to take it a little crazier. After all, who says that it always has to be cars as vehicles? Why not a turbine? Or yes &#8211; directly a whole rocket engine? Yes! And the driver sits directly on the drive train! And players shoot each other down with hilarious and mean attacks and traps. Something like this:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/AqA71cWs1WA?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=en-US&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span>\n<\/div><\/figure>\n\n\n\n<p>I know it&#8217;s not strictly a racing game &#8211; more of a flying game, but from a technical point of view we have the same parameters per player such as the position or speed of the players and other objects on the track and the collisions of these objects with each other.<\/p>\n\n\n\n<p>Ok, now that we have our crazy game idea, we also need to somehow ensure that our players can enjoy playing together on different devices.<\/p>\n\n\n\n<p>But how are we gonna do this? What multiplayer architecture approaches are there? What are their pros and cons? What data do we need to exchange between players? And how do we trade different latencies to give every player a smooth, zero-latency gaming experience?<\/p>\n\n\n\n<p>Exactly these questions are answered in this blog entry. Thus, this blog entry can be seen as the first starting point into the world of online multiplayer architecture.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-requirements\"><strong>Requirements<\/strong><\/h2>\n\n\n\n<p>To narrow things down a bit, let&#8217;s first establish a few rules for our game:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Each race takes place on a closed race track \/ There is no open world<\/li>\n\n\n\n<li>There are 10 different racetracks and 7 different vehicles.<\/li>\n\n\n\n<li>A maximum of 10 players play together in a lobby or on a race track<\/li>\n\n\n\n<li>The graphic representation takes place exclusively on the end device of the user<\/li>\n\n\n\n<li>The gaming experience should take place in real time<\/li>\n\n\n\n<li>Players are matched to a lobby<\/li>\n\n\n\n<li>There is a global player ranking<\/li>\n\n\n\n<li>Each player can accelerate, brake and steer<\/li>\n\n\n\n<li>Each player can pick up items on the racetrack and use them to attack other players or place traps on the racetrack<\/li>\n\n\n\n<li>Each player must be authenticated in order to play<\/li>\n\n\n\n<li>The system should initially be able to trade around 250,000 users per hour and scale accordingly<\/li>\n\n\n\n<li>The system should be operated as cheaply as possible; however, we also want to offer our players a smooth, fun and immersive gaming experience<\/li>\n<\/ul>\n\n\n\n<p>As can be seen in the requirements, in this article we will focus exclusively on the pure racing game experience &#8211; for example driving, overtaking and collision between vehicles and objects. For the time being, we neglect the use of universally popular social functions such as managing friend lists or joining friend lobbies.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-architecture-approaches\"><strong>Architecture approaches&nbsp;<\/strong><\/h2>\n\n\n\n<p>Now that we&#8217;ve defined some basic requirements, let&#8217;s first look at the most popular architectural paradigms that connect players around the world. Underlying these approaches is a common goal: to provide players with a synchronous, latency-free and fluid gaming experience in near real-time.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-architecture-approaches\"><strong><strong>Hosted Peer-to-Peer (Hosted P2P)<\/strong>&nbsp;<\/strong><\/h3>\n\n\n\n<p>In times when cloud solution is always touted as the all-purpose weapon, it is almost unbelievable that an old approach like peer-to-peer is still so widespread. But popular games like Demon&#8217;s Souls, Dark Souls, Bloodborne, GTA Online, Red Dead Online, Animal Crossing: New Horizons, Super Smash Bros. Ultimate or F1 2021 partly operate their online worlds via peer-to-peer networks <sup>1<\/sup>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/p2p.png\"><img loading=\"lazy\" decoding=\"async\" width=\"389\" height=\"342\" data-attachment-id=\"24231\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/27\/hyperrace-finding-the-right-architecture-approach-for-an-online-racing-game\/p2p-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/p2p.png\" data-orig-size=\"389,342\" 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=\"p2p\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/p2p.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/p2p.png\" alt=\"\" class=\"wp-image-24231\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/p2p.png 389w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/p2p-300x264.png 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/a><figcaption class=\"wp-element-caption\">Img.1: Hosted Peer-to-peer architecture (Hosted P2P)<\/figcaption><\/figure>\n\n\n\n<p>The principle of a hosted P2P network seems simple at first: One player is the host of the game, i.e. the player&#8217;s computer acts as a &#8220;server&#8221;. The host inputs, as well as the inputs of the other players, arrive at the host. The current game events (state) are calculated and sent back to the players (Img.1).&nbsp;<\/p>\n\n\n\n<p>So as a company, there is no need for a server at this point, so we gonna save these costs, which can be an enormous sum with a targeted utilization of 250,000 players. The scaling and the corresponding rush of incoming players can also be easily distributed among several host players. Unlike a dedicated server, thousands of games are not calculated on one machine, but on a selected player &#8211; the host &#8211; calculates exactly one game and transmits the results to the other players (in our example max. 10 players in a lobby, so 25,000 host players must be found with a planned load of 250,000 players).<\/p>\n\n\n\n<p>Conversely, this also means that the other players in a lobby are dependent on the host in many ways. The host migration &#8211; which player is the best host? &#8211; is crucial. Because if the host has a miserable download or upload speed, this creates high latencies for the other players &#8211; delays and a bad gaming experience for these players are the consequences. One solution would be that the host is the player who has the lowest average ping time among all other participating players. Or only players who are geographically close to each other are assigned to a lobby. But what do we do if a player from Tokyo wants to play with a player in Berlin? In addition, the host user must provide enough free hardware resources such as CPU and RAM in order to be able to calculate the entire gameplay and display his own gameplay. But what if that&#8217;s not the case? Likewise, the host receives the results on his PC first &#8211; simply because of the short geographic and physical transmission path and the resulting lack of ping &#8211; so that this can also lead to asynchronous gameplay. This must also be prevented so that all players get a synchronous, simultaneous gaming experience.&nbsp;<\/p>\n\n\n\n<p>Another challenge in a hosted P2P network is host cheating or host hacking. How can we trust the host and make sure they aren&#8217;t cheating and manipulating gameplay? Because all player events are calculated on his PC. To solve this requires a solution such as a separate authoritative server <sup>2<\/sup> .<\/p>\n\n\n\n<p>In summary, there are the following reasons for or against a hosted peer-to-peer approach:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Advantages<\/strong><\/td><td><strong>Disadvantages<\/strong><\/td><\/tr><tr><td>No \/ Low costs<\/td><td>Host performance affects other players&#8217; gaming experience<\/td><\/tr><tr><td>Simple scaling through the computing power of the users<\/td><td>Host cheating \/ hacking<\/td><\/tr><tr><td>Load balancing across multiple players (not 1000 games on one server)<\/td><td>Host migration<\/td><\/tr><tr><td>Global distribution<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In particular, the problem of the trustworthiness of the host poses a major challenge for the P2P approach. Another popular approach is the \u201cdedicated server\u201d architecture. This approach solves the trust problem through a central authority. Let&#8217;s take a closer look.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-dedicated-server\"><strong>Dedicated Server<\/strong><\/h3>\n\n\n\n<p>With a &#8220;dedicated server&#8221; architecture, all game events &#8211; the inputs of the players &#8211; are sent to a central server. The server calculates the resulting state for each player and sends this state back to the players (Img. 2). The server is neither part of the game nor a separate player as in the hosted P2P approach. A dedicated server is only responsible for calculating the gameplay. Other social functions such as matchmaking are usually outsourced to other servers, since a dedicated server and all its resources are only provided for this one task &#8211; calculating the current state. Accordingly, dedicated servers usually do not have a GPU, since a graphical game display is not necessary. Instead, they have a high number of CPUs and RAM, since game lobbies and their state have to be kept and calculated during the game.&nbsp;<br>A large number of currently very popular multiplayer games such as Fortnite, Minecraft, Apex Legends, Rocket League, Among Us, Rainbow Six Seige, Ghost of Tsushima Legends or Roblox use this principle <sup>1<\/sup>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/d2s.png\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"324\" data-attachment-id=\"24232\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/27\/hyperrace-finding-the-right-architecture-approach-for-an-online-racing-game\/d2s\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/d2s.png\" data-orig-size=\"461,324\" 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=\"d2s\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/d2s.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/d2s.png\" alt=\"\" class=\"wp-image-24232\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/d2s.png 461w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/d2s-300x211.png 300w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/a><figcaption class=\"wp-element-caption\">Img. 2: Dedicated server architecture<\/figcaption><\/figure>\n\n\n\n<p>Compared to the hosted P2P approach, there are definitely costs associated with operating dedicated servers. Depending on the infrastructure and scaling pattern, this can result in different costs <sup>3<\/sup>. Furthermore, scaling can also be a challenge if the servers are operated &#8220;on-premise&#8221;, because there must be enough servers available, they must be maintained and operated. And in addition, these servers are sometimes &#8220;dead capital&#8221; if they are not fully utilized.&nbsp;<\/p>\n\n\n\n<p>On the other hand, there are advantages that eliminate some of the disadvantages of the hosted P2P approach: When operating a dedicated server, you can count on consistently high performance, because we know about the performance of our servers and know how many users can play on one unit at the same time. This is usually not the case with hosted P2P, since the performance and networking capability can vary greatly depending on the host&#8217;s end device. This also makes it easier to estimate and plan capacities. If we operate our servers using the cloud, we can relatively easily scale horizontally (more servers) and vertically (more resources per server) depending on the corresponding demand from the players. Operation in the cloud also ensures consistent global performance, since the servers are distributed around the world and are not in a central location. This is mostly not the case in the hosted P2P approach, since a gaming lobby is dependent on the performance and location of the host, which does not need to be close to the other players.<\/p>\n\n\n\n<p>However, one of the biggest advantages of the dedicated server approach is the reliability and security of the game state, as it is calculated on an independent, secure instance, making it very difficult for players to cheat. While the hosted P2P approach allows a host to manipulate its position on the racetrack, for example, this is made significantly more difficult with approaches such as server-side reconciliation. Because the server always knows the last position of the player. If this delivers unrealistic values \u200b\u200bas input, the server can compare this with the value of the last frame and determine that there is an abnormal value and send adjustments to the player accordingly <sup>4<\/sup>.&nbsp;<\/p>\n\n\n\n<p>In summary, there are the following reasons for or against the dedicated server approach:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-regular\"><table><tbody><tr><td><strong>Advantages<\/strong><\/td><td><strong>Disadvantages<\/strong><\/td><\/tr><tr><td>Security &amp; Reliability (GameState is calculated on an independent authority)<\/td><td>High costs<\/td><\/tr><tr><td>Constant (high) performance<\/td><td>Scaling (on premise)<\/td><\/tr><tr><td>Plannable capacities<\/td><td><\/td><\/tr><tr><td>Easy scaling (cloud)<\/td><td><\/td><\/tr><tr><td>Global Distribution (Cloud)<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-hybrid-solutions-services\"><strong>Hybrid solutions &amp; services&nbsp;<\/strong><\/h3>\n\n\n\n<p>In addition to the approaches just mentioned, there are also mixed approaches. It is not uncommon for a dedicated server or hosted P2P architecture to be expanded by additional, separate game services. Such services are operated on standalone servers and deal with things like matchmaking, grouping up players and picking a dedicated server or (for peer to peer games) sharing IP addresses between players so they can connect together. They handle other things such as leaderboards, player progress, unlocks, chatting and friend lists etc. In this way, areas of responsibility are clearly separated and the load is distributed to different machines (Img. 3).&nbsp;<\/p>\n\n\n\n<p>Well-known examples of such a solution are the games GTA Online, Warframe or Among us, whose players are connected to each other via a hosted P2P network, but the matchmaking runs on an own server. This model has been the subject of some criticism due to the potential for host cheating. However, the developers mostly has implemented several separate Measurement Services to prevent cheating in the game like Client-Side-Validation that includes checks for speed hacks, aimbots, and other forms of cheating and Activity- and System Monitoring that checks for suspicious activity on the player&#8217;s system like memory manipulation, injection attacks, and other forms of hacking <sup>4<\/sup>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"24233\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/27\/hyperrace-finding-the-right-architecture-approach-for-an-online-racing-game\/egdgd\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd.png\" data-orig-size=\"2803,930\" 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=\"egdgd\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-1024x340.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-1024x340.png\" alt=\"\" class=\"wp-image-24233\" width=\"768\" height=\"255\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-1024x340.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-300x100.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-768x255.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-1536x510.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/egdgd-2048x680.png 2048w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><figcaption class=\"wp-element-caption\">Img. 3: Hosted P2P with gaming services (left), Dedicated Server with gaming services (right)<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-game-states-racing-world-player-data\"><strong>Game States: Racing World &amp; Player Data<\/strong><\/h2>\n\n\n\n<p>Now that we&#8217;ve gotten to know the common architecture approaches in online gaming, we have to ask the question of what data we have to exchange in order to determine the current state of the game. But before we get into the data, what exactly is the state anyway? To shed more light on this, let&#8217;s look at the multiplayer approach of one of the most well-known game engines &#8211; the Unreal Engine 5 &#8211; here for example, a distinction is made between three different units: GameMode, GameState and PlayerState <sup>5<\/sup> (see Figure 5). Other game engines like Unity use a similar approach, but the implementation varies <sup>6<\/sup>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/sfsgfsf.png\"><img loading=\"lazy\" decoding=\"async\" width=\"733\" height=\"649\" data-attachment-id=\"24234\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/27\/hyperrace-finding-the-right-architecture-approach-for-an-online-racing-game\/sfsgfsf\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/sfsgfsf.png\" data-orig-size=\"733,649\" 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=\"sfsgfsf\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/sfsgfsf.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/sfsgfsf.png\" alt=\"\" class=\"wp-image-24234\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/sfsgfsf.png 733w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/sfsgfsf-300x266.png 300w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><\/a><figcaption class=\"wp-element-caption\">Img. 4: GameMode, GameState and PlayerState in&nbsp; the example of a client-server architecture (dedicated server)<sup>5<\/sup><\/figcaption><\/figure>\n\n\n\n<p>Let&#8217;s explain the orange part of the image above (Img. 4) using our racing game<sup> 7<\/sup>:&nbsp;<\/p>\n\n\n\n<p>The <strong>GameMode<\/strong> manages the global rules of a race. In our case these are for example:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The minimum number of players needed to start a race (min. 2)<\/li>\n\n\n\n<li>The maximum number of players in a race (10 players)<\/li>\n\n\n\n<li>The number of laps each player must complete to finish the race<\/li>\n\n\n\n<li>The spawn location and order of players on the racetracks<\/li>\n\n\n\n<li>The time of the countdown<\/li>\n\n\n\n<li>The allowed weapons and traps<\/li>\n<\/ul>\n\n\n\n<p>The <strong>GameState<\/strong> manages global information about the current gameplay that is relevant for all players, such as:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The number of currently connected players<\/li>\n\n\n\n<li>The start and finish time of each individual player<\/li>\n\n\n\n<li>The current ranking (based on each player&#8217;s current position)<\/li>\n\n\n\n<li>The position of all players<\/li>\n\n\n\n<li>The location and state of all fired weapons and traps<\/li>\n\n\n\n<li>The position and state of each checkpoint on the track.<\/li>\n<\/ul>\n\n\n\n<p>The <strong>PlayerState<\/strong> will exist for every player connected to the game on both the server and the clients. This class can be used for replicated properties that all clients, not just the owning client, are interested in like the current<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>car model<\/li>\n\n\n\n<li>round on the race track<\/li>\n\n\n\n<li>position of a player&nbsp;&nbsp;<\/li>\n\n\n\n<li>speed of a player&nbsp;<\/li>\n\n\n\n<li>direction of a player<\/li>\n\n\n\n<li>steering angle of a player<\/li>\n\n\n\n<li>down force of a player<\/li>\n\n\n\n<li>amount of a specific collected item of a player<\/li>\n\n\n\n<li>status of a specific collected item (fired or not and target player)<\/li>\n\n\n\n<li>collisions of a player with another player or object<\/li>\n<\/ul>\n\n\n\n<p>By continuously updating the game state and all player states based on these inputs, we can provide a seamless and engaging experience for all players involved.<\/p>\n\n\n\n<p>In addition to identifying what data makes up the state, it is important to understand how the player state is computed taking into account different latencies so that all players feel like they are sharing a synchronous gaming experience with other players at all times. How this works is explained in the next section.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-state-simulation-client-prediction-server-side-reconciliation-interpolation\"><strong>State Simulation<\/strong><\/h2>\n\n\n\n<p>Almost all modern 3D online games have to face an essential challenge: How do we balance the latency of the client-server communication (or client-host player in P2P) so that each player can experience smooth, latency-free gameplay locally, but at the same time uses the current state of the server.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-client-prediction\"><strong>Client prediction&nbsp;<\/strong><\/h3>\n\n\n\n<p>During a multiplayer online game, each player communicates with the server (dedicated server) or the host player (hosted P2P). This communication happens asynchronously so that the player can experience a smooth gaming experience: For example, the player sends his new position to the server. Instead of waiting until the answer comes back from the server and freezing the player&#8217;s screen for the response time (latency) of for example 300 ms (that would be synchronous), the next frame is rendered directly and the player (in our case the racing car) is located directly at the new position. This approach is known as client prediction. Assuming that the game world is deterministic, the player&#8217;s input can lead directly to the desired action locally (for exmaple a new position, an animation or a physics calculation) and this will in most cases also correspond to the state of the server <sup>8,9<\/sup>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-avoid-desynchronization-with-server-reconciliation\"><strong>Server reconciliation&nbsp;<\/strong><\/h3>\n\n\n\n<p>Since in a racing game the communication between player and server should take place as quickly as possible, UDP is used as the network protocol in most online multiplayer games and frameworks <sup>10,11<\/sup>. In contrast to TCP, the order of the incoming packets is not guaranteed with UDP. Depending on the latency between player and server, the responses from the server can sometimes arrive at the player at different times and in a different order, so that the position of the server no longer has to match the new local position of the player (because the player is already moving in the game, for example). Thus, the player game state and the server game state are desynchronized. However, since the server game state is the trusted game state <sup>12<\/sup>, the game now has to process the new information from the server  and make an adjustment, for example reset the player locally to the server&#8217;s position. However, since the player has already moved locally, this would lead to an unclean gaming experience (glitches) and breakes immersion &#8211; and we want to avoid that at all costs! So what do you do in such a case?<\/p>\n\n\n\n<p>One solution to this problem is server reconciliation. A sequential number is added to each input sent by the player to the server to ensure the order of actions. This input is stored both on the player and on the server. If the player now receives a response from the server that matches the player state, the associated number can be removed locally and the next number follows in order. However, if the server&#8217;s answers follow in a different order, the player now knows locally that an answer to a specific number is still missing. However, since the player knows the answer to the actions before and after the missing answer, he can simulate the current state, which is then validated again by the server afterwards. This means that the server and player always synchronize with a slight delay in comparison to the next frame. However, this also ensures that the gameplay is represented graphically fluently <sup>8<\/sup>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-interpolation\"><strong>Interpolation<\/strong><\/h3>\n\n\n\n<p>Now that the simulated state between two states (the result of the server-side reconciliation) also graphically leads to a smooth transition movement, we use the concept of interpolation. Interpolation algorithms are part of every common game engine <sup>14,15<\/sup>.&nbsp; There is linear interpolation to calculate states between two positions and spherical interpolation to calculate states between two degrees of rotation. This algorithm always requires two states (for example two positions on the race track) in order to calculate the positions in between and then display them in a fluid movement. In our case, these are the two positions that have been successfully validated and transmitted by the server before and after a certain input from the player. Based on these positions, the intermediate positions are now calculated, which are required for the execution of the graphic representation <sup>13<\/sup>.<\/p>\n\n\n\n<p>The combination of client-side prediction, server-side reconciliation and interpolation can help ensure a smooth and responsive online multiplayer game experience. By using these techniques, game developers can minimize network latency issues and keep players synchronized across multiple devices and network connections. To make these three approaches easier to understand, I will highly refer to a <a href=\"https:\/\/gabrielgambetta.com\/client-side-prediction-live-demo.html\" target=\"_blank\" rel=\"noopener\" title=\"\">Live-Demo<\/a> at this point.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-conclusion\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>With this article we took the first step into the world of online-multiplayer-architecture. We discussed architectural approaches for multiplayer games, got to know the game and player state and understood which data we have to exchange between our players. Finally, we looked at concepts that compensate the latencies between player and server by simulating an intermediate state.<\/p>\n\n\n\n<p>When choosing a suitable architecture for an online game, it has been shown that P2P, dedicated servers or hybrid approaches are technical solutions that present developers with different challenges. As it turned out, hybrid solutions in particular are preferred in order to keep costs as low as possible while still being able to offer players an immersive and fun gaming experience through server-based, separate services such as match-making or activity monitoring. P2P solutions are ideal for small, unknown games with little to no budget, while games with predictable, stable sources of income have more money for their own server infrastructures. However, by using free tiers, smaller games with a few players at start can also take advantage of Dedicated Cloud Servers to launch their game in the first place <sup>2,16<\/sup>.<\/p>\n\n\n\n<p>In order to make a final decision regarding the architecture of our racing game, further research is required, such as a detailed cost comparison, comparison of different frameworks or cloud providers and implementation details.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-sources\"><strong>Sources<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><tbody><tr><td>[1]<\/td><td>R.Rhett, What is Peer-to-Peer Gaming, and How Does it Work?, December 2021 [Online]. Available: <br><a href=\"https:\/\/vgkami.com\/what-is-peer-to-peer-gaming-and-how-does-it-work\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/vgkami.com\/what-is-peer-to-peer-gaming-and-how-does-it-work\/<\/a><\/td><\/tr><tr><td>[2]<\/td><td>Photon, Authoritative Server FAQ, 2023 [Online]. Available: <br><a href=\"https:\/\/doc.photonengine.com\/bolt\/current\/troubleshooting\/authoritative-server-faq\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/doc.photonengine.com\/bolt\/current\/troubleshooting\/authoritative-server-faq<\/a><\/td><\/tr><tr><td>[3]<\/td><td>AWS, Amazon GameLift &#8211; Prices, 2023. [Online]. Available: <br><a href=\"https:\/\/aws.amazon.com\/de\/gamelift\/pricing\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/aws.amazon.com\/de\/gamelift\/pricing\/<\/a><\/td><\/tr><tr><td>[4]<\/td><td>G, Gambetta, Fast-Paced Multiplayer (Part I): Client-Server Game Architecture, 2022 [Online]. Available: Client-Server Game Architecture <a href=\"https:\/\/gabrielgambetta.com\/client-server-game-architecture.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/gabrielgambetta.com\/client-server-game-architecture.html<\/a><\/td><\/tr><tr><td>[5]<\/td><td>R. Mayya, Leveraging UE4&#8217;s Gameplay Framework for our Multiplayer game, 2020 [Online]. Available: <br><a href=\"https:\/\/medium.com\/project-asura\/leveraging-ue4-gameplay-framework-for-our-multiplayer-game-41724f2e1dcd\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/medium.com\/project-asura\/leveraging-ue4-gameplay-framework-for-our-multiplayer-game-41724f2e1dcd<\/a><\/td><\/tr><tr><td>[6]<\/td><td>Unity, Unity Documentation: NetworkBehaviour, 2021  [Online]. Available: <br><a href=\"https:\/\/docs.unity3d.com\/Manual\/class-NetworkBehaviour.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/docs.unity3d.com\/Manual\/class-NetworkBehaviour.html<\/a><\/td><\/tr><tr><td>[7]<\/td><td>Epic Games, UE5 Documentation: Game Mode and Game State &#8211; Overview of the Game Mode and Game State, 2023  [Online]. Available:  <a href=\"https:\/\/docs.unrealengine.com\/5.1\/en-US\/game-mode-and-game-state-in-unreal-engine\/\">https:\/\/docs.unrealengine.com\/5.1\/en-US\/game-mode-and-game-state-in-unreal-engine\/<\/a><\/td><\/tr><tr><td>[8]<\/td><td>G, Gambetta, Fast-Paced Multiplayer (Part II): Client-Side Prediction and Server Reconciliation, 2022 [Online]. Available: <a href=\"https:\/\/gabrielgambetta.com\/client-side-prediction-server-reconciliation.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/gabrielgambetta.com\/client-side-prediction-server-reconciliation.html<\/a><\/td><\/tr><tr><td>[9]<\/td><td>Wikipedia, Client-side prediction, 2021 [Online]. Available: <br><a href=\"https:\/\/en.wikipedia.org\/wiki\/Client-side_prediction\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/en.wikipedia.org\/wiki\/Client-side_prediction<\/a><\/td><\/tr><tr><td>[10]<\/td><td>Photon, Binary Protocol, 2023 [Online]. Available: <br><a href=\"https:\/\/doc.photonengine.com\/realtime\/current\/reference\/binary-protocol\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/doc.photonengine.com\/realtime\/current\/reference\/binary-protocol<\/a><\/td><\/tr><tr><td>[11]<\/td><td>M. Carroll, UDP vs TCP: Why to Run Gaming Servers Separate from Chat, December 2022 [Online]. Available: <a href=\"https:\/\/www.pubnub.com\/blog\/why-you-should-run-your-game-servers-separate-from-your-chat\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/www.pubnub.com\/blog\/why-you-should-run-your-game-servers-separate-from-your-chat\/<\/a><\/td><\/tr><tr><td>[12]<\/td><td>Epic Games, UE3 Documentation: Unreal Networking Architecture, 2012  [Online]. Available:  <a href=\"https:\/\/docs.unrealengine.com\/udk\/Three\/NetworkingOverview.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/docs.unrealengine.com\/udk\/Three\/NetworkingOverview.html<\/a><\/td><\/tr><tr><td>[13]<\/td><td>G, Gambetta, Fast-Paced Multiplayer (Part II): Fast-Paced Multiplayer (Part III): Entity Interpolation 2022 [Online]. Available: <a href=\"https:\/\/gabrielgambetta.com\/entity-interpolation.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/gabrielgambetta.com\/entity-interpolation.html<\/a><\/td><\/tr><tr><td>[14]<\/td><td>Unity, Unity Documentation: Vector3.Lerp, 2021  [Online]. Available: <br><a href=\"https:\/\/docs.unity3d.com\/ScriptReference\/Vector3.Lerp.html\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/docs.unity3d.com\/ScriptReference\/Vector3.Lerp.html<\/a><\/td><\/tr><tr><td>[15]<\/td><td>Epic Games, UE5 Documentation: Lerp, 2023  [Online]. Available: <br><a href=\"https:\/\/docs.unrealengine.com\/5.1\/en-US\/BlueprintAPI\/Math\/Float\/Lerp\/\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/docs.unrealengine.com\/5.1\/en-US\/BlueprintAPI\/Math\/Float\/Lerp\/<\/a><\/td><\/tr><tr><td>[16]<\/td><td>Photon, Photon Pricing, 2023 [Online]. Available:<br> <a href=\"https:\/\/www.photonengine.com\/pun\/pricing\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.photonengine.com\/pun\/pricing<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction You all know racing games. From the realistic, simulated ones like Formula 1 or Forza Motorsport to the playful, arcade-heavy ones like Super Mario Kart or Need For Speed. The range is large, but somehow pretty standard. So we want to take it a little crazier. After all, who says that it always has [&hellip;]<\/p>\n","protected":false},"author":1121,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,396,649,21,651,223],"tags":[],"ppma_author":[893],"class_list":["post-24229","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-games","category-interactive-media","category-system-architecture","category-system-designs","category-ultra-large-scale-systems"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":23961,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/10\/microservices-any-good\/","url_meta":{"origin":24229,"position":0},"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":23067,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/15\/security-strategies-and-best-practices-for-microservices-architecture\/","url_meta":{"origin":24229,"position":1},"title":"Security Strategies and Best Practices for Microservices Architecture","author":"Larissa Schmauss","date":"15. March 2022","format":false,"excerpt":"Microservices architectures seem to be the new trend in the approach to application development. However, one should always keep in mind that microservices architectures are always closely associated with a specific environment:\u00a0Companies want to develop faster and faster, but resources are also becoming more limited, so they now want to\u2026","rel":"","context":"In &quot;Scalable Systems&quot;","block_context":{"text":"Scalable Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/"},"img":{"alt_text":"","src":"https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a","width":350,"height":200,"srcset":"https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a 1x, https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a 1.5x"},"classes":[]},{"id":12906,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/03\/11\/event-driven-architectures\/","url_meta":{"origin":24229,"position":2},"title":"Event-driven Architectures","author":"Max Merz","date":"11. March 2021","format":false,"excerpt":"Next to the powerful Request \/ Response architecture exists another architecture, the event-driven one. How this architecture works, where the differences to Request \/ Response systems are and how transactions can be realized will be part of this article. Events There are three types of messages that can be used\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\/2021\/03\/stateful-stream-processing.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/stateful-stream-processing.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/stateful-stream-processing.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/stateful-stream-processing.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/stateful-stream-processing.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/03\/stateful-stream-processing.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":3496,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2018\/03\/30\/ci-cd-with-gitlab-ci-for-a-web-application-part-1\/","url_meta":{"origin":24229,"position":3},"title":"CI\/CD with GitLab CI for a web application &#8211; Part 1","author":"Nina Schaaf","date":"30. March 2018","format":false,"excerpt":"Introduction When it comes to software development, chances are high that you're not doing this on your own. The main reason for this is often that implementing components like UI, frontend, backend, servers and more is just too much to handle for a single person leading to a slow development\u2026","rel":"","context":"In &quot;DevOps&quot;","block_context":{"text":"DevOps","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/devops\/"},"img":{"alt_text":"Shaky architecture","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2018\/03\/01_shaky-architecture-300x106.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":5305,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2019\/02\/26\/experiences-from-breaking-down-a-monolith-2\/","url_meta":{"origin":24229,"position":4},"title":"Experiences from breaking down a monolith (2)","author":"vb052","date":"26. February 2019","format":false,"excerpt":"Written by Verena Barth, Marcel Heisler, Florian Rupp, & Tim Tenckhoff Architecture Besides earlier technological considerations, we primarily wanted to change the architecture of the initial project. The first approach was in spite of the applied software patterns and architectural concepts of the Web Application Architecture lecture constructed as a\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\/2019\/02\/Bild_eingefugt_am_2019-02-26__1_31_PM-1-150x150.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/Bild_eingefugt_am_2019-02-26__1_31_PM-1-150x150.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/Bild_eingefugt_am_2019-02-26__1_31_PM-1-150x150.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/02\/Bild_eingefugt_am_2019-02-26__1_31_PM-1-150x150.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":27440,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/27\/how-i-improved-the-network-security-of-my-live-chat-application-architecture-on-aws\/","url_meta":{"origin":24229,"position":5},"title":"How I Improved the Network Security of My Live Chat Application Architecture on AWS","author":"Jannik Scheider","date":"27. February 2025","format":false,"excerpt":"In an increasingly connected world, the need for robust security measures for cloud infrastructures is constantly growing. Applications that are accessible over the internet must be secured in a way that prevents unnecessary exposure of sensitive backend components. A fully public Virtual Private Cloud (VPC) architecture may be sufficient for\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":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":893,"user_id":1121,"is_guest":0,"slug":"sj057","display_name":"Simon Janik","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5c40e7ce24a65a5ba1fe8f0a7507afed4bc40e62fde4453c460c328908a316eb?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\/24229","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\/1121"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=24229"}],"version-history":[{"count":8,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/24229\/revisions"}],"predecessor-version":[{"id":24776,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/24229\/revisions\/24776"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=24229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=24229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=24229"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=24229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}