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.You use social networks to keep in touch with friends, colleagues, family, or sometimes to share your 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, you might have wondered how do these networks store and interconnect your 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 significant 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 you are creating a new and shiny social network, where your 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. Non sembra molto complesso (in un primo momento), ma per semplicità fermiamoci qui (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 complex (at first), but for the sake of simplicity, let’s stop there (you can 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 you 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… Otto tabelle di join (!) solo per mostrare un singolo post, immaginiamo allora un flusso di post caricati in modo dinamico e visualizzati sullo schermo: questa struttura risulta quindi poco adatta.Eight 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 dimensioni enormi, 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.You could, of course, use a enormous SQL instance with enough power to solve thousands of queries with these many joins to serve your content, but truly, why would you, 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, the 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 you 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 other posts with a parent property (this simplifies your 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.You 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, you 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 you acquire one of these lists, you 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 your 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 the 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, you can use a mixed approach. Nel documento delle statistiche utenti è possibile archiviare il numero di follower:As part of the User Statistics document you 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 you add to the graph the Content Categories that people like or enjoy, you can start weaving experiences that include smart content discovery, suggesting content that those you follow like, or finding people with whom you 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, you 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, you need to find all the activities he ever did and update them all. Questo è un aspetto che va risolto.Doesn’t sound practical, right?

Il problema viene risolto identificando gli attributi chiave di un utente che sono visualizzati nell'applicazione per ogni attività.You are going to solve it by identifying the Key attributes of a user that you show in your 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 you visually show a post in your 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 you just show the user’s picture, you 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, you 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 you will “show”, you 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 you 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.You really don’t care if the data gathering for data mining is slower because it’s running on Azure SQL Database, you do have concern though that your 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 molto contenutoUsers will generate, luckily, much 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 sei mesi.And you should be able to provide the ability to search and find content that might not be directly in their content streams, maybe because you don’t follow the creators, or maybe you are just trying to find that old post you did six 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 you are using Azure Cosmos DB, you 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, you just need to create your Index and map, which attributes from your Documents you want indexed and that’s it, in a matter of minutes (depends on the size of your data), all your 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, you might find 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 you 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 your 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 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, you 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 your users content; not only can you understand them better (through analyzing what they write with Text Analytics API) , but you 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 includes many 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, articolo da affrontare: la scalabilità.There is a last, but not least, important article 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 you need to process more data or because you 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 user base grows and they will start creating and reading more content; the ability of scaling your throughput is vital. Aumentare le RU è semplice: è possibile farlo con pochi clic nel portale di Azure o inviando i comandi tramite l'API.Increasing your RUs is easy, you 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 accessing 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

ConclusioniConclusion

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 your 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.