Integrazione con i social con Azure Cosmos DBGoing social with Azure Cosmos DB

Vivere in una società profondamente interconnessa porta, prima o poi, ad avere a che fare con i social network.Living in a massively-interconnected society means that, at some point in life, you become part of a social network. I social network vengono usati per rimanere in contatto con amici, colleghi e familiari, ma anche per condividere passioni con persone con interessi simili.We use social networks to keep in touch with friends, colleagues, family, or sometimes to share our passion with people with common interests.

Ingegneri e sviluppatori si sono probabilmente interrogati sulle modalità di archiviazione e interconnessione dei dati in queste reti. Altri potrebbero aver ricevuto l'incarico di creare o progettare un nuovo social network per uno specifico mercato di nicchia.As engineers or developers, we might have wondered how do these networks store and interconnect our data, or might have even been tasked to create or architect a new social network for a specific niche market yourselves. La domanda più importante di tutte è: come vengono archiviati tutti questi dati?That’s when the big question arises: How is all this data stored?

Si supponga di voler creare un nuovo social network, in cui gli utenti possano pubblicare articoli con elementi multimediali correlati, ad esempio immagini, video o musica,Let’s suppose that we are creating a new and shiny social network, where our users can post articles with related media like, pictures, videos, or even music. La pagina di destinazione principale del sito Web includerà un feed di post che gli utenti possono visualizzare e con cui possono interagire.Users can comment on posts and give points for ratings. Inizialmente l'esempio può non sembrare molto complesso.There will be a feed of posts that users will see and be able to interact with on the main website landing page. Si potrebbe approfondire l'argomento con feed utente personalizzati condizionati dalle relazioni, ma questo va oltre l'obiettivo di questo articolo.This doesn’t sound really complex (at first), but for the sake of simplicity, let’s stop there (we could delve into custom user feeds affected by relationships, but it exceeds the goal of this article).

Come e dove archiviare i dati?So, how do we store this and where?

Chi ha fatto esperienza di database SQL o conosce la modellazione relazionale dei dati potrebbe iniziare con il disegnare qualcosa di simile:Many of you might have experience on SQL databases or at least have notion of relational modeling of data and you might be tempted to start drawing something like this:

Diagramma che illustra un modello relazionale relativo

Una struttura di dati perfettamente normalizzata...A perfectly normalized and pretty data structure… che non supporta la scalabilità.that doesn't scale.

I database SQL sono certamente molto utili, ma come ogni modello, procedura e piattaforma software non sono perfetti per tutti gli scenari.Don’t get me wrong, I’ve worked with SQL databases all my life, they are great, but like every pattern, practice and software platform, it’s not perfect for every scenario.

Perché SQL non rappresenta la scelta migliore in questo scenario?Why isn't SQL the best choice in this scenario? A causa della struttura usata, per visualizzare un singolo post in un sito Web o un'applicazione sarebbe necessario eseguire una query con addirittura otto join di tabella.Let’s look at the structure of a single post, if I wanted to show that post in a website or application, I’d have to do a query with… Per un flusso di post caricati in modo dinamico e visualizzati sullo schermo questa struttura risulta quindi poco adatta.8 table joins (!) just to show one single post, now, picture a stream of posts that dynamically load and appear on the screen and you might see where I am going.

Si potrebbe usare un'istanza di SQL di grandissime dimensioni, con capacità sufficiente per risolvere migliaia di query con un numero di join adatto a rendere disponibile il contenuto, ma esiste una soluzione più semplice.We could, of course, use a humongous SQL instance with enough power to solve thousands of queries with these many joins to serve our content, but truly, why would we when a simpler solution exists?

Approccio NoSQLThe NoSQL road

In questo articolo verrà illustrata la modellazione dei dati della piattaforma di social networking con il database NoSQL di Azure, Azure Cosmos DB in modo conveniente sfruttando altre funzionalità di Azure Cosmos DB quali l'API Graph Gremlin.This article will guide you into modeling your social platform's data with Azure's NoSQL database Azure Cosmos DB in a cost-effective way while leveraging other Azure Cosmos DB features like the Gremlin Graph API. Con un approccio NoSQL, che prevede l'archiviazione dei dati in formato JSON e l'applicazione della denormalizzazione, il post che prima risultava complesso può essere trasformato in un singolo documento:Using a NoSQL approach, storing data in JSON format and applying denormalization, our previously complicated post can be transformed into a single Document:

{
    "id":"ew12-res2-234e-544f",
    "title":"post title",
    "date":"2016-01-01",
    "body":"this is an awesome post stored on NoSQL",
    "createdBy":User,
    "images":["http://myfirstimage.png","http://mysecondimage.png"],
    "videos":[
        {"url":"http://myfirstvideo.mp4", "title":"The first video"},
        {"url":"http://mysecondvideo.mp4", "title":"The second video"}
    ],
    "audios":[
        {"url":"http://myfirstaudio.mp3", "title":"The first audio"},
        {"url":"http://mysecondaudio.mp3", "title":"The second audio"}
    ]
}

E può essere ottenuto con una singola query, senza l'uso di join.And it can be obtained with a single query, and with no joins. Questa soluzione è molto più semplice e lineare e, a livello di budget, permette di ottenere risultati migliori con meno risorse.This is much more simple and straightforward, and, budget-wise, it requires fewer resources to achieve a better result.

Con Azure Cosmos DB tutte le proprietà vengono indicizzate tramite l'indicizzazione automatica, che può anche essere personalizzata.Azure Cosmos DB makes sure that all the properties are indexed with its automatic indexing, which can even be customized. L'approccio senza schema consente di archiviare documenti con strutture varie e dinamiche. Se in futuro si volesse associare un elenco di categorie o hashtag ai post, Cosmos DB gestirebbe i nuovi documenti con gli attributi aggiuntivi senza richiedere ulteriori interventi.The schema-free approach lets us store Documents with different and dynamic structures, maybe tomorrow we want posts to have a list of categories or hashtags associated with them, Cosmos DB will handle the new Documents with the added attributes with no extra work required by us.

I commenti a un post possono essere considerati come altri post con una proprietà padre e questo semplifica il mapping degli oggetti.Comments on a post can be treated as just other posts with a parent property (this simplifies our object mapping).

{
    "id":"1234-asd3-54ts-199a",
    "title":"Awesome post!",
    "date":"2016-01-02",
    "createdBy":User2,
    "parent":"ew12-res2-234e-544f"
}

{
    "id":"asd2-fee4-23gc-jh67",
    "title":"Ditto!",
    "date":"2016-01-03",
    "createdBy":User3,
    "parent":"ew12-res2-234e-544f"
}

Tutte le interazioni social possono essere archiviate in un oggetto separato come contatori:And all social interactions can be stored on a separate object as counters:

{
    "id":"dfe3-thf5-232s-dse4",
    "post":"ew12-res2-234e-544f",
    "comments":2,
    "likes":10,
    "points":200
}

Per la creazione di feed è sufficiente creare documenti che possano contenere un elenco di ID post con un ordine di pertinenza specifico:Creating feeds is just a matter of creating documents that can hold a list of post ids with a given relevance order:

[
    {"relevance":9, "post":"ew12-res2-234e-544f"},
    {"relevance":8, "post":"fer7-mnb6-fgh9-2344"},
    {"relevance":7, "post":"w34r-qeg6-ref6-8565"}
]

Si potrebbe avere un flusso delle notizie "più recenti", con i post ordinati per data di creazione, un flusso delle notizie "più interessanti", con i post più popolari delle ultime 24 ore, e perfino un flusso personalizzato per ogni utente, in base ai follower oppure agli interessi, ma rimarrebbe comunque un elenco di post.We could have a “latest” stream with posts ordered by creation date, a “hottest” stream with those posts with more likes in the last 24 hours, we could even implement a custom stream for each user based on logic like followers and interests, and it would still be a list of posts. Dopo aver compilato gli elenchi, le prestazioni di lettura rimangono invariate.It’s a matter of how to build these lists, but the reading performance remains unhindered. Dopo l'acquisizione di uno di questi elenchi, viene inviata una singola query a Cosmos DB usando l'operatore IN per ottenere più pagine di post alla volta.Once we acquire one of these lists, we issue a single query to Cosmos DB using the IN operator to obtain pages of posts at a time.

I flussi di feed possono essere creati usando i processi in background dei servizi app di Azure, ovvero Processi Web.The feed streams could be built using Azure App Services’ background processes: Webjobs. Dopo che un post è stato creato, l'elaborazione in background può essere attivata tramite le code di Archiviazione di Azure, mentre i Processi Web possono essere attivati tramite Azure Webjobs SDK, implementando la propagazione dei post all'interno dei flussi in base a una logica personalizzata.Once a post is created, background processing can be triggered by using Azure Storage Queues and Webjobs triggered using the Azure Webjobs SDK, implementing the post propagation inside streams based on our own custom logic.

Con questa stessa tecnica è possibile elaborare punteggi e Mi piace relativi ai post in modo posticipato, per creare un ambiente coerente.Points and likes over a post can be processed in a deferred manner using this same technique to create an eventually consistent environment.

I follower sono più complessi.Followers are trickier. Cosmos DB prevede un limite di dimensioni massime dei documenti e la lettura/scrittura di documenti di grandi dimensioni può influire sulla scalabilità dell'applicazione.Cosmos DB has a maximum document size limit, and reading/writing large documents can impact the scalability of your application. È quindi consigliabile archiviare i follower come documento con questa struttura:So you may think about storing followers as a document with this structure:

{
    "id":"234d-sd23-rrf2-552d",
    "followersOf": "dse4-qwe2-ert4-aad2",
    "followers":[
        "ewr5-232d-tyrg-iuo2",
        "qejh-2345-sdf1-ytg5",
        //...
        "uie0-4tyg-3456-rwjh"
    ]
}

Questa soluzione può funzionare per un utente con alcune migliaia di follower, ma qualora si unissero alcune celebrità, questo approccio provocherà dimensioni elevate per i documenti e il limite massimo verrebbe raggiunto rapidamente.This might work for a user with a few thousands followers, but if some celebrity joins our ranks, this approach will lead to a large document size, and might eventually hit the document size cap.

Per risolvere il problema, è possibile adottare un approccio misto.To solve this, we can use a mixed approach. Nel documento delle statistiche utenti è possibile archiviare il numero di follower:As part of the User Statistics document we can store the number of followers:

{
    "id":"234d-sd23-rrf2-552d",
    "user": "dse4-qwe2-ert4-aad2",
    "followers":55230,
    "totalPosts":452,
    "totalPoints":11342
}

Il grafico effettivo di follower può essere archiviato tramite l'API Graph Gremlin di Azure Cosmos DB, per creare vertici per ogni utente e bordi che gestiscono le relazioni "Segue-a-B".And the actual graph of followers can be stored using Azure Cosmos DB Gremlin Graph API, to create vertexes for each user and edges that maintain the "A-follows-B" relationships. L'API Graph consente non solo di ottenere i follower di un determinato utente ma anche di creare query più complesse persino per suggerire gli utenti in comune.The Graph API let's you not only obtain the followers of a certain user but create more complex queries to even suggest people in common. Se al grafico si aggiungono le categorie di contenuto che piacciono o a cui sono interessati gli utenti, è possibile avviare esperienze composte che includono l'individuazione intelligente dei contenuti, il suggerimento dei contenuti che interessano ai follower o la ricerca di persone con cui l'utente può avere molto in comune.If we add to the graph the Content Categories that people like or enjoy, we can start weaving experiences that include smart content discovery, suggesting content that those we follow like, or finding people with whom we might have much in common.

