Post on 19-May-2015
description
transcript
The KILROY case – Umbraco DK Festival
1
Building KILROY
Umbraco DK Festival 2012 - Aarhus Friday 13th April
The KILROY case – Umbraco DK Festival
2
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
The KILROY case – Umbraco DK Festival
3
Please interrupt
We don’t mind getting derailed
http://www.flickr.com/photos/gorillaradio/2474695970/
The KILROY case – Umbraco DK Festival
4
About Us
Emil Rasmussen
Project Manager
@emilr
Fabrice Loudet
Senior .NET developer
The KILROY case – Umbraco DK Festival
5
About Novicell
Based in Aarhus
38 employees
Full service web development agency
Proud Umbraco Gold Partner
The KILROY case – Umbraco DK Festival
6
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)
The KILROY case – Umbraco DK Festival
14
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
The KILROY case – Umbraco DK Festival
15
Theme 1: Using Umbraco
The KILROY case – Umbraco DK Festival
16
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.
The KILROY case – Umbraco DK Festival
21
Discussion
What do you do when you need to create a database
of stuff (e.g. staff list, product videos, events, etc.)?
The KILROY case – Umbraco DK Festival
22
Theme 2: Performance
The KILROY case – Umbraco DK Festival
23
The Umbraco Macro Cache - #h5is
Your are in big trouble, when you entire performance
strategy is the Umbraco Macro Cache…
http://tourismeautrement.files.wordpress.com/2010/04/slow.jpg
http://lifeattheendoftheroad.files.wordpress.com/2009/07/270709-022.jpg
"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
The Law of Leaky Abstractions
The KILROY case – Umbraco DK Festival
26
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.
The KILROY case – Umbraco DK Festival
27
4 Quick Tips for Good (Razor)
Performance
…besides using custom caching :-)
The KILROY case – Umbraco DK Festival
28
Wisely use HasProperty and HasValue
if (myDynamicNode.HasProperty("myCoolProperty") &&
myDynamicNode.HasValue("myCoolProperty"))
{
int tmpInt;
if (int.TryParse(myDynamicNode.GetProperty("myCoolProperty")
.Value, out tmpInt))
....
}
The KILROY case – Umbraco DK Festival
29
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");
The KILROY case – Umbraco DK Festival
30
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");
The KILROY case – Umbraco DK Festival
31
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");
The KILROY case – Umbraco DK Festival
32
Discussion
What is your hard learned tips for blinding fast
Umbraco performance?
What’s in Our Toolbox?
http://media.photobucket.com/image/toolbox/LilToe01/Shop/Toolbox017.jpg
The KILROY case – Umbraco DK Festival
34
Visual Studio 2010 (and Resharper)
Kiln (Mercurial)
Shared MS SQL Database
The Basics + a Tip
XmlCacheEnabled = false
The KILROY case – Umbraco DK Festival
35
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.
The KILROY case – Umbraco DK Festival
36
Discussion
How do you deploy?
Have you felt the pain of updating an highly utilized
DocType?
http://www.europaszkola.pl/O%20szkole_html_4ff13fb7.jpg
Any final Questions
or Comments?