{"id":444,"date":"2021-09-30T09:07:31","date_gmt":"2021-09-30T07:07:31","guid":{"rendered":"http:\/\/blog.dataengineer.at\/?p=444"},"modified":"2021-10-01T10:07:57","modified_gmt":"2021-10-01T08:07:57","slug":"realtime-web-app-in-3-tagen-geht-das","status":"publish","type":"post","link":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/","title":{"rendered":"Realtime web app in 3 days - is that possible?"},"content":{"rendered":"<p class=\"wp-block-paragraph\">The electoral authority would like to have a public real-time dashboard with the current election results for an early municipal council election at short notice.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>There are 3 days for a solution!<\/p><p>Is that possible?<\/p><\/blockquote><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sounds exciting and challenging for that short time.<br>Well, the end of the project cannot be postponed, because the election will take place in any case - on Sunday next week ...<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"723\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-1024x723.png\" alt=\"\" class=\"wp-image-461\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-1024x723.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-300x212.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-768x542.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-18x12.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-600x424.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-945x667.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal.png 1088w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Inhalt<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a4e6e4d0fce9\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewbox=\"0 0 24 24\" version=\"1.2\" baseprofile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a4e6e4d0fce9\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Ausgangslage\" >Starting position<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Losungsweg\" >Solution<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Wie_werden_die_Daten_verarbeitet\" >How is the data processed?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Wie_werden_die_Ergebnisse_dargestellt\" >How are the results presented?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Wie_kommt_die_Applikation_nun_ins_Web\" >How does the application get onto the web?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Wie_lauft_die_Webseite_mit_einem_Container\" >How does the website run with a container?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Und_wenn_sich_etwas_andert_in_der_Applikation\" >What if something changes in the application?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Was_passiert_bei_1000_gleichzeitigen_Seitenaufrufen\" >What happens with 1,000 simultaneous page views?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Wie_lief_es_denn_nun_tatsachlich_am_Wahltag\" >How did it actually go on election day?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Und_die_Kosten\" >And the cost?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#Conclusio\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Ausgangslage\"><\/span>Starting position<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every 5 minutes a file in JSON format is delivered to an FTP server with all preliminary election results, current graphics are to be displayed on a public website, with some filter options.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"888\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-04-1.png\" alt=\"\" class=\"wp-image-512\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-04-1.png 620w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-04-1-209x300.png 209w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-04-1-8x12.png 8w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-04-1-600x859.png 600w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Losungsweg\"><\/span>Solution<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As a cloud-only application in Azure, all the necessary services are available. <br>We decide on a Python application that runs as a container in a web app.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"533\" height=\"602\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AzureResources3.png\" alt=\"\" class=\"wp-image-485\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AzureResources3.png 533w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AzureResources3-266x300.png 266w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AzureResources3-11x12.png 11w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wie_werden_die_Daten_verarbeitet\"><\/span>How is the data processed?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The JSON file is sent to a <strong>BLOB-Storage<\/strong> .<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"453\" height=\"400\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Storage_Json.png\" alt=\"\" class=\"wp-image-466\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Storage_Json.png 453w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Storage_Json-300x265.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Storage_Json-14x12.png 14w\" sizes=\"auto, (max-width: 453px) 100vw, 453px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Python<\/strong>-Script reads and processes this data from the <strong>Azure Storage<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"866\" height=\"684\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python_Data.png\" alt=\"\" class=\"wp-image-467\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python_Data.png 866w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python_Data-300x237.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python_Data-768x607.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python_Data-15x12.png 15w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python_Data-600x474.png 600w\" sizes=\"auto, (max-width: 866px) 100vw, 866px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wie_werden_die_Ergebnisse_dargestellt\"><\/span>How are the results presented?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Python application enriches the raw data with appropriate style tags and formatting and generates it with <strong>Plotly <\/strong>for individual graphics, which <strong>Dash <\/strong>delivers. <br>The menu and filter controls are also available in Python as <strong>Dash-Responsive<\/strong> .<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"850\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-1024x850.png\" alt=\"\" class=\"wp-image-514\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-1024x850.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-300x249.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-768x637.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-14x12.png 14w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-600x498.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi-945x784.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Python-Dash-combi.png 1218w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wie_kommt_die_Applikation_nun_ins_Web\"><\/span>How does the application get onto the web?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Python application is packaged into a <strong>Docker<\/strong>-Container and will be transferred to a <strong>Container Registry<\/strong> pushed in Azure.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"674\" height=\"597\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_Docker.png\" alt=\"\" class=\"wp-image-469\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_Docker.png 674w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_Docker-300x266.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_Docker-14x12.png 14w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_Docker-600x531.png 600w\" sizes=\"auto, (max-width: 674px) 100vw, 674px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wie_lauft_die_Webseite_mit_einem_Container\"><\/span>How does the website run with a container?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An Azure <strong>WebApp <\/strong>holds the container image and is now available for web requests, the output of the WebApp is already the finished rendered HTML with all graphics, always with current data.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"172\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-1024x172.png\" alt=\"\" class=\"wp-image-489\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-1024x172.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-300x50.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-768x129.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-18x3.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-600x101.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2-945x159.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/WebApp_PullImage_Ready2.png 1256w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Und_wenn_sich_etwas_andert_in_der_Applikation\"><\/span>What if something changes in the application?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After the adjustment, a local <strong>Docker<\/strong>-Image is generated and pushed again, a <strong>WebHook <\/strong>ensures that the <strong>WebApp <\/strong>receives the changed image of the <strong>Registry <\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"282\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_DockerBuild.png\" alt=\"\" class=\"wp-image-470\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_DockerBuild.png 576w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_DockerBuild-300x147.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/PS_DockerBuild-18x9.png 18w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Was_passiert_bei_1000_gleichzeitigen_Seitenaufrufen\"><\/span>What happens with 1,000 simultaneous page views?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Serviceplan <\/strong>the WebApp can be scaled, depending on the traffic.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"431\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-1024x431.png\" alt=\"\" class=\"wp-image-472\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-1024x431.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-300x126.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-768x323.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-18x8.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-600x252.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp-945x397.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/ServicePlan_ScaleUp.png 1465w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">It is certainly not a bad idea to test the app beforehand, so a test with 1,000 simultaneous web requests is created with <strong>JMeter<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"586\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-1024x586.png\" alt=\"\" class=\"wp-image-473\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-1024x586.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-300x172.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-768x439.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-18x10.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-600x343.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter-945x540.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/JMeter.png 1142w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest and cheapest scaling shows very good response times with 10 accesses, with 1,000 it looks completely different, all requests are processed without any problems and CPU \/ memory are not at the limit either, but the response time is already 1 -3 seconds.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"303\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-1024x303.png\" alt=\"\" class=\"wp-image-475\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-1024x303.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-300x89.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-768x228.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-1536x455.png 1536w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-18x5.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-600x178.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses-945x280.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_S1_Reponses.png 1846w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A higher scaling results in very good access times of 25 ms.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"320\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-1024x320.png\" alt=\"\" class=\"wp-image-477\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-1024x320.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-300x94.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-768x240.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-1536x480.png 1536w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-18x6.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-600x187.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1-945x295.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/1000User_P3V3_Reponses-1.png 1851w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Additionally there will be <strong>Alerts <\/strong>set up to be able to react quickly - if the access time exceeds 1 second or if more than 10 web errors occur in 5 minutes, an SMS is sent.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"688\" height=\"412\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertRules2.png\" alt=\"\" class=\"wp-image-478\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertRules2.png 688w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertRules2-300x180.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertRules2-18x12.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertRules2-600x359.png 600w\" sizes=\"auto, (max-width: 688px) 100vw, 688px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"829\" height=\"573\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertSlowResponse.png\" alt=\"\" class=\"wp-image-479\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertSlowResponse.png 829w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertSlowResponse-300x207.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertSlowResponse-768x531.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertSlowResponse-18x12.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/AlertSlowResponse-600x415.png 600w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Wie_lief_es_denn_nun_tatsachlich_am_Wahltag\"><\/span>How did it actually go on election day?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first counts will be publicly available from 4:00 p.m., so this expected peak was upscaled.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The tension rises...<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"639\" height=\"562\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-02.png\" alt=\"\" class=\"wp-image-481\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-02.png 639w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-02-300x264.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-02-14x12.png 14w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Wahl-Portal-02-600x528.png 600w\" sizes=\"auto, (max-width: 639px) 100vw, 639px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After the 4:00 p.m. peak, another one came at 7:00 p.m. with the TV news and then the next morning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The tested 1,000 requests were also reached with around 1,400.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The ideal access times of 30ms - 100ms, there were also practically no server errors.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"541\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-1024x541.png\" alt=\"\" class=\"wp-image-482\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-1024x541.png 1024w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-300x158.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-768x406.png 768w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-1536x811.png 1536w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-18x10.png 18w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-600x317.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2-945x499.png 945w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-08-24h-2.png 1899w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">But now something should be adapted to the processing and also small corrections in the layout - during operation.<br>This also went smoothly, with practically no downtime - the app was adapted locally, pushed as Docker and automatically pulled into the app with the WebHook.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Und_die_Kosten\"><\/span>And the cost?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Operation in the Azure cloud is more than manageable.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"564\" height=\"190\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Cost.png\" alt=\"\" class=\"wp-image-508\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Cost.png 564w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Cost-300x101.png 300w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/Cost-18x6.png 18w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusio\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A simple web application can be developed very quickly and set up relatively easily as a cloud-only solution in Azure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A big advantage is the scaling depending on the traffic and, as in this case, also for temporary projects that are switched off after a few weeks and no longer cause any costs.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>In addition to the political sensation, this mini-project was also a success.<\/p><\/blockquote><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"598\" height=\"1024\" src=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-Endergebnis-598x1024.png\" alt=\"\" class=\"wp-image-483\" srcset=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-Endergebnis-598x1024.png 598w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-Endergebnis-175x300.png 175w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-Endergebnis-7x12.png 7w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-Endergebnis-600x1027.png 600w, http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl-Endergebnis.png 622w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p> <\/p><p>Share your experience with a comment below!<\/p><p><\/p><\/blockquote><\/figure>","protected":false},"excerpt":{"rendered":"<p>Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard.<br \/>\nThere are 3 days for a solution!<br \/>\nIs that possible?<\/p>","protected":false},"author":1,"featured_media":505,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5,65,64],"tags":[16,69,67,75,72,68,70,71,73,66],"class_list":["post-444","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","category-real-time","category-web-applikatiion","tag-azure","tag-dash","tag-docker","tag-gemeinderatswahl","tag-graz","tag-python","tag-python-dash","tag-real-time","tag-wahl","tag-web-app"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Realtime Web-App in 3 Tagen - geht das? - Data.Engineer BLOG<\/title>\n<meta name=\"description\" content=\"Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard. Es sind 3 Tage Zeit f\u00fcr eine L\u00f6sung! Ist das m\u00f6glich?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Realtime Web-App in 3 Tagen - geht das? - Data.Engineer BLOG\" \/>\n<meta property=\"og:description\" content=\"Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard. Es sind 3 Tage Zeit f\u00fcr eine L\u00f6sung! Ist das m\u00f6glich?\" \/>\n<meta property=\"og:url\" content=\"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/\" \/>\n<meta property=\"og:site_name\" content=\"Data.Engineer BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-30T07:07:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-01T08:07:57+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl_Title-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"data.engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"data.engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#article\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/\"},\"author\":{\"name\":\"data.engineer\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/#\\\/schema\\\/person\\\/fe307e617b3de204775ffd3d9d8dc04a\"},\"headline\":\"Realtime Web-App in 3 Tagen &#8211; geht das?\",\"datePublished\":\"2021-09-30T07:07:31+00:00\",\"dateModified\":\"2021-10-01T08:07:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/\"},\"wordCount\":610,\"commentCount\":0,\"publisher\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/#\\\/schema\\\/person\\\/fe307e617b3de204775ffd3d9d8dc04a\"},\"image\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GrazWahl_Title-3.png\",\"keywords\":[\"azure\",\"dash\",\"docker\",\"gemeinderatswahl\",\"graz\",\"python\",\"python dash\",\"real time\",\"wahl\",\"web app\"],\"articleSection\":[\"Azure\",\"Real Time\",\"Web Applikation\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/\",\"url\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/\",\"name\":\"Realtime Web-App in 3 Tagen - geht das? - Data.Engineer BLOG\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GrazWahl_Title-3.png\",\"datePublished\":\"2021-09-30T07:07:31+00:00\",\"dateModified\":\"2021-10-01T08:07:57+00:00\",\"description\":\"Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard. Es sind 3 Tage Zeit f\u00fcr eine L\u00f6sung! Ist das m\u00f6glich?\",\"breadcrumb\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#primaryimage\",\"url\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GrazWahl_Title-3.png\",\"contentUrl\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2021\\\/09\\\/GrazWahl_Title-3.png\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/realtime-web-app-in-3-tagen-geht-das\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"http:\\\/\\\/blog.dataengineer.at\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Realtime Web-App in 3 Tagen &#8211; geht das?\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/#website\",\"url\":\"http:\\\/\\\/blog.dataengineer.at\\\/\",\"name\":\"Data.Engineer BLOG\",\"description\":\"All about data...\",\"publisher\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/#\\\/schema\\\/person\\\/fe307e617b3de204775ffd3d9d8dc04a\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\\\/\\\/blog.dataengineer.at\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/#\\\/schema\\\/person\\\/fe307e617b3de204775ffd3d9d8dc04a\",\"name\":\"data.engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/Oliver_Cartoon3_240x320-1-150x150.jpg\",\"url\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/Oliver_Cartoon3_240x320-1-150x150.jpg\",\"contentUrl\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/Oliver_Cartoon3_240x320-1-150x150.jpg\",\"caption\":\"data.engineer\"},\"logo\":{\"@id\":\"http:\\\/\\\/blog.dataengineer.at\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/Oliver_Cartoon3_240x320-1-150x150.jpg\"},\"sameAs\":[\"http:\\\/\\\/dataengineer.at\"],\"url\":\"http:\\\/\\\/blog.dataengineer.at\\\/en\\\/author\\\/data-engineer\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Realtime Web-App in 3 Tagen - geht das? - Data.Engineer BLOG","description":"Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard. Es sind 3 Tage Zeit f\u00fcr eine L\u00f6sung! Ist das m\u00f6glich?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/","og_locale":"en_US","og_type":"article","og_title":"Realtime Web-App in 3 Tagen - geht das? - Data.Engineer BLOG","og_description":"Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard. Es sind 3 Tage Zeit f\u00fcr eine L\u00f6sung! Ist das m\u00f6glich?","og_url":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/","og_site_name":"Data.Engineer BLOG","article_published_time":"2021-09-30T07:07:31+00:00","article_modified_time":"2021-10-01T08:07:57+00:00","og_image":[{"width":640,"height":360,"url":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl_Title-3.png","type":"image\/png"}],"author":"data.engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"data.engineer","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#article","isPartOf":{"@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/"},"author":{"name":"data.engineer","@id":"http:\/\/blog.dataengineer.at\/#\/schema\/person\/fe307e617b3de204775ffd3d9d8dc04a"},"headline":"Realtime Web-App in 3 Tagen &#8211; geht das?","datePublished":"2021-09-30T07:07:31+00:00","dateModified":"2021-10-01T08:07:57+00:00","mainEntityOfPage":{"@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/"},"wordCount":610,"commentCount":0,"publisher":{"@id":"http:\/\/blog.dataengineer.at\/#\/schema\/person\/fe307e617b3de204775ffd3d9d8dc04a"},"image":{"@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl_Title-3.png","keywords":["azure","dash","docker","gemeinderatswahl","graz","python","python dash","real time","wahl","web app"],"articleSection":["Azure","Real Time","Web Applikation"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/","url":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/","name":"Realtime Web-App in 3 Tagen - geht das? - Data.Engineer BLOG","isPartOf":{"@id":"http:\/\/blog.dataengineer.at\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#primaryimage"},"image":{"@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl_Title-3.png","datePublished":"2021-09-30T07:07:31+00:00","dateModified":"2021-10-01T08:07:57+00:00","description":"Die Wahlbeh\u00f6rde h\u00e4tte gerne kurzfristig ein \u00f6ffentliches Realtime-Dashboard. Es sind 3 Tage Zeit f\u00fcr eine L\u00f6sung! Ist das m\u00f6glich?","breadcrumb":{"@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#primaryimage","url":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl_Title-3.png","contentUrl":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2021\/09\/GrazWahl_Title-3.png","width":640,"height":360},{"@type":"BreadcrumbList","@id":"http:\/\/blog.dataengineer.at\/en\/realtime-web-app-in-3-tagen-geht-das\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"http:\/\/blog.dataengineer.at\/"},{"@type":"ListItem","position":2,"name":"Realtime Web-App in 3 Tagen &#8211; geht das?"}]},{"@type":"WebSite","@id":"http:\/\/blog.dataengineer.at\/#website","url":"http:\/\/blog.dataengineer.at\/","name":"Data.Engineer BLOG","description":"All about data...","publisher":{"@id":"http:\/\/blog.dataengineer.at\/#\/schema\/person\/fe307e617b3de204775ffd3d9d8dc04a"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/blog.dataengineer.at\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"http:\/\/blog.dataengineer.at\/#\/schema\/person\/fe307e617b3de204775ffd3d9d8dc04a","name":"data.engineer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2020\/12\/Oliver_Cartoon3_240x320-1-150x150.jpg","url":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2020\/12\/Oliver_Cartoon3_240x320-1-150x150.jpg","contentUrl":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2020\/12\/Oliver_Cartoon3_240x320-1-150x150.jpg","caption":"data.engineer"},"logo":{"@id":"http:\/\/blog.dataengineer.at\/wp-content\/uploads\/2020\/12\/Oliver_Cartoon3_240x320-1-150x150.jpg"},"sameAs":["http:\/\/dataengineer.at"],"url":"http:\/\/blog.dataengineer.at\/en\/author\/data-engineer\/"}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/posts\/444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/comments?post=444"}],"version-history":[{"count":52,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/posts\/444\/revisions"}],"predecessor-version":[{"id":530,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/posts\/444\/revisions\/530"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/media\/505"}],"wp:attachment":[{"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/media?parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/categories?post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.dataengineer.at\/en\/wp-json\/wp\/v2\/tags?post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}