;

Integrace: SOA, či cloud?

24. 3. 2010
Doba čtení: 5 minut

Sdílet

Náročné, nákladné, nekonečné – takové se mnohým CIO zdají být integrační projekty. A v případě, že není IT vaším hlavním oborem, tedy takříjajíc skutečným jádrem vašeho podniku, dívá se vedení na podobné avantýry na „N“ nejspíš skepticky.

SOA ovšem nabídla před několika lety novou perspektivu: udělejme to pořádně, od základu, modulárně, recyklujme funkce a v budoucnu ušetříme.

S propadem průmyslové výroby a poklesem ekonomiky na počátku roku ale mnohým růžové integrační brýle spadly. SOA je mrtvá, ať žijí služby! Tak přivítala nový rok Anne Thomas Manesová z Burton Group a dodala k tomu: „Přežila ji ale řada potomků: mashupy, BPM, SaaS, cloud computing a další architektury či koncepty založené na ‚službách‘“.

Koncept SOA není ve své podstatě špatný – je rozhodně proveditelný a může být přínosný (procesně i ekonomicky), problém je ale v tom, že jen opravdu málo společností (na straně dodavatelské i zákaznické) jej dokáže správně uchopit a často se příliš soustředí na technologickou stránku a méně už na vlastní architekturu. Je to škoda, protože SOA mohla být relativně elegantní cestou jak integrovat informatický čurbes, nacházející se stále v mnoha podnicích. Ona touto cestou stále je, problém ale tkví v tom, že nepatří mezi cesty levné či rychlé (koneckonců jiný článek v tomto čísle CIO dobře vykresluje představy dodavatelů o časové, potažmo finanční náročnosti nasazení SOA).

SOA coby integrační koncept může fungovat i nadále, zejména pokud se dodavatelé soustředí místo taktických prezentací a faktur s hodinovou sazbou na to, jak rychle dosáhnout výsledků a přinejmenším dohledné návratnosti (ta přitom není nijak nereálná, uvědomíme-li si, jak neefektivní a hypertrofované IT v mnoha případech je).

 

Oblačná spojka

Anne Thomas Manesová ve svém, možná přehnaně dramatickém, „nekrologu“ zmínila důležitý detail: SOA má
řadu potomků, kteří mají společný základ v konceptu služeb. Mnoho analytiků a vývojářů, jako je například Steven Martin, ředitel technologií vývojářských platforem v Microsoftu, to vidí podobně: „Diskuse o SOA se začíná přesouvat směrem ke cloudu,“ říká a pokračuje: „cloud je logické prostředí pro hostování služeb a ty jsou cestou jak budovat či integrovat aplikace – koneckonců cloud znamená jak infrastrukturu, tak model doručování aplikací.“

Martin zde připomíná to, na co mnozí při úvahách (a zavrhování) o cloudu coby přechodné hysterii zapomínají: cloud není jen pronajatá výpočetní kapacita či úložný prostor, k nimž přistupujeme přes internet, ale také způsob dodávání aplikací, velmi podobný SaaS (nikoliv však identický).

„SOA je architektonický koncept pro budování volně propojených aplikací, které je možné skládat,“ vysvětluje Jerry Cuomo, CTO IBM WebSphere. „Můžeme postavit datové centrum na principech SOA? Ano, můžeme, a říká se mu cloud – je to vlastně architektura orientovaná na služby. Je to v podstatě aplikace architektonického principu SOA v oblasti infrastuktury,“ dodává.

Podobně, jako je myšlenka cloudu v oblasti infrastuktury aplikací SOA na „železo“, je představa cloud aplikací, jejichž funkcionalitu lze vzájemně propojovat, v podstatě přenesením některých principů SOA do světa SaaS. Zdá se navíc, že jsou možné obě cesty – tedy jak od SOA směrem ke cloudu, tak od cloudu směrem k SOA. Tu první navrhuje například Tim Hall, ředitel produktů SOA u Hewlett-Packard: „Přijetí SOA může podnik dobře připravit na cloud computing. Odhalí, co je třeba interně změnit a které služby jsou klíčové. Oba koncepty jsou orientované na služby, a proto vyžadují vrstvu pro řízení a dohled a dobré chápání procesů.“ Cloud a SOA se snaží určit zásadní opakovaně použitelné komponenty a zároveň najít technologie pro provoz rozsáhlých komponent v prostředí otevřených sítí – podniky, které již vytvořily modulární SOA architekturu, ji budou moci mnohem snáze přesunout do prostředí cloudu.

Sanjiva Weerawarana, CEO společnosti WSO2, která dodává open source SOA software, souhlasí, že cloud je vhodnou cestou jak nasazovat či provozovat služby v SOA prostředí, zdůrazňuje ale, že oba koncepty se zároveň zásadně liší: „Cloud computing je architektura pro nasazování systémů či služeb, nikoliv architektonický koncept jak provozovat vaše podnikové IT – tím je naopak SOA.“

 

Integrační symbióza

Cyber25

Že jsme zapomněli na starou dobrou „obyčejnou“ integraci, slavnou EAI? Ne­zapomněli, jen máme pocit, že hovořit v dnešní době o middlewaru, o dodávkách komplexních IT řešení a o významu zkušeností a referencí dodavatelů by bylo asi tak účinné jako televizní reklamní kampaň na chléb šumava a tukové rohlíky. SOA i cloud jsou možná tak trochu druhý extrém – je to „cool“ strana integrační mince.

Povyk, který v minulosti panoval kolem SOA a dnes se točí v povětří IT mraků, by vás ale rozhodně neměl odradit. Pracujete-li ve velkém IT oddělení, je pro vás SOA stále jednou z nejlepších alternativ – v kombinaci s infrastrukturou a SaaS službami cloudu může být navíc efektivnější a levnější. Pokud je vaše IT menší či malé, bez desítek aplikačních kostlivců v rackových skříních, můžete SOA přeskočit a zajímat se rovnou o cloud – jeho kouzlo je totiž v tom, že dokáže obsloužit zákazníky všech velikostí.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »