1. The KILROY case – Umbraco DK Festival
Building KILROY
Umbraco DK Festival 2012 - Aarhus
Friday 13th April
1
2. The KILROY case – Umbraco DK Festival
Agenda
About Us
Brief Project Overview
3 Themes
1. Using Umbraco – Managing 10.000 destination pages
2. Performance – A Leaky Abstraction & Lessons Learned
3. The Toolbox – From Team Development to Deployment
Final Questions
2
3. The KILROY case – Umbraco DK Festival
Please interrupt
We don’t mind getting derailed
http://www.flickr.com/photos/gorillaradio/2474695970/ 3
4. The KILROY case – Umbraco DK Festival
About Us
Emil Rasmussen
Project Manager
@emilr
Fabrice Loudet
Senior .NET developer
4
5. The KILROY case – Umbraco DK Festival
About Novicell
Based in Aarhus
38 employees
Full service web development agency
Proud Umbraco Gold Partner
5
6. The KILROY case – Umbraco DK Festival
Project Brief
New platform for KILROYs online marketing activities
Migrate content and URLs
Launched July 2011
Peaked at a 5 man development team
Still in active development - 1 week release schedule
Umbraco 4.7.1.1 (patched)
6
7.
8.
9.
10.
11.
12.
13.
14. The KILROY case – Umbraco DK Festival
By the Numbers
7 languages (soon to be 8)
21 sites
30 content editors
94 master pages (templates)
100 razor macros
830 dictionary items
5000 images
26000 pages
33000 active nodes
700.000 monthly visitors
2.800.000 monthly page views
14
15. The KILROY case – Umbraco DK Festival
Theme 1: Using Umbraco
15
16. The KILROY case – Umbraco DK Festival
10,000 destination pages
Problem: create and maintain 10.000 destination pages.
Solution: common destination structure with automatic
creation of sub pages. And onPublish event update of JSON
data files.
16
17.
18.
19.
20.
21. The KILROY case – Umbraco DK Festival
Discussion
What do you do when you need to create a database
of stuff (e.g. staff list, product videos, events, etc.)?
21
22. The KILROY case – Umbraco DK Festival
Theme 2: Performance
22
23. The KILROY case – Umbraco DK Festival
The Umbraco Macro Cache - #h5is
Your are in big trouble, when you entire performance
strategy is the Umbraco Macro Cache…
23
25. The Law of Leaky Abstractions
"All non-trivial abstractions, to some degree, are leaky.
Abstractions fail. Sometimes a little, sometimes a lot. There's
leakage. Things go wrong. It happens all over the place when
you have abstractions."
Joel Spolsky, http://www.joelonsoftware.com/articles/LeakyAbstractions.html
http://lifeattheendoftheroad.files.wordpress.com/2009/07/270709-022.jpg
26. The KILROY case – Umbraco DK Festival
A Robust Caching Solution
1. Use the standard ASP.NET cache
Problem: when we deploy or when the AppPool recycles, we loose the
cache
2. Use Microsoft AppFabric.
It provides a distributed, in-memory, application cache service in
separate process than the webserver.
Problem solved: we have a persistent cache – even when the web
server restarts or the AppPool recycles
We update the cache OnPublish events or after timeout.
26
27. The KILROY case – Umbraco DK Festival
4 Quick Tips for Good (Razor)
Performance
…besides using custom caching :-)
27
28. The KILROY case – Umbraco DK Festival
Wisely use HasProperty and HasValue
if (myDynamicNode.HasProperty("myCoolProperty") &&
myDynamicNode.HasValue("myCoolProperty"))
{
int tmpInt;
if (int.TryParse(myDynamicNode.GetProperty("myCoolProperty")
.Value, out tmpInt))
....
}
28
29. The KILROY case – Umbraco DK Festival
Use DynamicNode Extensions and Razor common helper
public static class DocumentExtensions {
public static bool IsValidProperty(this DynamicNode doc, string propertyAlias)
{
if (doc.HasProperty(propertyAlias) && doc.HasValue(propertyAlias))
return true;
return false;
}
public static string GetPropertyAsString(this DynamicNode doc, string propertyAlias)
{
if (!doc.IsValidProperty(propertyAlias)) return string.Empty;
return doc.GetProperty(propertyAlias).Value;
}
public static int? GetPropertyAsInt(this DynamicNode doc, string propertyAlias)
...
}
Usage
int? myIntProp = myDynamicNode.GetPropertyAsInt("mypropertyAlias");
29
30. The KILROY case – Umbraco DK Festival
Use Children if first level search
Be aware of performance when using DynamicNode.Descendant(docType).
Use "Children" if possible.
For example to get a direct child node :
Don’t use:
DynamicNode dNode =
rootNode.Descendants("myDocType").Items.FirstOrDefault();
You can use instead :
DynamicNode dNode = rootNode.GetChildrenAsList
.Items.FirstOrDefault(x => x.NodeTypeAlias == "myDocType");
30
31. The KILROY case – Umbraco DK Festival
Dynamic notation considered harmfull?
Be aware of performance using dynamic notation like node.DocTypeName =>
same problem as last slide.
To get a direct child node :
Don’t use:
dynamic rootNode = new DynamicNode(xxx);
DynamicNodeList allMyDocType = rootNode.MyDocType; // can have performance issue
// PS : string myProp = rootNode.MyProp is OK is the prop exist
You can use instead:
DynamicNode dNode = rootNode.GetChildrenAsList
.Items.FirstOrDefault(x => x.NodeTypeAlias == "myDocType");
31
32. The KILROY case – Umbraco DK Festival
Discussion
What is your hard learned tips for blinding fast
Umbraco performance?
32
34. The KILROY case – Umbraco DK Festival
The Basics + a Tip
Visual Studio 2010 (and Resharper)
Kiln (Mercurial)
Shared MS SQL Database
XmlCacheEnabled = false
34
35. The KILROY case – Umbraco DK Festival
Deployment
Deployment
Web Deploy from Visual Studio
XML Config transformations
Updating Umbraco Doc Types and other settings
Two approaches:
Create an Umbraco Package containing every Doc Type, every
template, every macro and so on
Create an Umbraco Package containing new and updates Doc
Types, templates etc.
35
36. The KILROY case – Umbraco DK Festival
Discussion
How do you deploy?
Have you felt the pain of updating an highly utilized
DocType?
36
37. Any final Questions
or Comments?
http://www.europaszkola.pl/O%20szkole_html_4ff13fb7.jpg