<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3340650378925421769</id><updated>2011-08-28T21:25:08.566+02:00</updated><category term='deployment'/><category term='best practices'/><category term='multi-tenancy'/><category term='design'/><category term='definition'/><category term='benefits'/><category term='introduction'/><category term='disadvantages'/><category term='cost benefits'/><category term='native'/><category term='salesforce'/><category term='database'/><title type='text'>Multi-Tenancy</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-6377696191119026879</id><published>2010-08-04T14:12:00.006+02:00</published><updated>2010-08-04T14:26:42.649+02:00</updated><title type='text'>Multi-Tenancy: Maintenance Dream or Nightmare?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Although multi-tenancy can lead to an improvement in the ease with which software can be deployed, maintenance can become more difficult due to the more complex code required in multi-tenant systems. Multi-tenancy is a concept which spans several software architecture layers and therefore, should be implemented in several software layers. If this is not done correctly, maintenance can become a nightmare. In our &lt;a href="http://soft.vub.ac.be/iwpse-evol/"&gt;IWPSE-EVOL 2010&lt;/a&gt; paper "&lt;a href="http://swerl.tudelft.nl/twiki/pub/Main/TechnicalReports/TUD-SERG-2010-031.pdf"&gt;Multi-Tenant SaaS Applications: Maintenance Dream Or Nightmare?&lt;/a&gt;" we discuss the pros and cons of multi-tenant systems with regards to maintenance.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;We believe that the code complexity introduced by enabling multi-tenancy should not be significant in a well-designed single-tenant system. As a research project, we have migrated an existing single-tenant application to a multi-tenant one. We have used our multi-tenant reengineering pattern as a guideline:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JnJnnoRuuOk/TFlbsxFArlI/AAAAAAAAACY/dagDQlh9lU0/s1600/architecture+0_4+icsm+industrial.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 293px; height: 320px;" src="http://3.bp.blogspot.com/_JnJnnoRuuOk/TFlbsxFArlI/AAAAAAAAACY/dagDQlh9lU0/s320/architecture+0_4+icsm+industrial.png" alt="" id="BLOGGER_PHOTO_ID_5501529244456496722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We were able to do the migration by adding &amp;lt; 100 LOC to a 165 KLOC application. You can find the details of this process in our &lt;a href="http://icsm2010.upt.ro/"&gt;ICSM 2010&lt;/a&gt; industrial paper "&lt;a href="http://swerl.tudelft.nl/twiki/pub/Main/TechnicalReports/TUD-SERG-2010-030.pdf"&gt;Enabling Multi-Tenancy: An Industrial Experience Report&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;I'll be presenting this at the IWPSE-EVOL and ICSM conferences, so if you are there, drop by and we can have a beer afterwards!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-6377696191119026879?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/6377696191119026879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2010/08/multi-tenancy-maintenance-dream-or.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/6377696191119026879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/6377696191119026879'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2010/08/multi-tenancy-maintenance-dream-or.html' title='Multi-Tenancy: Maintenance Dream or Nightmare?'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JnJnnoRuuOk/TFlbsxFArlI/AAAAAAAAACY/dagDQlh9lU0/s72-c/architecture+0_4+icsm+industrial.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-376546761119351462</id><published>2010-06-08T13:38:00.004+02:00</published><updated>2010-06-08T13:43:18.066+02:00</updated><title type='text'>SAP changes opinion about multi-tenancy</title><content type='html'>SAP was one of the companies who opposed against multi-tenancy, but in the new release of their product Business ByDesign they appear to have &lt;a href="http://www.sap.com/press.epx?pressID=13271"&gt;changed their opinion&lt;/a&gt;. Business ByDesign comes in a single-tenant and multi-tenant flavour.&lt;br /&gt;&lt;br /&gt;It is definitely good to see large software vendors showing interest in multi-tenant solutions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-376546761119351462?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/376546761119351462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2010/06/sap-changes-opinion-about-multi-tenancy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/376546761119351462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/376546761119351462'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2010/06/sap-changes-opinion-about-multi-tenancy.html' title='SAP changes opinion about multi-tenancy'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-6091318708134468084</id><published>2010-05-25T11:04:00.003+02:00</published><updated>2010-05-25T11:09:16.537+02:00</updated><title type='text'>Challenges of Reengineering into Multi-Tenant SaaS Applications</title><content type='html'>&lt;div style="text-align: justify;"&gt;First, I apologize for not updating this blog very much. I've been very busy with doing research and paper writing. I'll try to update more often :)&lt;br /&gt;&lt;br /&gt;We have published a technical report on multi-tenancy, which I'd like to tell you about. You can download it at &lt;a href="http://swerl.tudelft.nl/bin/view/Main/TechnicalReports"&gt;http://swerl.tudelft.nl/bin/view/Main/TechnicalReports&lt;/a&gt; (check the list out, there's tons of other cool stuff!).&lt;br /&gt;&lt;br /&gt;Title: "Challenges of  Reengineering into Multi-Tenant SaaS Applications"&lt;br /&gt;Abstract: "Multi-tenancy is a relatively new software architecture principle in the  realm of the Software as a Service (SaaS) business model. It allows to make full  use of the economy of scale, as multiple customers - "tenants" - share the same  application and database instance. All the while, the tenants enjoy a highly  configurable application, making it appear that the application is deployed on a  dedicated server. The major benefits of multi-tenancy are increased utilization  of hardware resources and improved ease of maintenance, resulting in lower  overall application costs, making the technology attractive for service  providers targeting the small and medium enterprise (SME) business segment. In  our paper, we identify some of the core challenges of implementing  multi-tenancy. Furthermore, we present an architectural reengineering approach  to support the migration of single-tenant applications into multi-tenant  applications."&lt;br /&gt;&lt;br /&gt;Feedback is welcome and much appreciated!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-6091318708134468084?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/6091318708134468084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2010/05/challenges-of-reengineering-into-multi.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/6091318708134468084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/6091318708134468084'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2010/05/challenges-of-reengineering-into-multi.html' title='Challenges of Reengineering into Multi-Tenant SaaS Applications'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-7962624071427216798</id><published>2009-12-24T21:01:00.000+01:00</published><updated>2009-12-24T21:05:35.719+01:00</updated><title type='text'>Merry Christmas!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://collect4all.com/images/site/christmas09.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 402px; height: 400px;" src="http://collect4all.com/images/site/christmas09.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-7962624071427216798?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/7962624071427216798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/12/merry-christmas.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/7962624071427216798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/7962624071427216798'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/12/merry-christmas.html' title='Merry Christmas!'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-305526359888434206</id><published>2009-12-15T13:08:00.000+01:00</published><updated>2009-12-15T13:09:45.712+01:00</updated><title type='text'>My two cents on why multi-tenancy can help save the environment</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="mso-ansi-language:EN-US"&gt;Yesterday, I was watching a documentary about green solutions in technology, especially in server environments. With issues like global warming and the carbon dioxide emission problem nowadays, any solution which helps us keep this emission as small as possible can contribute to a better environment.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="mso-ansi-language:EN-US"&gt;I believe that for software engineering, multi-tenancy is one of the key technologies which can help minimize the CO2 emission. The idea behind this is actually quite simple: in a traditional setup, each customer has his own dedicated resources. For most customers, 80% of these resources will be idle most of the time (based on the &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Pareto_principle"&gt;Pareto principle&lt;/a&gt;&lt;span style="mso-ansi-language:EN-US"&gt;). Even though the resources are idle, they are still consuming energy, and therefore producing CO2. Using multi-tenancy, we need fewer resources, while we can increase the utilization of resources we need.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span style="mso-ansi-language:EN-US"&gt;I’m not claiming to be a power management specialist, but I can’t imagine that running 1000 customers on one server consumes more power than having a dedicated server for each one of them. So, the more companies start implementing multi-tenant solutions, the more we, as software engineers, are able to contribute to the CO2 emission problem.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-305526359888434206?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/305526359888434206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/12/my-two-cents-on-why-multi-tenancy-can.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/305526359888434206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/305526359888434206'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/12/my-two-cents-on-why-multi-tenancy-can.html' title='My two cents on why multi-tenancy can help save the environment'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-5658946864077689377</id><published>2009-10-14T16:54:00.009+02:00</published><updated>2009-10-14T17:18:50.184+02:00</updated><title type='text'>Multi-tenancy explained from a non-technical perspective</title><content type='html'>&lt;div align="justify"&gt;Recently, I had to give a short presentation about the topic of my PhD research to a group of people with no background in software engineering. I decided to explain multi-tenancy using a metaphor. As I have noticed many people do not understand exactly what multi-tenancy and its benefits are, I’ll elaborate on the metaphor in this blog post.&lt;br /&gt;&lt;br /&gt;Imagine you are required to provide housing for a number of people, e.g. because you have a number of foreign employees currently working in your country. The first option to provide housing is to rent a complete house to everyone:&lt;/li&gt; &lt;/div&gt;&lt;ol&gt;&lt;p align="justify"&gt; &lt;/p&gt;&lt;/ol&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 209px; DISPLAY: block; HEIGHT: 269px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5392470424842123586" border="0" alt="" src="http://2.bp.blogspot.com/_JnJnnoRuuOk/StXnR-aDuUI/AAAAAAAAABg/k1S_iWUwYgo/s320/housing_single_tenancy.jpg" /&gt;Although this works, there are some disadvantages to this situation:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Costs&lt;/strong&gt;: As every employee is required to rent a complete house, the costs are very high.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Resource utilization&lt;/strong&gt;: For most clients, a complete house is too large to use entirely, which results in many spare rooms. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: In order to do maintenance, e.g. replace the alarm system due to a bug, a maintenance guy (or girl) must visit all houses and replace the system in everyone of them.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The second option is to rent apartments to everyone, rather than complete houses:&lt;/p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 201px; DISPLAY: block; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5392470942969899986" border="0" alt="" src="http://2.bp.blogspot.com/_JnJnnoRuuOk/StXnwIlWK9I/AAAAAAAAABo/3ynXhXDIPGY/s320/housing_multi_tenancy.jpg" /&gt; &lt;p&gt;&lt;/p&gt;&lt;p&gt;This situation does not have the disadvantages of option 1:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Costs&lt;/strong&gt;: Renting an apartment is much cheaper than renting a house. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Resource utilization&lt;/strong&gt;: As the rented space is smaller, it is more likely that the space better fits the needs of the user. This leads to less spare rooms.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: As all apartments are in the same location, maintenance can be performed easier (and therefore cheaper).&lt;/li&gt;&lt;/ol&gt;&lt;p align="justify"&gt;Note that both a decrease in resource utilization and an increase in the maintenance complexity/effort also cause the costs to increase. &lt;/p&gt;&lt;p align="justify"&gt;Although this example is for housing, the same ideas apply for software. In many ‘traditional’ situations, software is installed on the client side, either on their desktop or on a dedicated server: &lt;/p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 134px; DISPLAY: block; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5392471890538260434" border="0" alt="" src="http://4.bp.blogspot.com/_JnJnnoRuuOk/StXonSjP59I/AAAAAAAAACA/39xjCoqo-14/s320/software_single_tenancy.jpg" /&gt;For many customers, this is not an ideal solution, especially not for small companies:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;: This solution requires a large investment, due to the requirement of an application server, database server, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Resource utilization&lt;/strong&gt;: Many small businesses do their administrative tasks perhaps once a week, which means that their servers are idle during the rest of the week.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: For every software upgrade, all servers/installations must be upgraded individually.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;p align="justify"&gt;As you can see, this approach is not very efficient for smaller companies. Luckily, we can apply the apartment principle to software as well. By letting multiple customers share the same application and database server, we can achieve the same benefits: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Cost&lt;/strong&gt;: As resource costs are much lower, software (or rather: a service, SaaS) can be offered to the customer at a much lower price.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Resource utilization&lt;/strong&gt;: All customers use the same application and database instance, which results in high utilization of these instances.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: All upgrades must be applied to one instance only, which results in lower maintenance costs.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;In software engineering terms, we call this situation multi-tenancy:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_JnJnnoRuuOk/StXpKfobI3I/AAAAAAAAACI/1DbE--nwY9E/s1600-h/software_multi_tenancy.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 178px; DISPLAY: block; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5392472495345050482" border="0" alt="" src="http://4.bp.blogspot.com/_JnJnnoRuuOk/StXpKfobI3I/AAAAAAAAACI/1DbE--nwY9E/s320/software_multi_tenancy.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Unfortunately, multi-tenancy also introduces some new problems and emphasizes some existing problems. I’ll elaborate more on these problems in a next blog post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-5658946864077689377?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/5658946864077689377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/10/multi-tenancy-explained-from-non.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5658946864077689377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5658946864077689377'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/10/multi-tenancy-explained-from-non.html' title='Multi-tenancy explained from a non-technical perspective'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JnJnnoRuuOk/StXnR-aDuUI/AAAAAAAAABg/k1S_iWUwYgo/s72-c/housing_single_tenancy.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-5520890625763317432</id><published>2009-09-16T11:57:00.001+02:00</published><updated>2009-09-16T11:59:05.644+02:00</updated><title type='text'>Early death of a blog?</title><content type='html'>Definitely not, but I've been very busy with holidays, conference visit (ESEC/FSE'09) and studying ASP.NET. So, this is just a short note to let you know I'll keep updating this blog, hopefully more often than the last 1,5 month :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-5520890625763317432?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/5520890625763317432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/09/early-death-of-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5520890625763317432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5520890625763317432'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/09/early-death-of-blog.html' title='Early death of a blog?'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-3824502051883965811</id><published>2009-07-29T16:14:00.002+02:00</published><updated>2009-07-29T16:20:34.936+02:00</updated><title type='text'>Self-tuning databases survey</title><content type='html'>In 2007, Surajit Chaudhuri and Vivek Narasayya received the 10 year best paper award at the &lt;a href="http://www.vldb2007.org/"&gt;VLDB'07 conference&lt;/a&gt; for their paper on AutoAdmin, a tool for helping with difficult tasks such as automatic index tuning in databases.. They have written a survey of work that has been done over the last decade on self-tuning databases, with special attention for physical design. Very interesting paper if you want to know what has been done on self-tuning databases so far.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://research.microsoft.com/pubs/76506/vldb07-10yr.pdf"&gt;Self-Tuning Database Systems: A Decade of Progress&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-3824502051883965811?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/3824502051883965811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/self-tuning-databases-survey.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3824502051883965811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3824502051883965811'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/self-tuning-databases-survey.html' title='Self-tuning databases survey'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-5231972601816752486</id><published>2009-07-23T13:51:00.004+02:00</published><updated>2009-07-23T13:58:52.360+02:00</updated><title type='text'>Alternatives to relational databases</title><content type='html'>&lt;p align="justify"&gt;At a brainstorm meeting with one of my colleagues we briefly discussed the way in which data is being stored in the cloud. Since you’re not sure of where data is being stored, it’s difficult to define relations. Most web applications nowadays use relational databases to store their data, which means it would require a significant data model change if relational data can no longer be used when they move to the cloud.&lt;br /&gt;&lt;br /&gt;Almost all current database systems are relational: Oracle, MySQL, SQL Server, etc. A problem of relational databases is that they do not comply with the object-oriented programming model. In fact, &lt;a href="http://trycatchfail.com/blog/post/2009/01/26/Alternatives-to-Relational-Storage-Part-1-Introduction.aspx"&gt;40% of total effort often goes into writing and maintaining data access code&lt;/a&gt;. Another problem with relational databases is that they are difficult to scale, because of the defined relations. In this blog post I present some alternatives to relation databases.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Alternative 1: &lt;/strong&gt;&lt;a href="http://www.readwriteweb.com/enterprise/2009/02/is-the-relational-database-doomed.php?p=1"&gt;&lt;strong&gt;Key/value database&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="justify"&gt;In a key/value database, key/value pairs are stored in a domain, which is a bucket of data. These buckets have no relation to each other, nor does the data in them. Instead of defining relations, data is duplicated so that queries can be executed easily. It is important to realize that this may result in data inconsistency and the requirement for more storage capacity. Because no relations are defined between data, the responsibility of data integrity falls to the application, e.g. if a customers is removed, it is up to the application to remove all the orders made by that customer. Key/value databases are currently the preferred way in cloud applications, because they are very easily scalable and have no relations defined within them. Because key/value databases are therefore usually multi-tenanted, some sort of mechanism is required to make sure a user can’t overload the system. This is currently done by either limiting the maximum execution time of a query (&lt;a href="http://aws.amazon.com/simpledb/"&gt;Amazon SimpleDB&lt;/a&gt;) or the number of rows returned by a query (&lt;a href="http://code.google.com/appengine/docs/whatisgoogleappengine.html"&gt;Google AppEngine Datastore&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Alternative 2: &lt;/strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Object_database"&gt;&lt;strong&gt;Object-oriented database&lt;/strong&gt;&lt;/a&gt; &lt;p align="justify"&gt;In an object-oriented database objects are sent to the database, which stores them as objects. The main advantage of an OO database is that there is no need to write a large amount of data access code, as the database is 1:1 with the code. The downside is that aggregate queries are much more expensive than in SQL.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Alternative 3: XML database&lt;/strong&gt; &lt;p align="justify"&gt;XML databases are very good at storing hierarchical data. The downside is that they are slower to query than SQL databases, especially for aggregate functions.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Alternative 4: Document-oriented database&lt;/strong&gt; &lt;p align="justify"&gt;Document-oriented databases are suitable for applications which are document-oriented (which are in fact most current web applications). They are schema-free, which leads to a very flexible database. The main advantage is that they are much simpler than relational databases, and that they are very scalable. Another advantage is that document-oriented databases have a mature implementation, &lt;a href="http://couchdb.apache.org/docs/intro.html"&gt;Apache CouchDB&lt;/a&gt;. CouchDB is a distributed database system which offers mechanisms for replication and synchronization (scalability), and uses JavaScript to create views of data.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;&lt;p align="justify"&gt;While trying to achieve a scalable database system, it is important to not lose track of the highest requirement: functionality. If we have a perfectly scalable database, but we can’t perform the queries we want, what good is it?&lt;br /&gt;&lt;br /&gt;Non-relational databases appear to be useful in less complex web applications, as they seem to lack (or are very slow with) some advanced functionality such as aggregate queries. I do not see a good alternative yet for relational databases concerning this type of query. Especially in complex applications, with functionality such as report generation, relational databases still seem to be the best approach. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-5231972601816752486?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/5231972601816752486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/alternatives-to-relational-databases.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5231972601816752486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5231972601816752486'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/alternatives-to-relational-databases.html' title='Alternatives to relational databases'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-3668969029900207307</id><published>2009-07-22T14:15:00.003+02:00</published><updated>2009-07-22T14:48:32.238+02:00</updated><title type='text'>Database partitioning</title><content type='html'>&lt;p align="justify"&gt;Multi-tenant applications rely on database storage to serve their customers. As the number of customers grows, so will the amount of data used by the application. Eventually, this will lead to storage issues as the database is being filled with data. A possible way to cope with these storage issues is to partition the database. Partitioning the database results in two (or more) smaller database partitions which can be stored in different locations. Partitioning can be done in two ways: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Horizontal partitioning&lt;/strong&gt; - This is done by partitioning the database by separating it by rows. This will result in the same schema in the database partitions, and a performance boost can be achieved by creating local indexes for each partition, which are smaller than the global index.&lt;br /&gt;&lt;/div&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Vertical partitioning&lt;/strong&gt; - This is done by extracting columns from the database. The advantage is that the database becomes smaller, which leads to faster read times since more rows fit into memory at the same time. Unfortunately, it may become necessary to combine partitions using a JOIN operation. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;Partitioning can improve the performance of your database, but only if it is done correctly. It is also important to consider the nature of your data. If it is very dynamic, it is possible that your database needs repartitioning after a certain time (dynamic partitioning).&lt;br /&gt;&lt;br /&gt;Most large database management systems offer partitioning functionality. See the following links for more information:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://dev.mysql.com/tech-resources/articles/performance-partitioning.html"&gt;MySQL :: Improving Database Performance with Partitioning&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx"&gt;Partitioned Tables and Indexes in SQL Server 2005&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.oracle.com/technology/products/bi/db/11g/pdf/partitioning-11g-datasheet.pdf"&gt;Oracle partitioning&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-3668969029900207307?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/3668969029900207307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/database-partitioning.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3668969029900207307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3668969029900207307'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/database-partitioning.html' title='Database partitioning'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-8469989492959652585</id><published>2009-07-15T16:44:00.004+02:00</published><updated>2009-07-17T13:13:39.624+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='salesforce'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Salesforce.com gives insight on multi-tenant architecture</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt; is one of the largest multi-tenant platforms out there. Lately, they have been giving an insight on how their database architecture works. Checkout the paper &lt;a href="http://portal.acm.org/citation.cfm?id=1559845.1559942&amp;amp;coll=Portal&amp;amp;dl=GUIDE&amp;amp;CFID=44328369&amp;amp;CFTOKEN=65083765"&gt;The design of the force.com multitenant internet application development platform&lt;/a&gt; (for subscribed ACM members only) and the (excellent!) &lt;a href="http://www.infoq.com/presentations/SalesForce-Multi-Tenant-Architecture-Craig-Weissman"&gt;presentation by Craig Weissman&lt;/a&gt;, Chief Software Architect at &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Heap database&lt;/span&gt;&lt;br /&gt;In a nutshell, what &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt; does is place all user data in a heap database. Using tenant-specific metadata, virtual database tables can be defined. Imagine we are implementing a stamp collection application for &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt;. The heap could look like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JnJnnoRuuOk/Sl3rcS2FcbI/AAAAAAAAAA4/lx3v2e7dsY4/s1600-h/sf_heap.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 251px; height: 38px;" src="http://2.bp.blogspot.com/_JnJnnoRuuOk/Sl3rcS2FcbI/AAAAAAAAAA4/lx3v2e7dsY4/s320/sf_heap.jpg" alt="" id="BLOGGER_PHOTO_ID_5358698002968310194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In this case, the metadata would describe that the columns val0 and val500 for tenant 123 contain the country and price of a stamp.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Indexing&lt;/span&gt;&lt;br /&gt;Since all columns may contain different types of data for each tenant, creating indexes on the heap makes no sense. Therefore, &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt; creates tenant-specific indexes by copying the (small) parts of data which require indexing per tenant. Although this sounds like a good way of allowing indexing in a multi-tenant application, I wonder about the performance penalty of having so many small indexes.&lt;br /&gt;&lt;br /&gt;It is very nice to see that larger companies like &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt; are beginning to open up and publish more details about their architecture. It is very cool and useful to learn from industrial cases like this one!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-8469989492959652585?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/8469989492959652585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/salesforcecom-gives-insight-on-multi.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/8469989492959652585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/8469989492959652585'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/salesforcecom-gives-insight-on-multi.html' title='Salesforce.com gives insight on multi-tenant architecture'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JnJnnoRuuOk/Sl3rcS2FcbI/AAAAAAAAAA4/lx3v2e7dsY4/s72-c/sf_heap.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-7833948549938819480</id><published>2009-07-15T10:30:00.004+02:00</published><updated>2009-07-15T10:43:04.606+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cost benefits'/><category scheme='http://www.blogger.com/atom/ns#' term='definition'/><title type='text'>Cost advantages of multi-tenancy</title><content type='html'>&lt;div style="text-align: justify;"&gt;I read an interesting article on the cost advantages of multi-tenancy over single-tenant applications, &lt;a href="http://smoothspan.wordpress.com/2007/10/28/multitenancy-can-have-a-161-cost-advantage-over-single-tenant/"&gt;Multitenancy Can Have a 16:1 Cost Advantage Over Single-Tenant&lt;/a&gt;. The author also gives a nice, clear definition of multi-tenancy:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"Multitenancy is the ability to run multiple customers on a single software instance installed on multiple servers to increase resource utilization by allowing load balancing among tenants, and to reduce operational complexity and cost in managing the software to deliver the service.  Tenants on a multitenant system can operate as though they have an instance of the software entirely to themselves which is completely secure and insulated from any impact by other tenants."&lt;/blockquote&gt;In the rest of the article, examples of cost-savings by implementing multi-tenant solutions are being given. Finally, the author indicates that providing quality software is much more important for companies offering SaaS solutions, as they are being paid on a monthly basis, rather than receiving a large amount of money when their software is sold, like is the case with traditional software companies.&lt;br /&gt;&lt;br /&gt;To conclude, I would like to quote the author with a statement which is very true:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"Focusing on quality actually lowers costs."&lt;/blockquote&gt;So, let's developer our software with the highest quality standards possible, and save some money in these financially hard times!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-7833948549938819480?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/7833948549938819480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/cost-advantages-of-multi-tenancy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/7833948549938819480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/7833948549938819480'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/cost-advantages-of-multi-tenancy.html' title='Cost advantages of multi-tenancy'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-4512763887072529003</id><published>2009-07-14T13:21:00.005+02:00</published><updated>2009-07-14T13:33:32.049+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Best practices for multi-tenant applications</title><content type='html'>&lt;p style="text-align: justify;"&gt;&lt;a href="https://www.usenix.org/events/lisa07/tech/full_papers/hamilton/hamilton.pdf"&gt;On Designing and Deploying Internet-Scale Services&lt;/a&gt; is an interesting article in which Hamilton, who was at the time of writing the article doing research on the Windows Live Platform, describes best practices for design and deploy of internet-scale services, such as Hotmail. The recommendations are made with the goal of optimizing the cost of operations, but I believe they can improve the quality of your software, including multi-tenant applications, in general.&lt;br /&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Hamilton points out three design principles:&lt;br /&gt;&lt;/p&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Expect failures&lt;/span&gt;. Hardware and software will fail, so better be prepared, otherwise your complete system will crash.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Keep it simple&lt;/span&gt;. Simple installation and maintenance procedures will result in less mistakes. Also, keep dependencies as simple as possible to make sure that e.g. replacing a server is easy.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Automate everything&lt;/span&gt;. Staff is expensive and will make mistakes. An automated process can be tested and is repeatable.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="text-align: justify;"&gt;The rest of the paper is mostly a list of best practices with a short description. I will give a short overview of what I believe to be the most important ones in a multi-tenancy environment. I encourage you all to read the full paper, as it contains excellent recommendations for developing web applications in general.&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Application design&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Develop in a complete environment&lt;/span&gt;. Although unit testing is essential, make sure that your component works in the complete system.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Zero trust underlying components&lt;/span&gt;. Always validate  input as the component it came from may not have done this. Never trust another component does the validation for you: better safe than sorry.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Do not duplicate functionality in different components&lt;/span&gt;. Code multiplication will result in more difficult maintenance.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Understand access patterns&lt;/span&gt;. Improve your application by understanding how it is being used; e.g. by improving paths for shorter latency.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Version everything&lt;/span&gt;. Without versioning it is impossible to keep track of which features have been added or removed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Avoid single points of failure&lt;/span&gt;. When a single point of failure stops working, your whole system may fail. Therefore, always use redundancy and replication.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Automatic management&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Be restartable&lt;/span&gt;. If a service cannot restart when it is in faulted state, the whole system needs to be restarted.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Keep deployment simple&lt;/span&gt;. The simpler the deployment process, the simpler it is to automate.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Dependency management&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Use stable, proven components&lt;/span&gt;. Make sure you use components which are reliable. Alpha and beta components may contain many errors, which may cause your system to crash.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Release management&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Allow rollbacks to previous versions&lt;/span&gt;. Necessary in case of an error in an update.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Monitor and instrument everything, and give enough fault information for diagnosis&lt;/span&gt;. Save more information than e.g. just 'A query has failed'. Save query, time, error message and if possible the state of the application.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Make everything configurable&lt;/span&gt;. Make diagnosis options configurable, rather than adding them when a system is failing. Adding monitoring to a failing system is asking for problems.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="https://www.usenix.org/events/lisa07/tech/full_papers/hamilton/hamilton.pdf"&gt;On Designing and Deploying Internet-Scale Services&lt;/a&gt; contains many more of these recommendations. What are your recommendations for building high quality software?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-4512763887072529003?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/4512763887072529003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/best-design-practices-for-multi-tenant.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/4512763887072529003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/4512763887072529003'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/best-design-practices-for-multi-tenant.html' title='Best practices for multi-tenant applications'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-5230174035032392508</id><published>2009-07-13T16:04:00.003+02:00</published><updated>2009-07-13T16:08:05.972+02:00</updated><title type='text'>What does this mean? Part I</title><content type='html'>&lt;div style="text-align: justify;"&gt;In a meeting with colleagues I discovered that there was some slight confusion over the terminology used in multi-tenant systems. Therefore, I will give a short description of the differences between the terms which I regularly use and may cause confusion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multi-user vs single-user&lt;/span&gt;&lt;br /&gt;A &lt;span style="font-style: italic;"&gt;single-user&lt;/span&gt; application allows one user to use the application. Examples of this are most desktop applications, which allow customization (e.g. MS Word) for one user only. &lt;span style="font-style: italic;"&gt;Multi-user&lt;/span&gt; applications allow multiple users to concurrently use the application, for example a system which would let you log in. An advantage of multi-user systems is that they do not require a new instance for each application user.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multi-tenant vs single-tenant&lt;/span&gt;&lt;br /&gt;In a &lt;span style="font-style: italic;"&gt;single-tenant&lt;/span&gt; system, all users run their own application and database instance. In a &lt;span style="font-style: italic;"&gt;multi-tenant&lt;/span&gt; system this instance is shared. I also refer to my &lt;a href="http://multi-tenancy.blogspot.com/2009/07/what-is-multi-tenancy.html"&gt;introductory post&lt;/a&gt; on multi-tenancy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multi-tenant vs multi-user&lt;/span&gt;&lt;br /&gt;Any system may have multiple users. In a &lt;span style="font-style: italic;"&gt;multi-user&lt;/span&gt; system multiple users can use the application (e.g. &lt;a href="http://www.exactsoftware.com/"&gt;Exact Synergy&lt;/a&gt;). The term multi-user does not imply anything for the architecture of the system. On the other hand, while a multi-tenant system is a multi-user system, &lt;span style="font-style: italic;"&gt;multi-tenancy&lt;/span&gt; tells us something about the architecture of the system: namely that multiple users share the same application and database instance. Note that it is possible to have a multi-user system, which is not multi-tenant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web service vs business service&lt;/span&gt;&lt;br /&gt;A &lt;span style="font-style: italic;"&gt;business service&lt;/span&gt; is a service provided by a company, with which they (usually) make money. Examples are cooking lunch, offering a financial application and driving a cab. A &lt;span style="font-style: italic;"&gt;web service&lt;/span&gt; is a method of accessing a specific application. Examples of a web service are generating a token, returning the server time and storing data in a database. The web service layer is implemented between the application and the user, and offers a user the possibility to easily integrate an application without deep knowledge of its architecture. For example, if I’d want to integrate eBay auctions into my application, I would use their &lt;a href="http://developer.ebay.com/"&gt;web service&lt;/a&gt; to communicate with the &lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt; platform rather than finding out how their platform is implemented (also, they would probably not let me!).&lt;br /&gt;&lt;br /&gt;If any other terms (or even this explanation!) confuse you, please let me know!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-5230174035032392508?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/5230174035032392508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/what-does-this-mean-part-i.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5230174035032392508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5230174035032392508'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/what-does-this-mean-part-i.html' title='What does this mean? Part I'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-3210211938517745387</id><published>2009-07-10T22:43:00.003+02:00</published><updated>2009-07-10T22:47:01.225+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='benefits'/><category scheme='http://www.blogger.com/atom/ns#' term='disadvantages'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Benefits and disadvantages of multi-tenancy</title><content type='html'>&lt;div style="text-align: justify;"&gt;One of the main advantages of an ideal multi-tenant application is the operational benefit. Because all application code is in one place, it is much easier (and cheaper!) to maintain, update and backup the application and its data.&lt;br /&gt;&lt;br /&gt;Another advantage of multi-tenancy is the lower system requirements. Because an application and database are shared by multiple clients, it is not necessary to have a dedicated server for every client. This is a clear improvement in resources utilization.&lt;br /&gt;&lt;br /&gt;Because multiple clients share a server, scalability may become a problem. In single-tenant applications, all clients have their own resources and whenever a new client wants to use the application, resources are added. In multi-tenant applications, all clients share the same resources and it is possible that, at some point, these resources become overloaded. Something that influences the time before this point is reached, is the database implementation of the application (see &lt;a href="http://www.comp.nus.edu.sg/%7Ehuimei/papers/multi.pdf"&gt;'Supporting Database Applications as a Service'&lt;/a&gt;). One can define roughly three implementations of multi-tenancy databases:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Independent database, independent database instances (IDII)&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Independent tables, shared database instances (ITSI)&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Shared tables, shared database instances (STSI)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Clearly, IDII is not a real multi-tenant database approach. However, it is one that is quite often used as it is very easy to implement. The obvious downside of this approach is that it is very heavy on resources: for example, starting a MySQL database requires about 30M memory. When multiple instances are started, the system will run out of memory quickly.&lt;br /&gt;&lt;br /&gt;ITSI is a semi-multi-tenant solution, in which all clients use the same database, but each have their own tables. This approach suffers from the same problem as IDII, however it does take longer before the limits are reached, as a table instance requires less memory than a database instance.&lt;br /&gt;&lt;br /&gt;With regard to resources, the ideal solution is STSI. All tenants are in the same table and retrieve their records using the SQL syntax '&lt;span style="font-style: italic;"&gt;SELECT .... WHERE tenant_id = xxx&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;The problem with the STSI approach can be described as an isolation problem. Because application and database are shared, it is important that tenants are isolated from each other regarding security, customization performance, etc. In a next blog post I will discuss ways to isolate tenants from each other in more detail.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-3210211938517745387?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/3210211938517745387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/benefits-and-disadvantages-of-multi.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3210211938517745387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3210211938517745387'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/benefits-and-disadvantages-of-multi.html' title='Benefits and disadvantages of multi-tenancy'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-5442895288756377789</id><published>2009-07-08T16:39:00.002+02:00</published><updated>2009-07-10T21:30:27.650+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multi-tenancy'/><category scheme='http://www.blogger.com/atom/ns#' term='introduction'/><category scheme='http://www.blogger.com/atom/ns#' term='native'/><title type='text'>What is multi-tenancy?</title><content type='html'>&lt;p style="text-align: justify;"&gt;Back in the days, when computers still had CD-ROM drives and &lt;a href="http://en.wikipedia.org/wiki/Blue_screen_of_death"&gt;BSOD's&lt;/a&gt; were daily routine (though some may argue that this is still the fact), the software industry was quite different from today. Software was being sold on CD-ROMs (those rounded, shiny things), from which the software could be installed. After this era, fast Internet access became available and CD-ROMs slowly disappeared. Now, a customer would download software and install it on their computer. This type of software, which installs on the customer's computer, is also known as &lt;a href="http://en.wikipedia.org/wiki/On-premise_software"&gt;on-premises&lt;/a&gt; software.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Although this system worked, there are some downsides to it. An example is the upgrading process: since all software copies are on different computers, a software upgrade must be pushed to all these machines.&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight: bold; text-align: center;"&gt;Wouldn't it be cool if we could perform the update in one place instead?&lt;/p&gt;&lt;p style="text-align: justify;"&gt;This is exactly what multi-tenancy is about. Multi-tenancy allows multiple users (tenants) to use an application which runs on the same computer. This can be done in two ways: &lt;/p&gt;&lt;ul&gt; &lt;li&gt;Multiple instances&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Share instance&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="text-align: justify;"&gt;The multiple instances pattern runs an application instance for each user, for example by using &lt;a href="http://www.eecs.umich.edu/%7Echtsai/papers/dsom07.pdf"&gt;virtual machines&lt;/a&gt;. The obvious downside of this is the resource requirement, as each instance requires allocated memory. Since this pattern is in fact single-tenancy, I will not discuss it further.&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JnJnnoRuuOk/SlSwR8l7Z5I/AAAAAAAAAAw/48TZG5nMT4M/s1600-h/multiple_instances_vs_native_MT.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 88px;" src="http://1.bp.blogspot.com/_JnJnnoRuuOk/SlSwR8l7Z5I/AAAAAAAAAAw/48TZG5nMT4M/s320/multiple_instances_vs_native_MT.jpg" alt="" id="BLOGGER_PHOTO_ID_5356099679219836818" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;The share instance pattern shares the application instance and database amongst multiple users (see figure). This means that we can do an upgrade on only one instance - imagine how much we could save on costs and time! Of course this isn't the only advantage of running a multi-tenancy application over a single-tenancy one. I will discuss the advantages (and disadvantages) of native multi-tenancy applications in a next blog post.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-5442895288756377789?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/5442895288756377789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/what-is-multi-tenancy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5442895288756377789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/5442895288756377789'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/what-is-multi-tenancy.html' title='What is multi-tenancy?'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JnJnnoRuuOk/SlSwR8l7Z5I/AAAAAAAAAAw/48TZG5nMT4M/s72-c/multiple_instances_vs_native_MT.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3340650378925421769.post-3731294952484697452</id><published>2009-07-08T14:42:00.001+02:00</published><updated>2009-07-08T16:44:31.802+02:00</updated><title type='text'>First post</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hi, my name is Cor-Paul and I am 24 years old, living in the Netherlands. I just started my PhD research on multi-tenancy and decided to maintain a blog to let you know what I’m up to, and to (hopefully) receive some feedback on the work I’ve been doing. As I have just started doing research, there isn’t much on this blog yet. But be sure to follow it as many interesting articles will follow! :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3340650378925421769-3731294952484697452?l=multi-tenancy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://multi-tenancy.blogspot.com/feeds/3731294952484697452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/first-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3731294952484697452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3340650378925421769/posts/default/3731294952484697452'/><link rel='alternate' type='text/html' href='http://multi-tenancy.blogspot.com/2009/07/first-post.html' title='First post'/><author><name>Cor-Paul Bezemer</name><uri>http://www.blogger.com/profile/00244444420335604367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_JnJnnoRuuOk/TIYkFA9fE5I/AAAAAAAAACo/_ur68KRZVhI/S220/cp.jpg'/></author><thr:total>1</thr:total></entry></feed>
