Open source ve světě sítí

2. 1. 2016

Sdílet

Autor: © kentoh - Fotolia.com
Software typu open source hraje v mnoha oblastech IT moderních firem stále významnější roli – ať už jde o servery, databáze či dokonce cloud. Dodavatelé, jako jsou Red Hat, Canonical a další, naroubovali principy open source na výnosný obchodní model. Jenže co sítě? Proč zde neexistuje významná open source alternativa?

Důvodů, proč se v oblasti komunikačních sítí open source tak neprosazuje, je celá řada, uvádějí experti. Jde například o obtížnost soupeřit se zavedenými značkami, nebezpečí pohlcení velkým zákazníkem či samotný rozsah a složitost správy heterogenní sítě ortodoxním způsobem.

Je zřejmé, že ve většině oblastí podnikových technologií jsou zavedené značky dostatečně silným protivníkem. Noví síťoví kandidáti se musejí potýkat především s oborovým gigantem v podobě firmy Cisco, která prodává podle IDC mezi 65 až 70 % všech světových podnikových přepínačů, 80 % firemních směrovačů a pětinu bezpečnostních zařízení, což z ní činí špičku ve své kategorii.

Navíc se jim daří zákazníky svými produkty uspokojovat, uvádí analytik Peter Christy ze společnosti 451 Research.

„Když si promluvíte se zákazníky Ciska, nevidí ji jako dravce či monopolní firmu, z jejíhož vlivu by se chtěli dostat, ale považují ji za dodavatele nejlepších technologií, který se snaží svým zákazníkům pomoci k úspěchu,“ popisuje Christy.

Firmy musejí soupeřit s Ciskem, aby podaly lepší výkon při poskytování funkční sítě – a to není snadné. (Ne že by to odradilo některé firmy od pokusů – třeba společnost Brocade koupila s tímto cílem vývojáře síťového open source softwaru Vyatta v roce 2012.) Neznamená to však, že dodavatelé jako Cisco závisející na hardwaru značky se budou ubírat svou vlastní cestou pořád.

Neela Jacques je výkonným ředitelem projektu Open Daylight, což je skupina pracující na vytvoření síťového open source softwaru. Tvrdí, že některý drahý proprietární hardware nemá hodnotu, za kterou se prodává.

„V některých oblastech docházelo k obrovským inovacím a diferenciaci, kdy platíte 100 tisíc dolarů za zařízení schopné vyřešit jinak neřešitelný problém,“ vysvětluje Jacques a dodává: „V dolní části trhu však již velmi dlouho existují velmi vysoké marže a přístroje se skutečně příliš nezměnily.“

Síťový hardware se nadmíru často vyrábí neznačkovými vývojáři z Číny, zahrne síťový operační systém konkrétního dodavatele a následně se pět- až desetkrát předraží, zmiňuje Jacques.

„Lidé to sledují a říkají si – moment, pokud bychom vytvořili open source verzi takového síťového OS, mohl by se využít stejný hardware, který takové firmy používají ve svých zařízeních,“ dodává Jacques.

Christy poznamenává, že tři ze čtyř největších cloudů – Amazon, Facebook a Google (tedy mimo Microsoftu) – si vyrábějí vlastní síťová zařízení. Dokonce i někteří klasičtí výrobci jako Riverbed prohlašují, že komoditní hardware je vlnou budoucnosti.

„Proč by měli kupovat totéž od Ciska, když si sami mohou vytvořit něco způsobem upraveným podle svých potřeb a mít to od stejných externích výrobců?“ ptá se Jacques.

Opravdu komplikovaný problém

John Michelsen, technologický ředitel společnosti CA Technologies, uvádí, že pokusy vytvořit rozsáhlý framework pro správu výkonu, tak aby odpovídal zásadám open source – jako je například OpenNMS – se nesetkaly s velkým úspěchem, protože řešené problémy jsou opravdu velmi těžké.

„Je to opravdu složitý problém.Je třeba pokrýt mnoho věcí a trh se mění,“ vysvětluje Michelsen.

Dobře známý aforismus unixové filozofie radí: „Pište programy, které dělají jen jednu věc a dělají ji dobře.“ V případě systémů rozsáhlé správy sítě a optimalizace výkonu to však představuje problematický postoj, protože tyto produkty jsou samozřejmě většinou ze své definice rozsáhle multifunkční.

Michelsen tvrdí, že produkt jeho společnosti pro správu aplikačního výkonu je určený ke sledování osmi samostatných aspektů sítě. „Je poměrně těžké vytvořit integrovanou sadu velmi složitých vědeckých řešení v několika různých oblastech.Každý z těchto různých druhů monitoringů má svůj vlastní vědecký projekt,“ vysvětluje Michelsen.

 

Pohlcení

Navzdory filozofickým a logistickým problémům je open source technologie už významnou částí sítě – vyskytuje se ale na nižších úrovních sítě, uvádí Christy ze společnosti 451.

Velké společnosti, které nakupují služby od menších, používají přísné smluvní podmínky v souvislosti s vlastněným kódem – znamená to, že dodavatel musí poskytnout kopii zdrojového kódu své nabídky do právní úschovy, aby větší firma mohla i nadále fungovat v případě, pokud by ta menší ukončila své podnikání...

 

docker + kubernetes školení s dotací tip

Tento příspěvek vyšel v Computerworldu 5/2015.Oproti této on-line verzi je výrazně obsáhlejší a přináší další poznatky a tipy, které lze využít při praktické implementaci u vás ve firmě.

Časopis (starší čísla i předplatné těch nadcházejících) si můžete objednat na adrese našeho vydavatelství.

'; 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'; } }