Il documento Statistiche utente può ancora essere usato per creare schede nell'interfaccia utente o anteprime rapide del profilo.The User Statistics document can still be used to create cards in the UI or quick profile previews.

Modello "a gradini" e duplicazione dei datiThe “Ladder” pattern and data duplication

Nel documento JSON che fa riferimento a un post sono presenti più occorrenze di un utente.As you might have noticed in the JSON document that references a post, there are multiple occurrences of a user. Ciò significa che, data la denormalizzazione, le informazioni che rappresentano un utente potrebbero essere presenti in più posizioni.And you’d have guessed right, this means that the information that represents a user, given this denormalization, might be present in more than one place.

Questo perché query più veloci comportano la duplicazione dei dati.In order to allow for faster queries, we incur data duplication. Il problema legato a questo effetto collaterale è che, se i dati di un utente vengono modificati in qualche modo, è necessario trovare e aggiornare tutte le attività eseguite da tale utente.The problem with this side-effect is that if by some action, a user’s data changes, we need to find all the activities he ever did and update them all. Questo è un aspetto che va risolto.Doesn’t sound very practical, right?

Il problema viene risolto identificando gli attributi chiave di un utente che sono visualizzati nell'applicazione per ogni attività.We are going to solve it by identifying the Key attributes of a user that we show in our application for each activity. Se nell'applicazione sono visibili soltanto il post con il nome e l'immagine dell'autore, perché archiviare tutti i dati dell'utente nell'attributo "createdBy"?If we visually show a post in our application and show just the creator’s name and picture, why store all of the user’s data in the “createdBy” attribute? Se per ogni commento viene visualizzata solo l'immagine dell'utente, il resto delle informazioni non serve.If for each comment we just show the user’s picture, we don’t really need the rest of his information. In questo caso può risultare utile il cosiddetto modello "a gradini".That’s where something I call the “Ladder pattern” comes into play.

Si prendano ad esempio le informazioni relative a un utente:Let’s take user information as an example:

{
    "id":"dse4-qwe2-ert4-aad2",
    "name":"John",
    "surname":"Doe",
    "address":"742 Evergreen Terrace",
    "birthday":"1983-05-07",
    "email":"john@doe.com",
    "twitterHandle":"@john",
    "username":"johndoe",
    "password":"some_encrypted_phrase",
    "totalPoints":100,
    "totalPosts":24
}

Esaminando queste informazioni è possibile distinguere rapidamente quelle più o meno critiche, creando così dei "gradini":By looking at this information, we can quickly detect which is critical information and which isn’t, thus creating a “Ladder”:

Diagramma di un modello a gradini

Il gradino più piccolo è detto UserChunk, l'informazione minima che identifica un utente, e viene usato per la duplicazione dei dati.The smallest step is called a UserChunk, the minimal piece of information that identifies a user and it’s used for data duplication. Riducendo le dimensioni dei dati duplicati alle sole informazioni visualizzate, si riduce il rischio di aggiornamenti troppo estesi.By reducing the size of the duplicated data to only the information we will “show”, we reduce the possibility of massive updates.

Il gradino intermedio è quello dell'utente e contiene i dati completi che verranno usati nella maggior parte delle query basate sulle prestazioni in Cosmos DB. Si tratta del gradino più importante e più consultato.The middle step is called the user, it’s the full data that will be used on most performance-dependent queries on Cosmos DB, the most accessed and critical. Include le informazioni rappresentate da un UserChunk.It includes the information represented by a UserChunk.

Il gradino più grande è quello dell'utente esteso.The largest is the Extended User. Include tutte le informazioni critiche relative all'utente e altri dati che non è necessario leggere rapidamente o che vengono usati poco di frequente, ad esempio la procedura di accesso.It includes all the critical user information plus other data that doesn’t really require to be read quickly or it’s usage is eventual (like the login process). Questi dati possono essere archiviati al di fuori di Cosmos DB, nel database SQL di Azure o nelle tabelle di archiviazione di Azure.This data can be stored outside of Cosmos DB, in Azure SQL Database or Azure Storage Tables.

Suddividere i dati dell'utente e archiviare le informazioni in posizioni diverse risulta utileWhy would we split the user and even store this information in different places? perché, in termini di prestazioni, le query su documenti di grandi dimensioni hanno un costo maggiore.Because from a performance point of view, the bigger the documents, the costlier the queries. I documenti devono quindi essere leggeri e contenere le informazioni necessarie per eseguire query basate sulle prestazioni per un social network. È consigliabile archiviare le informazioni aggiuntive per altri scenari, come ad esempio le modifiche all'intero profilo, gli account di accesso e il data mining per l'analisi di utilizzo e le iniziative legate ai Big Data.Keep documents slim, with the right information to do all your performance-dependent queries for your social network, and store the other extra information for eventual scenarios like, full profile edits, logins, even data mining for usage analytics and Big Data initiatives. Non importa se la raccolta dei dati per il data mining risulta lenta, perché è in esecuzione in un database SQL di Azure. Ciò che conta è offrire un'esperienza utente agile e veloce.We really don’t care if the data gathering for data mining is slower because it’s running on Azure SQL Database, we do have concern though that our users have a fast and slim experience. Un utente archiviato in Cosmos DB si presenta come segue:A user, stored on Cosmos DB, would look like this:

{
    "id":"dse4-qwe2-ert4-aad2",
    "name":"John",
    "surname":"Doe",
    "username":"johndoe"
    "email":"john@doe.com",
    "twitterHandle":"@john"
}

Un post invece si presenta come segue:And a Post would look like:

{
    "id":"1234-asd3-54ts-199a",
    "title":"Awesome post!",
    "date":"2016-01-02",
    "createdBy":{
        "id":"dse4-qwe2-ert4-aad2",
        "username":"johndoe"
    }
}

Quando viene apportata una modifica che influisce su uno degli attributi del blocco, è facile trovare i documenti interessati usando query che puntano agli attributi indicizzati (SELECT * FROM posts p WHERE p.createdBy.id == "edited_user_id") e quindi aggiornare i blocchi.And when an edit arises where one of the attributes of the chunk is affected, it’s easy to find the affected documents by using queries that point to the indexed attributes (SELECT * FROM posts p WHERE p.createdBy.id == “edited_user_id”) and then updating the chunks.

Gli utenti generano molti contenutiUsers will generate, luckily, a lot of content. e devono avere la possibilità di cercare e trovare anche contenuti non presenti direttamente nel proprio flusso di contenuti, perché non seguono gli autori o semplicemente perché si tratta di post vecchi di 6 mesi.And we should be able to provide the ability to search and find content that might not be directly in their content streams, maybe because we don’t follow the creators, or maybe we are just trying to find that old post we did 6 months ago.

Grazie ad Azure Cosmos DB è possibile implementare facilmente un motore di ricerca tramite Ricerca di Azure, in breve tempo e senza dover aggiungere altro codice oltre al processo di ricerca e all'interfaccia utente.Thankfully, and because we are using Azure Cosmos DB, we can easily implement a search engine using Azure Search in a couple of minutes and without typing a single line of code (other than obviously, the search process and UI).

Perché è così semplice?Why is this so easy?

Ricerca di Azure implementa i cosiddetti indicizzatori, ovvero processi in background che agganciano i repository di dati e aggiungono, aggiornano e rimuovono automaticamente gli oggetti contenuti negli indici.Azure Search implements what they call Indexers, background processes that hook in your data repositories and automagically add, update or remove your objects in the indexes. Supportano gli indicizzatori di database SQL di Azure, gli indicizzatori di BLOB di Azure e, soprattutto, gli indicizzatori di Azure Cosmos DB.They support an Azure SQL Database indexers, Azure Blobs indexers and thankfully, Azure Cosmos DB indexers. Il passaggio delle informazioni da Cosmos DB a Ricerca di Azure è semplice, perché entrambi archiviano le informazioni in formato JSON. È sufficiente creare l'indice ed eseguire il mapping degli attributi dei documenti da indicizzare. In pochi minuti, a seconda delle dimensioni dei dati, tutto il contenuto sarà disponibile per la ricerca, con la migliore soluzione di ricerca distribuita come servizio nell'infrastruttura cloud.The transition of information from Cosmos DB to Azure Search is straightforward, as both store information in JSON format, we just need to create our Index and map which attributes from our Documents we want indexed and that’s it, in a matter of minutes (depends on the size of our data), all our content will be available to be searched upon, by the best Search-as-a-Service solution in cloud infrastructure.

Per altre informazioni su Ricerca di Azure, vedere la guida a Ricerca di Azurenel relativo post di blog.For more information about Azure Search, you can visit the Hitchhiker’s Guide to Search.

Conoscenza sottostanteThe underlying knowledge

Dopo aver archiviato tutti questi contenuti che continuano ad aumentare, come è possibile mettere tutto questo flusso di informazioni al servizio degli utenti?After storing all this content that grows and grows every day, we might find ourselves thinking: What can I do with all this stream of information from my users?

È necessario usare le informazioni e imparare dai dati.The answer is straightforward: Put it to work and learn from it.

Ad esempio,But, what can we learn? è possibile usare l'analisi del sentimento, includere indicazioni su contenuti consigliati in base alle preferenze dell'utente oppure un Content Moderator automatizzato che garantisca la sicurezza per la famiglia di tutti i contenuti pubblicati dal social network.A few easy examples include sentiment analysis, content recommendations based on a user’s preferences or even an automated content moderator that ensures that all the content published by our social network is safe for the family.

Contrariamente a quanto si potrebbe pensare, non è necessario essere dei matematici per estrapolare questi modelli e informazioni da semplici file e database.Now that I got you hooked, you’ll probably think you need some PhD in math science to extract these patterns and information out of simple databases and files, but you’d be wrong.

Azure Machine Learning, incluso in Cortana Intelligence Suite, è un servizio cloud completamente gestito che consente di creare flussi di lavoro tramite algoritmi in una semplice interfaccia basata sul trascinamento. È possibile codificare algoritmi personalizzati in R o usare alcune delle API già compilate e pronte per l'uso, come Text Analytics, Content Moderator o Recommendations.Azure Machine Learning, part of the Cortana Intelligence Suite, is the a fully managed cloud service that lets you create workflows using algorithms in a simple drag-and-drop interface, code your own algorithms in R or use some of the already-built and ready to use APIs such as: Text Analytics, Content Moderator or Recommendations.

Per ottenere uno di questi scenari di Machine Learning, è possibile usare Azure Data Lake per inserire le informazioni provenienti da origini diverse e U-SQL per elaborare le informazioni e generare output che possono poi essere elaborati da Azure Machine Learning.To achieve any of these Machine Learning scenarios, we can use Azure Data Lake to ingest the information from different sources, and use U-SQL to process the information and generate an output that can be processed by Azure Machine Learning.

Un'altra opzione disponibile consiste nell'usare i servizi cognitivi Microsoft per analizzare i contenuti per gli utenti; non solo è possibile comprenderli meglio (tramite l'analisi di ciò che gli utenti scrivono con l'API di analisi del testo), ma è anche possibile rilevare i contenuto indesiderati o per soli adulti e agire di conseguenza per mezzo dell'API Visione artificiale.Another available option is to use Microsoft Cognitive Services to analyze our users content; not only can we understand them better (through analyzing what they write with Text Analytics API) , but we could also detect unwanted or mature content and act accordingly with Computer Vision API. I servizi cognitivi includono molte delle soluzioni pronte all'uso che non richiedono alcuna conoscenza pregressa di Machine Learning.Cognitive Services include a lot of out-of-the-box solutions that don't require any kind of Machine Learning knowledge to use.

Un'esperienza social su scala globaleA planet-scale social experience

C'è un ultimo, ma non meno importante, argomento da affrontare: la scalabilità.There is a last, but not least, important topic I must address: scalability. Quando si progetta un'architettura è essenziale che ogni componente possa essere individualmente scalabile, perché è necessario elaborare più dati o perché si desidera disporre di una copertura geografica più ampia o per entrambi i motivi.When designing an architecture it's crucial that each component can scale on its own, either because we need to process more data or because we want to have a bigger geographical coverage (or both!). Per fortuna, il raggiungimento di questo obiettivo così complesso si rivela un'esperienza chiavi in mano con Cosmos DB.Thankfully, achieving such a complex task is a turnkey experience with Cosmos DB.

Cosmos DB supporta il partizionamento dinamico predefinito mediante la creazione automatica delle partizioni basate su una determinata chiave di partizione (definita come uno degli attributi nei documenti).Cosmos DB supports dynamic partitioning out-of-the-box by automatically creating partitions based on a given partition key (defined as one of the attributes in your documents). La definizione della chiave di partizione corretta è un'operazione che deve essere eseguita in fase di progettazione e tenendo presente le procedure consigliate disponibili. Nel caso dell'esperienza social, la strategia di partizionamento deve essere allineata con la modalità in cui si esegue una query (è consigliabile eseguire letture all'interno della stessa partizione) e si scrive (evitare "hot spot" distribuendo le scritture in più partizioni).Defining the correct partition key must be done at design time and keeping in mind the best practices available; in the case of a social experience, your partitioning strategy must be aligned with the way you query (reads within the same partition are desirable) and write (avoid "hot spots" by spreading writes on multiple partitions). Alcune opzioni sono: partizioni basate su una chiave temporale (giorno/mese/settimana), basate sulla categoria del contenuto, sull'area geografica, sull'utente. Tutto dipende in realtà da come si esegue una query sui dati e come la si visualizza nell'esperienza social.Some options are: partitions based on a temporal key (day/month/week), by content category, by geographical region, by user; it all really depends on how you will query the data and show it in your social experience.

Un aspetto interessante da sottolineare è che Cosmos DB eseguirà le query (incluse le aggregazioni) in tutte le partizioni in modo trasparente, senza dover aggiungere una logica con l'aumento dei dati.One interesting point worth mentioning is that Cosmos DB will run your queries (including aggregates) across all your partitions transparently, you don't need to add any logic as your data grows.

Con il tempo, aumenterà il traffico e di conseguenza aumenterà il consumo di risorse (misurato in UR o unità richiesta).With time, you will eventually grow in traffic and your resource consumption (measured in RUs, or Request Units) will increase. Le operazioni di lettura e scrittura verranno eseguite con una frequenza maggiore man mano che cresce la base di utenti e le operazioni di creazione e lettura del contenuto aumenteranno. La capacità di ridimensionare la velocità effettiva è quindi fondamentale.You will read and write more frequently as your userbase grows and they will start creating and reading more content; the ability of scaling your throughput is vital. Aumentare le RU è molto semplice: è possibile farlo con pochi clic nel portale di Azure o inviando i comandi tramite l'API.Increasing our RUs is very easy, we can do it with a few clicks on the Azure Portal or by issuing commands through the API.

Aumento delle prestazioni e definizione di una chiave di partizione

Poi le cose migliorano e gli utenti di un'altra area, paese o continente, notano la piattaforma e iniziano a usarla. Che magnifica sorpresa!What happens if things keep getting better and users from another region, country or continent, notice your platform and start using it, what a great surprise!

Ma subito dopo ci si accorge che l'esperienza degli utenti con la piattaforma non è ottimale. Sono così lontani dall'area operativa che la latenza è molto elevata. Bisogna evitare che gli utenti abbandonino la piattaforma.But wait... you soon realize their experience with your platform is not optimal; they are so far away from your operational region that the latency is terrible, and you obviously don't want them to quit. Ci vorrebbe un modo semplice per estendere la portata globale e infatti il modo esiste.If only there was an easy way of extending your global reach... but there is!

Cosmos DB consente di replicare i dati a livello globale e in modo trasparente con un paio di clic e di scegliere automaticamente tra le aree disponibili del codice client.Cosmos DB lets you replicate your data globally and transparently with a couple of clicks and automatically select among the available regions from your client code. Questo significa anche che è possibile avere più aree di failover.This also means that you can have multiple failover regions.

Quando si replicano i dati a livello globale, è necessario assicurarsi che i client possano sfruttarli.When you replicate your data globally, you need to make sure that your clients can take advantage of it. Se si usa un front-end Web o si accede alle API da client mobili, è possibile distribuire Gestione traffico di Azure e clonare il Servizio app di Azure in tutte le aree desiderate, usando una configurazione di prestazioni per supportare la copertura globale estesa.If you are using a web frontend or accesing APIs from mobile clients, you can deploy Azure Traffic Manager and clone your Azure App Service on all the desired regions, using a performance configuration to support your extended global coverage. Quando i client accedono al front-end o alle API, verranno indirizzati al servizio app più vicino, che a sua volta si connetterà alla replica di Cosmos DB locale.When your clients access your frontend or APIs, they will be routed to the closest App Service, which in turn, will connect to the local Cosmos DB replica.

Aggiunta della copertura globale alla piattaforma social

ConclusioneConclusion

Questo articolo illustra come creare social network interamente in Azure, con servizi a costo contenuto e ottimi risultati, promuovendo l'uso di una distribuzione dei dati e di una soluzione di archiviazione a più livelli detta "a gradini".This article tries to shed some light into the alternatives of creating social networks completely on Azure with low-cost services and providing great results by encouraging the use of a multi-layered storage solution and data distribution called “Ladder”.

Diagramma di interazione tra servizi di Azure per il social networking

Non esiste un metodo infallibile per questo tipo di scenario. È la sinergia creata dall'unione di servizi di alto livello che porta a grandi risultati: la velocità e la libertà di Azure Cosmos DB che rendono possibile la realizzazione di un'applicazione social ottimale, l'intelligenza di una soluzione di ricerca di alto livello come Ricerca di Azure, la flessibilità dei servizi app di Azure che consentono di ospitare non solo applicazioni indipendenti dal linguaggio, ma anche potenti processi in background, l'espandibilità di Archiviazione di Azure e del database SQL di Azure che permettono di archiviare grandi quantità di dati e la potenza delle analisi di Azure Machine Learning che consente di creare conoscenza e informazioni per migliorare i processi e fornire i contenuti più appropriati agli utenti giusti.The truth is that there is no silver bullet for this kind of scenarios, it’s the synergy created by the combination of great services that allow us to build great experiences: the speed and freedom of Azure Cosmos DB to provide a great social application, the intelligence behind a first-class search solution like Azure Search, the flexibility of Azure App Services to host not even language-agnostic applications but powerful background processes and the expandable Azure Storage and Azure SQL Database for storing massive amounts of data and the analytic power of Azure Machine Learning to create knowledge and intelligence that can provide feedback to our processes and help us deliver the right content to the right users.

Passaggi successiviNext steps

Per altre informazioni sui casi d'uso per Cosmos DB, vedere Casi d'uso comuni di Cosmos DB.To learn more about use cases for Cosmos DB, see Common Cosmos DB use cases.