[{"data":1,"prerenderedAt":555},["ShallowReactive",2],{"content-page:\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview":3,"content-page-quiz:none":342,"book-module-total-pages":343,"content-section-pages:\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview\u002F":344,"content-directory-pages:\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview":345,"toc-page:\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview":346},{"id":4,"title":5,"audience":6,"body":7,"contentType":314,"course":315,"description":316,"estimateBasis":317,"estimatedDiscussionMinutes":318,"estimatedLiveMinutes":319,"estimatedTotalMinutes":320,"extension":321,"meta":322,"module":323,"navigation":324,"order":325,"path":326,"promptAssist":327,"seo":328,"status":329,"stem":330,"tags":331,"videoDuration":337,"videoId":338,"videoLink":339,"videoTitle":340,"week":323,"__hash__":341},"content\u002Fsystems-integration\u002Fpresentations\u002F01-required-architecture-overview.md","Required Architecture Overview","student",{"type":8,"value":9,"toc":302},"minimark",[10,35,51,77,138,165,197,238,265],[11,12,15,19],"slide",{"id":13,"level":14},"architecture-title","2",[16,17,5],"h2",{"id":18},"required-architecture-overview",[20,21,22,26,29,32],"ul",{},[23,24,25],"li",{},"Use a queue-centered service design",[23,27,28],{},"Separate the app from the service network",[23,30,31],{},"Route internal work through RabbitMQ",[23,33,34],{},"Store transformed project data in the database",[11,36,38,42],{"id":37,"level":14},"architecture-diagram",[16,39,41],{"id":40},"architecture-shape","Architecture Shape",[43,44,45],"p",{},[46,47],"img",{"alt":48,"src":49,"variant":50},"IT490 systems integration architecture diagram","\u002Fimages\u002Fsystems-integration\u002Farchitecture-diagram.png","slide-screenshot",[11,52,54,57,60,74],{"id":53,"level":14},"main-rule",[16,55,56],{"id":53},"Main Rule",[43,58,59],{},"The app server does not directly connect to internal services.",[20,61,62,65,68,71],{},[23,63,64],{},"App server sends requests to RabbitMQ",[23,66,67],{},"RabbitMQ routes messages to the correct service",[23,69,70],{},"Workers handle the requested work",[23,72,73],{},"Results or status return through the queue",[43,75,76],{},"Core idea: internal machine communication is message queue traffic.",[11,78,80,83,86],{"id":79,"level":14},"technology-examples",[16,81,82],{"id":79},"Technology Examples",[43,84,85],{},"The diagram names common course technologies, but the roles matter more than the exact product.",[87,88,91,116],"two-col",{"gap":89,"left-width":90,"right-width":90},"lg","1fr",[92,93,95,100],"template",{"v-slot:left":94},"",[96,97,99],"h3",{"id":98},"app-server","App Server",[20,101,102,110,113],{},[23,103,104,105],{},"Example: Apache + PHP",[20,106,107],{},[23,108,109],{},"Could be any approved backend",[23,111,112],{},"Handles user-facing app logic",[23,114,115],{},"Publishes work requests",[92,117,118,122],{"v-slot:right":94},[96,119,121],{"id":120},"db-server","DB Server",[20,123,124,132,135],{},[23,125,126,127],{},"Example: MySQL or MariaDB\n",[20,128,129],{},[23,130,131],{},"Could be any approved database",[23,133,134],{},"Stores user and project data",[23,136,137],{},"Stores transformed API cache data",[11,139,141,145,148,162],{"id":140,"level":14},"cache-clarification",[16,142,144],{"id":143},"api-result-cache","API Result Cache",[43,146,147],{},"The database can cache API results, but not as a raw dump.",[20,149,150,153,156,159],{},[23,151,152],{},"API worker calls the external API",[23,154,155],{},"API worker transforms the response",[23,157,158],{},"App stores the cleaned result needed by the project",[23,160,161],{},"Cached data should support user workflows",[43,163,164],{},"Cache the useful project data, not every field from the external response.",[11,166,168,171,174,177,194],{"id":167,"level":14},"what-is-a-job",[16,169,170],{"id":167},"What Is A Job?",[43,172,173],{},"A job is a small request for another service to do work.",[43,175,176],{},"Examples:",[20,178,179,182,185,188,191],{},[23,180,181],{},"Fetch player stats from an API",[23,183,184],{},"Process a user upload",[23,186,187],{},"Refresh cached data",[23,189,190],{},"Send a notification",[23,192,193],{},"Write an audit or status event",[43,195,196],{},"A job should include enough information for the worker to act without guessing.",[11,198,200,203,206,235],{"id":199,"level":14},"job-message-shape",[16,201,202],{"id":199},"Job Message Shape",[43,204,205],{},"A message usually identifies:",[20,207,208,221,229,232],{},[23,209,210,211],{},"Action: what should happen\n",[20,212,213],{},[23,214,215,216,220],{},"A ",[217,218,219],"code",{},"type"," property is used as a label in the example code in a future lesson",[23,222,223,224],{},"Payload: data needed to do it\n",[20,225,226],{},[23,227,228],{},"Such as user or app context when relevant",[23,230,231],{},"CorrelationId for handling replies",[23,233,234],{},"Status or error result when finished",[43,236,237],{},"The exact format can vary, but the message should be predictable.",[11,239,241,245,262],{"id":240,"level":14},"why-queue",[16,242,244],{"id":243},"why-use-a-queue","Why Use A Queue?",[20,246,247,250,253,256,259],{},[23,248,249],{},"Keeps app requests fast",[23,251,252],{},"Isolates backend services",[23,254,255],{},"Makes work retryable",[23,257,258],{},"Helps teams trace failures",[23,260,261],{},"Reduces direct service coupling",[43,263,264],{},"RabbitMQ becomes the contract between parts of the system.",[11,266,268,271,274,294,297],{"id":267,"level":14},"summary",[16,269,270],{"id":267},"Summary",[43,272,273],{},"Before submitting the proposal, outline:",[20,275,276,279,282,285,288,291],{},[23,277,278],{},"The user-facing objective and main workflow",[23,280,281],{},"The app server role and backend technology choice",[23,283,284],{},"The database role and what project data it stores",[23,286,287],{},"The external API and transformed data to cache",[23,289,290],{},"The worker jobs the team expects to need",[23,292,293],{},"How those jobs move through RabbitMQ",[43,295,296],{},"Ensure there are no direct VM to VM connections\u002Frequests beyond Message Queue",[20,298,299],{},[23,300,301],{},"This is a hard constraint on the architecture",{"title":94,"searchDepth":303,"depth":303,"links":304},2,[305,306,307,308,309,310,311,312,313],{"id":18,"depth":303,"text":5},{"id":40,"depth":303,"text":41},{"id":53,"depth":303,"text":56},{"id":79,"depth":303,"text":82},{"id":143,"depth":303,"text":144},{"id":167,"depth":303,"text":170},{"id":199,"depth":303,"text":202},{"id":243,"depth":303,"text":244},{"id":267,"depth":303,"text":270},"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":5,"description":316},"published","systems-integration\u002Fpresentations\u002F01-required-architecture-overview",[332,333,334,335,336],"systems-integration","architecture","rabbitmq","message-queue","dmz","13:43","6lxqppQi3rE","https:\u002F\u002Fyoutu.be\u002F6lxqppQi3rE","IT90 Architecture Overview","oePyH8a6a5-wi68scIV6xDbKLv5mgNmc-GOhHLYkIhs",null,[],[],[],{"id":4,"title":5,"audience":6,"body":347,"contentType":314,"course":315,"description":316,"estimateBasis":317,"estimatedDiscussionMinutes":318,"estimatedLiveMinutes":319,"estimatedTotalMinutes":320,"extension":321,"meta":552,"module":323,"navigation":324,"order":325,"path":326,"promptAssist":327,"seo":553,"status":329,"stem":330,"tags":554,"videoDuration":337,"videoId":338,"videoLink":339,"videoTitle":340,"week":323,"__hash__":341},{"type":8,"value":348,"toc":541},[349,363,371,389,429,447,469,497,515],[11,350,351,353],{"id":13,"level":14},[16,352,5],{"id":18},[20,354,355,357,359,361],{},[23,356,25],{},[23,358,28],{},[23,360,31],{},[23,362,34],{},[11,364,365,367],{"id":37,"level":14},[16,366,41],{"id":40},[43,368,369],{},[46,370],{"alt":48,"src":49,"variant":50},[11,372,373,375,377,387],{"id":53,"level":14},[16,374,56],{"id":53},[43,376,59],{},[20,378,379,381,383,385],{},[23,380,64],{},[23,382,67],{},[23,384,70],{},[23,386,73],{},[43,388,76],{},[11,390,391,393,395],{"id":79,"level":14},[16,392,82],{"id":79},[43,394,85],{},[87,396,397,413],{"gap":89,"left-width":90,"right-width":90},[92,398,399,401],{"v-slot:left":94},[96,400,99],{"id":98},[20,402,403,409,411],{},[23,404,104,405],{},[20,406,407],{},[23,408,109],{},[23,410,112],{},[23,412,115],{},[92,414,415,417],{"v-slot:right":94},[96,416,121],{"id":120},[20,418,419,425,427],{},[23,420,126,421],{},[20,422,423],{},[23,424,131],{},[23,426,134],{},[23,428,137],{},[11,430,431,433,435,445],{"id":140,"level":14},[16,432,144],{"id":143},[43,434,147],{},[20,436,437,439,441,443],{},[23,438,152],{},[23,440,155],{},[23,442,158],{},[23,444,161],{},[43,446,164],{},[11,448,449,451,453,455,467],{"id":167,"level":14},[16,450,170],{"id":167},[43,452,173],{},[43,454,176],{},[20,456,457,459,461,463,465],{},[23,458,181],{},[23,460,184],{},[23,462,187],{},[23,464,190],{},[23,466,193],{},[43,468,196],{},[11,470,471,473,475,495],{"id":199,"level":14},[16,472,202],{"id":199},[43,474,205],{},[20,476,477,485,491,493],{},[23,478,210,479],{},[20,480,481],{},[23,482,215,483,220],{},[217,484,219],{},[23,486,223,487],{},[20,488,489],{},[23,490,228],{},[23,492,231],{},[23,494,234],{},[43,496,237],{},[11,498,499,501,513],{"id":240,"level":14},[16,500,244],{"id":243},[20,502,503,505,507,509,511],{},[23,504,249],{},[23,506,252],{},[23,508,255],{},[23,510,258],{},[23,512,261],{},[43,514,264],{},[11,516,517,519,521,535,537],{"id":267,"level":14},[16,518,270],{"id":267},[43,520,273],{},[20,522,523,525,527,529,531,533],{},[23,524,278],{},[23,526,281],{},[23,528,284],{},[23,530,287],{},[23,532,290],{},[23,534,293],{},[43,536,296],{},[20,538,539],{},[23,540,301],{},{"title":94,"searchDepth":303,"depth":303,"links":542},[543,544,545,546,547,548,549,550,551],{"id":18,"depth":303,"text":5},{"id":40,"depth":303,"text":41},{"id":53,"depth":303,"text":56},{"id":79,"depth":303,"text":82},{"id":143,"depth":303,"text":144},{"id":167,"depth":303,"text":170},{"id":199,"depth":303,"text":202},{"id":243,"depth":303,"text":244},{"id":267,"depth":303,"text":270},{},{"title":5,"description":316},[332,333,334,335,336],1780581680698]