[{"data":1,"prerenderedAt":346},["ShallowReactive",2],{"content-page:\u002Fsystems-integration\u002Fpresentations":3,"content-page-quiz:none":3,"book-module-total-pages":4,"content-section-pages:none":5,"content-directory-pages:\u002Fsystems-integration\u002Fpresentations":6},null,[],[],[7],{"id":8,"title":9,"audience":10,"body":11,"contentType":318,"course":319,"description":320,"estimateBasis":321,"estimatedDiscussionMinutes":322,"estimatedLiveMinutes":323,"estimatedTotalMinutes":324,"extension":325,"meta":326,"module":327,"navigation":328,"order":329,"path":330,"promptAssist":331,"seo":332,"status":333,"stem":334,"tags":335,"videoDuration":341,"videoId":342,"videoLink":343,"videoTitle":344,"week":327,"__hash__":345},"content\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview.md","Required Architecture Overview","student",{"type":12,"value":13,"toc":306},"minimark",[14,39,55,81,142,169,201,242,269],[15,16,19,23],"slide",{"id":17,"level":18},"architecture-title","2",[20,21,9],"h2",{"id":22},"required-architecture-overview",[24,25,26,30,33,36],"ul",{},[27,28,29],"li",{},"Use a queue-centered service design",[27,31,32],{},"Separate the app from the service network",[27,34,35],{},"Route internal work through RabbitMQ",[27,37,38],{},"Store transformed project data in the database",[15,40,42,46],{"id":41,"level":18},"architecture-diagram",[20,43,45],{"id":44},"architecture-shape","Architecture Shape",[47,48,49],"p",{},[50,51],"img",{"alt":52,"src":53,"variant":54},"IT490 systems integration architecture diagram","\u002Fimages\u002Fsystems-integration\u002Farchitecture-diagram.png","slide-screenshot",[15,56,58,61,64,78],{"id":57,"level":18},"main-rule",[20,59,60],{"id":57},"Main Rule",[47,62,63],{},"The app server does not directly connect to internal services.",[24,65,66,69,72,75],{},[27,67,68],{},"App server sends requests to RabbitMQ",[27,70,71],{},"RabbitMQ routes messages to the correct service",[27,73,74],{},"Workers handle the requested work",[27,76,77],{},"Results or status return through the queue",[47,79,80],{},"Core idea: internal machine communication is message queue traffic.",[15,82,84,87,90],{"id":83,"level":18},"technology-examples",[20,85,86],{"id":83},"Technology Examples",[47,88,89],{},"The diagram names common course technologies, but the roles matter more than the exact product.",[91,92,95,120],"two-col",{"gap":93,"left-width":94,"right-width":94},"lg","1fr",[96,97,99,104],"template",{"v-slot:left":98},"",[100,101,103],"h3",{"id":102},"app-server","App Server",[24,105,106,114,117],{},[27,107,108,109],{},"Example: Apache + PHP",[24,110,111],{},[27,112,113],{},"Could be any approved backend",[27,115,116],{},"Handles user-facing app logic",[27,118,119],{},"Publishes work requests",[96,121,122,126],{"v-slot:right":98},[100,123,125],{"id":124},"db-server","DB Server",[24,127,128,136,139],{},[27,129,130,131],{},"Example: MySQL or MariaDB\n",[24,132,133],{},[27,134,135],{},"Could be any approved database",[27,137,138],{},"Stores user and project data",[27,140,141],{},"Stores transformed API cache data",[15,143,145,149,152,166],{"id":144,"level":18},"cache-clarification",[20,146,148],{"id":147},"api-result-cache","API Result Cache",[47,150,151],{},"The database can cache API results, but not as a raw dump.",[24,153,154,157,160,163],{},[27,155,156],{},"API worker calls the external API",[27,158,159],{},"API worker transforms the response",[27,161,162],{},"App stores the cleaned result needed by the project",[27,164,165],{},"Cached data should support user workflows",[47,167,168],{},"Cache the useful project data, not every field from the external response.",[15,170,172,175,178,181,198],{"id":171,"level":18},"what-is-a-job",[20,173,174],{"id":171},"What Is A Job?",[47,176,177],{},"A job is a small request for another service to do work.",[47,179,180],{},"Examples:",[24,182,183,186,189,192,195],{},[27,184,185],{},"Fetch player stats from an API",[27,187,188],{},"Process a user upload",[27,190,191],{},"Refresh cached data",[27,193,194],{},"Send a notification",[27,196,197],{},"Write an audit or status event",[47,199,200],{},"A job should include enough information for the worker to act without guessing.",[15,202,204,207,210,239],{"id":203,"level":18},"job-message-shape",[20,205,206],{"id":203},"Job Message Shape",[47,208,209],{},"A message usually identifies:",[24,211,212,225,233,236],{},[27,213,214,215],{},"Action: what should happen\n",[24,216,217],{},[27,218,219,220,224],{},"A ",[221,222,223],"code",{},"type"," property is used as a label in the example code in a future lesson",[27,226,227,228],{},"Payload: data needed to do it\n",[24,229,230],{},[27,231,232],{},"Such as user or app context when relevant",[27,234,235],{},"CorrelationId for handling replies",[27,237,238],{},"Status or error result when finished",[47,240,241],{},"The exact format can vary, but the message should be predictable.",[15,243,245,249,266],{"id":244,"level":18},"why-queue",[20,246,248],{"id":247},"why-use-a-queue","Why Use A Queue?",[24,250,251,254,257,260,263],{},[27,252,253],{},"Keeps app requests fast",[27,255,256],{},"Isolates backend services",[27,258,259],{},"Makes work retryable",[27,261,262],{},"Helps teams trace failures",[27,264,265],{},"Reduces direct service coupling",[47,267,268],{},"RabbitMQ becomes the contract between parts of the system.",[15,270,272,275,278,298,301],{"id":271,"level":18},"summary",[20,273,274],{"id":271},"Summary",[47,276,277],{},"Before submitting the proposal, outline:",[24,279,280,283,286,289,292,295],{},[27,281,282],{},"The user-facing objective and main workflow",[27,284,285],{},"The app server role and backend technology choice",[27,287,288],{},"The database role and what project data it stores",[27,290,291],{},"The external API and transformed data to cache",[27,293,294],{},"The worker jobs the team expects to need",[27,296,297],{},"How those jobs move through RabbitMQ",[47,299,300],{},"Ensure there are no direct VM to VM connections\u002Frequests beyond Message Queue",[24,302,303],{},[27,304,305],{},"This is a hard constraint on the architecture",{"title":98,"searchDepth":307,"depth":307,"links":308},2,[309,310,311,312,313,314,315,316,317],{"id":22,"depth":307,"text":9},{"id":44,"depth":307,"text":45},{"id":57,"depth":307,"text":60},{"id":83,"depth":307,"text":86},{"id":147,"depth":307,"text":148},{"id":171,"depth":307,"text":174},{"id":203,"depth":307,"text":206},{"id":247,"depth":307,"text":248},{"id":271,"depth":307,"text":274},"presentation","Systems Integration","Short overview of the IT490 queue-centered systems integration architecture.","Short architecture orientation for project teams before detailed milestone work.","5","15","20","md",{},"1",true,"10","\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview",false,{"title":9,"description":320},"published","systems-integration\u002Fpresentations\u002F01-required-architecture-overview",[336,337,338,339,340],"systems-integration","architecture","rabbitmq","message-queue","dmz","13:43","6lxqppQi3rE","https:\u002F\u002Fyoutu.be\u002F6lxqppQi3rE","IT90 Architecture Overview","oePyH8a6a5-wi68scIV6xDbKLv5mgNmc-GOhHLYkIhs",1780581685569]