Skynet blog
Now Reading
Il framework per lo sviluppo: .NET Core
78 48 0

Il framework per lo sviluppo: .NET Core

by Guglielmo MengoraDecember 14, 2019

La prima scelta che è stato necessario prendere mentre progettavamo il design di Skynet era ovviamente il framework o i framework da usare per lo sviluppo. Le soluzioni sono moltissime e sicuramente ognuno ha delle ragioni specifiche per pensare a questa o quella soluzione in modo da semplificare il lavoro ed ottenere magari una piattaforma aperta che possa includere altre tecnologie o soluzioni. Un esempio tipico è quello di partire da un progetto opensource o magari disegnare un frontend basato su WordPress e sviluppare estensioni e moduli per integrare le funzionalitĂ  che servono. Con tutte le tecnologie che esistono, non c’è un modo giusto o sbagliato ma semplicemente una preferenza in base ad alcune valutazioni che si fanno internamente e che dipendono anche dall’esperienza che il team ha acquisito nonchĂ© dall’integrazione che è possibile o meno con altre tecnologie che magari sono giĂ  presenti in azienda e che si vogliono riutilizzare o estendere.

I requisiti di Skynet

Come sempre, si parte da quelli che sono i requisiti del progetto. Il design di Skynet deve avere alcune caratteristiche che derivano dalla nostra esperienza nell’uso di decine o anche centinaia di tecnologie tra orchestration, pannelli di controllo, sistemi di gestione e così via.

Multipiattaforma

La tecnologia di cui avevamo bisogno doveva essere multipiattaforma in modo da consentire la gestione e soprattutto l’automazione dei sistemi piĂ¹ diffusi e quindi Windows e Linux. L’uso di un framework multipiattaforma doveva consentire anche il riutilizzo massiccio del codice che prevedevamo di scrivere per le decine di componenti che comporranno Skynet.

C’è inoltre da fare una ulteriore divisione all’interno del codice, prevedendo codice applicativo, che sarĂ  indirizzato alle componenti principali, e un layer di interazione con i sistemi da gestire con i quali non sempre la scelta migliore è quella di usare un software ma spesso è piĂ¹ pratico affidarsi alle tecnologie di scripting. Inoltre, un layer di scripting consente – se messo in sicurezza – di prevedere anche un modo veloce per far evolvere singole funzionalitĂ  senza costringere al deployment dell’intero software.

Prevalentemente asincrono e durevole

Un sistema di gestione e di orchestrazione come quello che stiamo progettando deve necessariamente prevedere la possibilitĂ  di comunicare con diversi moduli che possano trovarsi non solo su sistemi diversi ma addirittura in datacenter diversi e distribuiti geograficamente e persino interagire con sistemi esterni alla nostra infrastruttura. Per la loro stessa natura queste interazioni non possono essere considerate come affidabili o parte di una rete costantemente connessa ma si deve dare per scontato che che questi sistemi possano essere saltuariamente disconnessi, ad esempio a causa di un temporaneo errore di rete, o incapaci di completare le azioni richieste al primo tentativo magari per un sovraccarico dei sistemi coinvolti o un altro problema saltuario.

Per questa ragione il framework che è stato scelto deve avere una forte impronta asincrona e non puĂ² essere basato su workflow che si aspettano di completare le operazioni in pochi secondi e senza una logica di retry/fail. Questo significa anche che i workflow che vengono eseguiti devono poter gestire questi possibili errori senza che questo comporti l’annullamento generale del workflow soprattutto perchè vi sono alcune operazioni (si pensi alla cancellazione delle risorse) che non posso piĂ¹ essere eseguite coerentemente in una seconda fase. In poche parole, il framework deve consentire anche workflow durevoli sia a livello di gestione centralizzata che, come vederemo, a livello di singola entitĂ  (macchina, servizio, cluster, datacenter…).

Predisposizione per l’implementazione di API

Skynet è stato progettato per entrare in contatto e gestire diverse entitĂ , dalle singole macchine (virtuali, fisiche o cluster) ai servizi esterni o API di terze parti. Si pensi per esempio ai servizi di integrazione con i diversi datacenter che usiamo e le loro API. Il framework che abbiamo scelto deve quindi consentire di interagire e soprattutto implementare facilmente e comunque in modo sicuro API che consentano l’interazione con i suoi diversi componenti o moduli. In particolare, gli agent che spesso verrano installati sulle macchine per la loro gestione devono consentire l’implementazione e la gestione di API e supportare i protocolli di comunicazione piĂ¹ spesso utilizzati: REST e gRPC, con un occhio alla possibilitĂ  di avere bisogno di supportare anche i WebService (WS-*).

Questa necessitĂ  rende ancora piĂ¹ importante la capacitĂ  del framework di essere multipiattaforma e armonizzare quindi tutte queste forme di comunicazione oltre che riutilizzare il piĂ¹ possibile il codice prodotto.

Alta disponibilitĂ  e scalabilitĂ 

Uno dei requisiti fondamentali della piattaforma è ovviamente la capacitĂ  di integrare funzionalitĂ  di alta disponibilitĂ  e anche di alta scalabilitĂ . La prima è chiaramente fondamentale per un sistema di gestione di centinaia o migliaia di servizi perchè un suo blocco porterebbe a diversi problemi sia all’interno che all’esterno. Le soluzioni per questo tipo di problemi sono moltissime ma idealmente la migliore è quella che propone un nuovo paradigma di sviluppo che sia giĂ  progettato per l’alta disponibilitĂ  e per l’alta scalabilitĂ  e che quindi non richieda la gestione parallela di soluzioni disconnesse.

Per fare un esempio pratico, la persistenza dei dati in database relazionali tradizionali è sicuramente una alternativa ma costringe poi ad elaborare strategie di scalabilitĂ  ed alta disponibilitĂ  che sono proprie di quella tecnologia e del prodotto software usato. Inoltre queste soluzioni sono piĂ¹ difficilmente implementabili quando la topologia dei servizi sia distribuita e magari multi-datacenter. Il framework che abbiamo scelto doveva essere un cittadino di prima classe di un nuovo paradigma di sviluppo di soluzioni geo-distribuite ed alta disponibilitĂ . La soluzione scelta verrĂ  poi esaminata in un altro post.

Semplificazione del frontend

In generale la piattaforma adottata doveva includere il supporto per le tecnologie di sicurezza piĂ¹ comuni, specialmente quelle legate alla gestione delle API ma uno dei requisiti fondamentali era la semplificazione del frontend. Gli utenti si aspettano delle funzionalitĂ  molto avanzate nelle interfacce utente attuali e spesso questo porta all’integrazione, a volte cieca, di decine di librerie Javascript e la necessitĂ  di gestire le possibili vulnerabilitĂ  che possono introdurre a livello di interfaccia, senza contare i tanti problemi di compatibilitĂ .

Obbiettivo della nostra scelta era quello di semplificare il frontend e, idealmente come bonus, anche qui condividere il piĂ¹ possibile il codice con la linea principale di sviluppo.

La nostra scelta: .NET Core

La scelta del framework da usare per lo sviluppo di Skynet è caduta quindi su .NET Core. Ovviamente tale scelta è stata influenzata anche dal nostro background sulla piattaforma Windows Server e sulle tecnologie di Microsoft ma in generale tutte le caratteristiche che abbiamo elencato le possiamo ritrovare nel nuovo nato in casa Redmond a partire dalla possibilitĂ  di essere usato sia su piattaforma Windows che Linux ma anche dalla possibile interazione con un’altra tecnologia multi-piattaforma di Microsoft: l’eccellente Powershell che dalla versione 6 supporta anche Linux.

L’integrazione tra queste due tecnologie fornisce un importante aumento di produttivitĂ  per sistemi complessi come è Skynet e .NET Core supporta o integra inoltre numerose tecnologie di nuova generazione che rispondono alle esigenze che abbiamo descritto in precedenza e di cui parleremo in post successivi.

What's your reaction?
Love It
0%
Interested
100%
Meh...
0%
What?
0%
Hate it
0%
Sad
0%
Laugh
0%
Sleep
0%
Wow !
0%
About The Author
Guglielmo Mengora

Leave a Response