Unique keys in Azure Cosmos DB

NoSQL databases often don’t have support for database constraints. It doesn’t make sense to constraint since the data is schemaless and therefore where does the database has to constrain on?
Well its true for most cases but sometimes you just want to make sure that there’s only 1 document for an entity. Lets say your CosmosDb is managing client or user entities. It doesn’t make sense to have 2 users documents representing the same user, does it? It could result in bugs or other unwanted behavior.

Unique keys

CosmosDb supports Unique Keys, well I rather call them Unique Paths.
Lets say you have a document representing a client and it looks something like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"id": "1234567",
"name": "BigFirm",
"country": "The Netherlands",
"address": {
"street": "Sillicon Valley Road",
"housenumber": "42",
"state": "California",
"country": "The Greatest Country on Earth"
},
"users": [
{
"name": "Dibran",
"title": "CEO",
"username": "d.mulder@bigfirm.com"
},
{
"name": "Charles",
"title": "Slave",
"username": "charles@bigfirm.com"
}
]
}

Lets say you want every document to have an unique combination of name and country. And secondly, you want to have unique list of user titles inside your users array. Its actually quite easy to do that, but the sad part is that you can only add unique keys at the creation of a collection. After that you’re not able to edit them anymore.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DocumentCollection myCollection = new DocumentCollection();
myCollection.Id = "ClientCollection";
myCollection.UniqueKeyPolicy = new UniqueKeyPolicy
{
UniqueKeys =
new Collection<UniqueKey>
{
new UniqueKey { Paths = new Collection<string> { "/name" , "/country" }}
new UniqueKey { Paths = new Collection<string> { "/users/title" } },
}
};
await client.CreateDocumentCollectionAsync(
UriFactory.CreateDatabaseUri(dataBase),
myCollection,
new RequestOptions { OfferThroughput = 400 });

Its just that simple, now you’ll have a collection with a unique key policy. Actually if you look at the json definition of a collection then you’ll be able to see it, take a look:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
"id": "ClientCollection",
"indexingPolicy": {
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Hash",
"dataType": "String",
"precision": 3
}
]
}
],
"excludedPaths": []
},
"uniqueKeyPolicy": {
"uniqueKeys": [
{
"paths": [
"/name",
"/country"
]
},
{
"paths": [
"/users/title"
]
}
]
}
}

Bear in mind that you’ll have to check for conflict exceptions in your code. If you’re violating the unique key policy then a Microsoft.Azure.Documents.DocumentClientException is thrown. This exceptions contains a System.Net.HttpStatusCode.Conflict status code, this is where you want to check on. Your code will look something like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try
{
response = await client.CreateDocumentAsync(collectionUri, document, requestOptions);
}
catch (Microsoft.Azure.Documents.DocumentClientException ex)
{
if ( ex.StatusCode == System.Net.HttpStatusCode.Conflict )
{
// Unique key constraint violation ...
}
else
{
// Some other issue ...
throw;
}
}

Hopefully this helped a little, for further reading please see:
https://docs.microsoft.com/en-us/azure/cosmos-db/unique-keys

Expire data in CosmosDb

Applications often have to deal with temporary data, such as: logs, user session information and others.
Purging that data can be a struggle especially when your database doesn’t support temporary storage.
With CosmosDb, developers are able to set Time To Live properties on Collections and Documents.

Example

Lets say you have a shopping cart in your application with which users can select items.
It doesn’t make sense to have those items indefinitely in your cart, lets say one week will be suffice.
Lets see how we can set the time to live to one week.

Create a collection with a default time to live

In order for time to live to be effective you have to set a default time to live on the collection. Setting it on documents alone will not work. You can also replace the collection and set it to null to disable the time to live for the collection.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
await documentClient.CreateDatabaseIfNotExistsAsync(new Database()
{
Id = "MyShop"
});

// Creating a collection with a default time to live.
DocumentCollection collection = await documentClient.CreateDocumentCollectionIfNotExistsAsync(
UriFactory.CreateDatabaseUri("MyShop"),
new DocumentCollection
{
Id = "ShoppingCart",
// Set default time to live to one week.
DefaultTimeToLive = 24 * 60 * 7
},
new RequestOptions
{
OfferThroughput = 400
});

// Disable the time to live.
collection.DefaultTimeToLive = null;

await client.ReplaceDocumentCollectionAsync(collection);

Once you’ve set the time to live on collections than every document will have that time to live as default. You can override it to prolong, shorten or disable the time to live for the selected document.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Set time to live
cart.TimeToLive = TimeToLiveSeconds;

// Disable time to live
cart.TimeToLive = null;

await documentClient.CreateDocumentAsync(
UriFactory.CreateDocumentCollectionUri("MyShop", "ShoppingCart"),
cart);

// Update time to live
cart.TimeToLive = TimeToLiveSeconds;

await documentClient.ReplaceDocumentAsync(cart);

Once a document is created in a time to live collection then a _ttl property will be added to the document. Note that it doesn’t count down or something like that so you can’t see if a document is about to expire.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"userId": "test@user.com",
"cart": [
{
"itemId": "49a4ce2c-ddde-4f04-bb79-46546566a",
"title": "Bike",
"desc": "A brandnew bike"
},
{
"itemId": "dfsa8789-abde-4f04-bb79-46546566a",
"title": "Helmet",
"desc": "A helmet keeps you save"
}
],
"ttl": 10080,
"id": "49a4ce2c-99e4-4f04-bb79-35a9c3a4d6b5",
"_rid": "VfYnAKmODgAkAAAAAAAAAA==",
"_self": "dbs/VfYnAA==/colls/VfYnAKmODgA=/docs/VfYnAKmODgAkAAAAAAAAAA==/",
"_etag": "\"0100cb12-0000-0000-0000-5b2a44170000\"",
"_attachments": "attachments/",
"_ts": 1529496599
}

Hopefully this helped a little, for further reading please see:
https://docs.microsoft.com/en-us/azure/cosmos-db/time-to-live

Bedrijfskritische applicaties in de cloud

Bedrijfskritische applicaties bouwen op een cloud platform als Microsoft Azure is nog niet zo makkelijk als het lijkt. De keuzes die developers en architecten maken kunnen enorme impact hebben op de continuiteit van uw business.

Storingen

Elke Cloud dienst heeft te maken met storingen. Deze storingen kunnen voorkomen door hardware falen of door softwarematige storingen. In beide gevallen heeft dit direct impact op de continuiteit van de applicaties die u heeft draaien in de betreffende regio.

Storingen van Cloud diensten kun je vaak terug vinden op hun status pagina’s.
https://azure.microsoft.com/status
https://status.aws.amazon.com/

Deze storingen zijn jammer genoeg niet te voorkomen en hier hadden we vroeger ook al last van met onze eigen Virtual Private Services of Dedicated Rack Space. Maar wat nu als uw applicatie echt kritisch is? Hoe kunt u uw applicatie zo ontwerpen dat er sprake is van maximale availability and resilence?

Azure Regions en Availability Zones

Azure heeft momenteel [40 regio's](https://azure.microsoft.com/en-us/global-infrastructure/regions/) beschikbaar en er zijn er 12 aangekondigd, waaronder de meest recent aangekondigde Norway East en Norway West.

Veel mensen denken dat een Azure regio gelijk staat aan 1 datacenter maar dit is zeker niet het geval. In feite zijn het een set van datacenters die samen een regio vormen. Sommige regio’s zoals France central bevatten al 3 datacenters die fysiek meerdere kilometers van elkaar gescheiden zijn. Deze datacenters hebben allemaal een eigen elektriciteits- en wateraansluiting en overige voorzieningen waardoor een failure van 1 datacenter niet direct betekent dat de regio unavailable wordt.

Maar hoe weet je nou welke applicaties van jou draaien in welke datacenters? Microsoft heeft dat met opzet geabstraheerd voor zijn gebruikers. Het is de bedoeling dat meer regio’s meer dan 3 datacenters krijgen waardoor ze automatisch een availability zone worden. Momenteel hebben alleen Central US en France Central support voor Availability zones en zijn er nog 3 in preview.

  • Central US
  • France Central
  • East US 2 (Preview)
  • West Europe (Preview)
  • Southeast Asia (Preview)

Availability zone

Er is sprake van een availability zone als een Azure regio meerdere fysiek gescheiden datacenters heeft. Zoals eerder gezegd hebben deze datacenters een eigen elektriciteits-, cooling- en netwerkvoorziening. Maar wat houdt zo'n availability zone nu in, en wat heb je eraan?

Availability zones bieden een abstractie voor een set van diensten binnen Azure. Uw diensten worden, mits gebruikmakend van availability zones, automatisch gerepliceerd over de verschillende zones binnen de Azure regio. Wanneer er een storing optreedt in één van de datacenters dan wordt die betreffende zone uitgeschakeld en nemen de overige het werk over.

Services

Availability zones zijn nog niet beschikbaar voor alle services binnen Azure. Gelukkig groeit de lijst wel, sterker nog deze is support voor Service Bus aangekondigd en daarmee is weer een belangrijke service ondersteund. Dit is een lijst van de beschikbare services:

  • Linux Virtual Machines
  • Windows Virtual Machines
  • Virtual Machine Scale Sets
  • Managed Disks
  • Load Balancer
  • Public IP address
  • Zone-redundant storage
  • SQL Database
  • Event Hubs
  • Service Bus

Services op availability zones hebben geen additionele kosten.

Voorbeeld

Het aanzetten van availability zones op services is zo simpel als een vinkje aanzetten bij het aanmaken van de resource. Via ARM kan het gemakkelijk met de zoneRedundant property.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"resources": [
{
"apiVersion": "2018-01-01-preview",
"name": "[parameters('serviceBusNamespaceName')]",
"type": "Microsoft.ServiceBus/namespaces",
"location": "[parameters('location')]",
"sku": {
"name": "Premium"
},
"properties": {
"zoneRedundant": true
}
}
],

Werken voor Caesar

Caesar Experts is één van de beste werkgevers in de ICT dienstverlening. Punt. Geloof je me niet? Met 6 simpele argumenten zal ik je proberen over te halen. ## Geld en spullen Je werkt omdat je moet wonen, spullen wilt kopen, je gezin wilt onderhouden en op vakantie wilt gaan. De meeste mensen werken omdat ze het geld nodig hebben. Maar weinigen zouden hetzelfde werk als vrijwilligerswerk doen. Is dat wel het geval dan ben je een echte ICT nerd en ben je waarschijnlijk super waardevol!

Bij Caesar krijg je geld en spullen voor je werktijd. Marktconform en een beetje beter.

  • Een goed loon
  • Lease auto, incl. buitenland
  • 10% vakantiegeld
  • Een bonusregeling
  • Onkosten, telefoon, internet, zorgvergoeding
  • 1000eu vrij te besteden studiebudget
    • Daarboven kan het ook met een studieovereenkomst. Zeer schappelijke regeling.
  • Pensioenvergoeding
  • Geld als je certificaten haalt
  • Sabbatical na 7 jaar dienstverband
  • Je kinderen krijgen een studiebeurs als ze gaan studeren… Waar heb je dit ooit eerder gehoord?!
  • Je vrouw krijgt brownies, o.i.d. als ze jarig is :)
  • Jij krijgt een cadeautje als je jarig bent
  • Afgelopen jaar kregen we zomaar een aandeel
  • Uitjes en feestjes

Ik vergeet waarschijnlijk nog een paar dingen…

De medewerker staat centraal

Ik hoor je denken, oh wat mooi… dat zegt iedereen! Straks ben je aangenomen en voor je het weet zit je 5 dagen bij de klant en hoor je nooit meer wat van Caesar. Ik kan natuurlijk niet voor iedereen spreken maar dit is met mij gebeurd na 3 jaar dienstverband:

  • Ik kwam binnen als Software Developer met 3 jaar ervaring.
  • Ik keek om me heen en analyseerde de verschillende projecten en klanten.
  • Ik vroeg aan één van de architecten om een demo te geven van zijn project.
  • Ik was enthousiast en samen met de betreffende sales zorgden we ervoor dat ik op dat project kwam.
  • Na 1.5 jaar bij die klant kreeg ik een rol als Lead Developer van een nieuw team.
  • Na ruim 2 jaar switchte ik van klant omdat ik vader werd en minder reistijd wilde. - Dit werd actief ondersteund door de Caesar.
  • Ondertussen ontwikkelde ik een visie op het gebied van Cloud Development.
  • Mijn initiatief werd beloond, na 2.5 jaar ben ik Team Lead Cloud Development geworden.

Momenteel zit ik op een tof project en help ik ondertussen mijn teamgenoten om beter te worden en plezier in hun werk te hebben.

Ruimte voor groei

Je kent het wel, in de vacature staat: ruimte om door te groeien. Maar wat houdt dit nu concreet in? Ja ook bij Caesar krijg je de ruimte om je technisch te ontwikkelen doormiddel van: cursussen, certificaten, master-classes en tijd. Noem het maar op en je kan het waarschijnlijk regelen. Wij vinden het belangrijk dat je kennis up to date is.

Maar het gaat nog een stapje verder, door proactief met plannen te komen ben ik de afgelopen 2.5 jaar naar de volgende events geweest:

  • 2x naar Microsoft Build in Seattle.
  • Voor een klant naar een Xamarin hackfest in Oslo.
  • 3x naar de Techdays in Amsterdam.
    • Zelfs een keer gesproken op de TechDays :)

En dit is niet omdat ik mijn manager spam om naar alle events te gaan. Dit komt door initiatief. Duidelijk maken wat het jou en de organisatie oplevert als je deelneemt aan dit soort events.
Daarnaast geef ik de vergaarde kennis ook terug aan de organisatie door middel van kennissessies. Zo worden we allemaal een beetje slimmer!

Coole en nieuwe techniek

Als developer wil je met de nieuwste technieken applicaties bouwen voor de klant.
Bij Caesar kan dat! Ik werk dagelijks met Microsoft Azure om voor verschillende klanten maatwerk applicaties te maken. Een paar voorbeelden:

MixitCloud

Voor AkzoNobel heb ik gewerkt aan MixitCloud. Een Azure applicatie waarmee autoreparateurs een verf recept kunnen opzoeken voor auto’s met schade. Dit proces ging vroeger handmatig met een kleurenflyer. Nu gaat het volledig automatisch, van het scannen van de kleur, het opzoeken van het best passende recept tot het mengen van de verf. Tevens worden de on-premise nieuw ontwikkelde formules realtime gesynchroniseerd naar de cloud. Deze applicatie is wereldwijd beschikbaar en heeft zeer hoge load te verwerken.

Allego EVCloud

Voor Allego werk ik aan de EV Cloud. Het backend voor duizende elektrische laadpalen in Europa. De EV Cloud moet klaar zijn om 1 miljoen laadpalen te kunnen ondersteunen, wat 1 miljard berichten per dag genereerd. Hier is dus sprake van Hyperscale. Met Microservices en FaaS oplossingen garanderen we een scalable architectuur en daarmee een zorgeloze laadsessies.

Talentenprogramma.

Elk jaar worden een aantal talenten van de gehele Caesar Groep geselecteerd voor het talentenprogramma.
Dit persoonlijk ontwikkelingsprogramma van ~9 maanden kent 3 fases

  • Personal breakthrough
  • Building a winning team
  • Winning with Caesar

Samen met tal van externe coaches en experts werk je een intensief, maar vooral super gaaf, programma af.
Het doel? Je beste versie van jezelf ontdekken en die inzetten in het team dat voor Caesar het verschil gaat maken.
Constant wordt de link gelegd met je prive situatie. Het is de bedoeling dat je jezelf beter leert kennen waardoor je prive ook een prettiger persoon wordt.
Dit programma omvat naast theoretische sessies veel actieve en praktische sessies. De coaches proberen je constant in situaties te brengen die een analogie vormen voor de realiteit.
Door constant te reflecteren en het samen te hebben over je gedrag kom je achter prachtige talenten maar ook stukjes van jezelf waar aan gewerkt moet worden.
Deze gelijkenissen met de realiteit ontstaan natuurlijk niet in een meeting room op kantoor. Daarom vindt het talentenprogramma plaats op allerlei situaties waaronder:

  • Boxend tegen een wereld kampioen karate
  • Midden in de Ardennen op een paal van 5 meter hoog
  • In een roeiboot op het Utrechtse kanaal
  • In een hut op de hei met een habtonoom
  • Als climax: in Bosnie en Montenegro midden in de bergen zonder elektrischiteit en stromend water

Kortom kosten nog moeite worden gespaard om jouw persoonlijke ontwikkeling een boost te geven.
Niet alleen met als doel om jou effectiever te maken als werknemer maar vooral ook om jou als persoon, dus ook prive, prettiger te maken.

Ethiek

Bij Caesar hebben we respect voor de persoon ongeacht hoe je eruit ziet, geloof, geaardheid, afkomst, etc..
Je zult je snel thuisvoelen in het bedrijf, het bedrijf is open en transparant en je kunt aan iedereen vragen stellen.
De directeuren zitten gewoon tussen het voetvolk ;-) en zijn gemakkelijk te benaderen.
Er heerst een cultuur van open- en eerlijkheid. Feedback mag gegeven worden, we kunnen tegen een stootje.

Het management van Caesar zijn geen geldwolven. Winst is belangrijk maar lange termijn werkgeluk en goede relaties met de klanten en het personeel gaan voor.
Dit zie je echt terug in de keuzes die gemaakt worden. Hans van der Kooij eigenaar van de Caesar Groep heeft als droom dat de Caesar Groep koninklijk wordt.
Dat wil zeggen dat de Caesar Groep 100 jaar moet bestaan. Dit jaar bestaat de Caesar Groep 25 jaar, we zijn dus op een kwart.

Overtuigd?

Overtuigd of op zijn minst nieuwsgierig? Ben je benieuwd of je in ons Cloud Development team past? Neem dan contact met mij op, via d.mulder@caesar.nl of via twitter @dibranmulder en we kijken samen of er een match is.