<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <id>http://blog.iandavis.com/</id>
  <title>Internet Alchemy</title>
  
  <updated>2017-10-23T21:00:00Z</updated>
  
  <author><name>Ian Davis</name></author>
  <link href="http://blog.iandavis.com/" rel="alternate"></link>
  <generator uri="http://github.com/piranha/gostatic/">gostatic</generator>



<entry>
  <id>2017/10/microfunctions/</id>
  <author><name>Ian Davis</name></author>
  <title type="html">Serverless: why microfunctions &gt; microservices</title>
  <published>2017-10-23T21:00:00Z</published>
  
  <category term="architecture"></category>
  
  <category term="distributed-systems"></category>
  
  <category term="technology"></category>
  
  <category term="serverless"></category>
  
  <category term="faas"></category>
  
  <link href="http://blog.iandavis.com/2017/10/microfunctions/" rel="alternate"></link>
  <content type="html">
    
    
      
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&#34;utf-8&#34;&gt;
  &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge,chrome=1&#34;&gt;
  &lt;title&gt;Serverless: why microfunctions &gt; microservices&lt;/title&gt;
  &lt;link href=&#34;http://gmpg.org/xfn/11&#34; rel=&#34;profile&#34;&gt;
  &lt;link rel=&#34;alternate&#34; type=&#34;application/atom+xml&#34; title=&#34;Internet Alchemy feed&#34; href=&#34;http://blog.iandavis.com/feed/&#34;&gt;
  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;152x152&#34; href=&#34;/images/apple-touch-icon-152x152.png&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-32x32.png&#34; sizes=&#34;32x32&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/android-chrome-192x192.png&#34; sizes=&#34;192x192&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-96x96.png&#34; sizes=&#34;96x96&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-16x16.png&#34; sizes=&#34;16x16&#34;&gt;
  &lt;link rel=&#34;shortcut icon&#34; href=&#34;/favicon.ico&#34;&gt;

  &lt;meta name=&#34;author&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:card&#34; content=&#34;summary&#34;&gt;
  &lt;meta name=&#34;twitter:site&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta name=&#34;twitter:creator&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:image:src&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta name=&#34;twitter:title&#34; content=&#34;Serverless: why microfunctions &amp;gt; microservices&#34;&gt;
  &lt;meta name=&#34;twitter:description&#34; content=&#34;In which I argue that serverless function-oriented architectures have the potential to be more robust, cheaper and less complex than equivalent microservice systems.&#34;&gt;

  &lt;meta property=&#34;og:type&#34; content=&#34;article&#34;&gt;
  &lt;meta property=&#34;og:image&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta property=&#34;og:site_name&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta property=&#34;og:title&#34; content=&#34;Serverless: why microfunctions &amp;gt; microservices&#34;&gt;
  &lt;meta property=&#34;og:description&#34; content=&#34;In which I argue that serverless function-oriented architectures have the potential to be more robust, cheaper and less complex than equivalent microservice systems.&#34;&gt;

  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34;&gt;

  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/poole.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/syntax.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/hyde.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;//fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface&#34;&gt;
  &lt;link href=&#34;//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css&#34; rel=&#34;stylesheet&#34;&gt;

  &lt;/head&gt;
&lt;body&gt;


&lt;div class=&#34;sidebar&#34;&gt;
  &lt;div class=&#34;container sidebar-sticky&#34;&gt;
    &lt;div class=&#34;sidebar-about&#34;&gt;
      &lt;h1&gt;&lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;Internet Alchemy&lt;/a&gt;&lt;/h1&gt;
      &lt;p class=&#34;lead&#34;&gt;
       est. 1999 
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2017&#34;&gt;2017&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2011&#34;&gt;2011&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2006&#34;&gt;2006&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2001&#34;&gt;2001&lt;/a&gt;
    &lt;/div&gt;

    &lt;div&gt;
      &lt;a href=&#34;/2016&#34;&gt;2016&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2010&#34;&gt;2010&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2005&#34;&gt;2005&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2000&#34;&gt;2000&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2015&#34;&gt;2015&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2009&#34;&gt;2009&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2004&#34;&gt;2004&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/1999&#34;&gt;1999&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2014&#34;&gt;2014&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2008&#34;&gt;2008&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2003&#34;&gt;2003&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2012&#34;&gt;2012&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2007&#34;&gt;2007&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2002&#34;&gt;2002&lt;/a&gt;
    &lt;/div&gt;

    &lt;a href=&#34;http://iandavis.com/&#34; rel=&#34;me&#34; class=&#34;p-author h-card&#34;&gt;&lt;i class=&#34;fa fa-home&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;&lt;i class=&#34;fa fa-flask&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/feed/&#34;&gt;&lt;i class=&#34;fa fa-rss&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://twitter.com/iand&#34;&gt;&lt;i class=&#34;fa fa-twitter&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://github.com/iand&#34;&gt;&lt;i class=&#34;fa fa-github&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://plus.google.com/u/2/100424448589843669731/posts&#34; rel=“author me”&gt;&lt;i class=&#34;fa fa-google-plus&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://keybase.io/rauyran&#34;&gt;&lt;i class=&#34;fa fa-key&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;div class=&#34;content container&#34;&gt;
        
&lt;article class=&#34;h-entry&#34;&gt;
&lt;div class=&#34;post&#34;&gt;
  &lt;header&gt;
    &lt;span class=&#34;post-date-above&#34;&gt;&lt;a href=&#34;http://blog.iandavis.com/2017/10/microfunctions/&#34;&gt;&lt;time class=&#34;dt-published&#34; datetime=&#34;2017-10-23T09:00:00&#34;&gt;Mon, Oct 23, 2017&lt;/time&gt;&lt;/a&gt;&lt;/span&gt;
    &lt;h1 class=&#34;p-name&#34;&gt;Serverless: why microfunctions &gt; microservices&lt;/h1&gt;
  &lt;/header&gt;
  &lt;section class=&#34;e-content&#34;&gt;
  &lt;p&gt;This post follows on from a post I wrote a couple of years back called &lt;a href=&#34;/2014/03/why-service-architectures-should-focus-on-workflows/&#34;&gt;Why Service Architectures Should Focus on Workflows&lt;/a&gt;. In that post I attempted to describe the fragility of microservice systems that were simply translating object-oriented patterns to the new paradigm. These systems were migrating domain models and their interactions from in-memory objects to separate networked processes. They were replacing in-process function calls with cross-network rpc calls, adding latency and infrastructure complexity. The goal was scalability and flexibility but, I argued, the entity modelling approach introduced new failure modes. I suggested a solution:&lt;/p&gt;

&lt;blockquote&gt;Instead of carving up the domain by entity, focus on the workflows.&lt;/blockquote&gt;

&lt;p&gt;If I was writing that post today I would say &amp;ldquo;focus on the functions&amp;rdquo; because the future is serverless functions, not microservices. Or, more brashly:&lt;/p&gt;

&lt;blockquote&gt;microfunctions &gt; microservices&lt;/blockquote&gt;

&lt;p&gt;The industry has moved apace in the last 3 years with a focus on solving the infrastructure challenges caused by running hundreds of intercommunicating microservices. Containers have matured and become the de-facto standard for the unit of microservice deployment with management platforms such as Kubernetes to orchestrate them and frameworks like GRPC for robust interservice communication.&lt;/p&gt;

&lt;p&gt;The focus still tends to be on &lt;em&gt;interacting entities&lt;/em&gt; though: when placing an order the &amp;ldquo;order service&amp;rdquo; talks to the &amp;ldquo;customer service&amp;rdquo; which reserves items by talking to the &amp;ldquo;stock service&amp;rdquo; and the &amp;ldquo;payment service&amp;rdquo; which talks to the &amp;ldquo;payment gateway&amp;rdquo; after first checking with the &amp;ldquo;fraud service&amp;rdquo;. When the order needs to be shipped the &amp;ldquo;shipping service&amp;rdquo; asks the &amp;ldquo;order service&amp;rdquo; for orders that need to be fulfilled and tells the &amp;ldquo;stock service&amp;rdquo; to remove the reservation, then to the &amp;ldquo;customer service&amp;rdquo; to locate the customer etc. All of these services are likely to be persisting state in various backend databases.&lt;/p&gt;

&lt;p&gt;Microservices are organized as vertical slices through the domain:&lt;/p&gt;

&lt;p&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;/2017/10/vertical.png&#34; alt=&#34;&#34; width=&#34;629&#34; height=&#34;283&#34;  /&gt;&lt;/p&gt;

&lt;p&gt;The same problems still exist: if the customer service is overwhelmed by the shipping service then the order service can&amp;rsquo;t take new orders. The container manager will, of course, scale up the number of customer service instances and register them with the appropriate load balancers, discovery servers, monitoring and logging. However, it cannot easily cope with a critical failure in this service, perhaps caused by a repeated bad request that panics the service and prevents multiple dependent services from operating properly. Failures and slowdowns in response times are handled within client services through backoff strategies, circuit breakers and retries. The system as a whole increases in complexity but remains fragile.&lt;/p&gt;

&lt;p&gt;By contrast, in a serverless architecture, the emphasis is on the functions of the system. For this reason serverless is sometimes called FaaS &amp;ndash; Functions as a Service. Systems are decomposed into functions that encapsulate a single task in a single process. Instead of each request involving the orchestration of multiple services the request uses an instance of the appropriate function. Rather than the domain model being exploded into separate networked processes its entities are provided in code libraries compiled into the function at build time. Calls to entity methods are in-process so don&amp;rsquo;t pay the network latency or reliability taxes.&lt;/p&gt;

&lt;p&gt;In this paradigm the &amp;ldquo;place order&amp;rdquo; function simply calls methods on customer, stock and payment objects, which may then interact with the various backend databases directly. Instead of a dozen networked RPC calls, the function relies on 2-3 database calls. Additionally, if a function is particularly hot it can be scaled directly without affecting the operation of other functions and, crucially, it can fail completely without taking down other functions. (Modulo the reliability of databases which affect both styles of architecture identically.)&lt;/p&gt;

&lt;p&gt;Microfunctions are horizontal slices through the domain:&lt;/p&gt;

&lt;p&gt;&lt;img class=&#34;alignnone size-full&#34; src=&#34;/2017/10/horizontal.png&#34; alt=&#34;&#34; width=&#34;629&#34; height=&#34;283&#34; /&gt;&lt;/p&gt;

&lt;p&gt;The advantages I wrote last time still hold up when translated to serverless terminology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploying or retiring a function becomes as simple as switching it on or off which leads to greater freedom to experiment.&lt;/li&gt;
&lt;li&gt;Scaling a function is limited to scaling a single type of process horizontally and the costs of doing this can be cleanly evaluated.&lt;/li&gt;
&lt;li&gt;The system as a whole becomes much more robust. When a function encounters problems it is limited to a single workflow such as issuing invoices. Other functions can continue to operate independently.&lt;/li&gt;
&lt;li&gt;Latency, bandwidth use and reliability are all improved because there are fewer network calls. The function still relies on the database and other support systems such as lock servers, but most of the data flow is controlled in-process.&lt;/li&gt;
&lt;li&gt;The unit of testing and deployment is a single function which reduces the complexity and cost of maintenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One major advantage that I missed is the potential for extreme cost savings through scale, particularly the scale attainable by running on public shared infrastructure. Since all the variability of microservice deployment configurations is abstracted away into a simple request/response interface the microfunctions can be run as isolated shared-nothing processes, billed only for the resources they use in their short lifetime. Anyone who has costed for redundant microservices simply for basic resilience will appreciate the potential here.&lt;/p&gt;

&lt;p&gt;Although there are number of cloud providers in this space (&lt;a href=&#34;https://aws.amazon.com/lambda/details/&#34;&gt;AWS Lambda&lt;/a&gt;, &lt;a href=&#34;https://cloud.google.com/functions/&#34;&gt;Google Cloud Functions&lt;/a&gt;, &lt;a href=&#34;https://azure.microsoft.com/en-gb/services/functions/&#34;&gt;Azure Functions&lt;/a&gt;) serverless is still an emerging paradigm with the problems that come with immaturity. Adrian Coyler recently summarized an &lt;a href=&#34;https://blog.acolyer.org/2017/10/19/serverless-computing-economic-and-architectural-impact/&#34;&gt;excellent paper and presentation dealing with the challenges of building serverless systems&lt;/a&gt; which highlights many of these, including the lack of service level agreements and loose performance guarantees. It seems almost certain though that these will improve as the space matures and overtakes the microservice paradigm.&lt;/p&gt;

  
    
  </content>
</entry>

<entry>
  <id>2016/03/gorecipes-fin/</id>
  <author><name>Ian Davis</name></author>
  <title type="html">Gorecipes: Fin</title>
  <published>2016-03-30T18:00:00Z</published>
  
  <category term="golang"></category>
  
  <category term="writing"></category>
  
  <link href="http://blog.iandavis.com/2016/03/gorecipes-fin/" rel="alternate"></link>
  <content type="html">
    
    
      
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&#34;utf-8&#34;&gt;
  &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge,chrome=1&#34;&gt;
  &lt;title&gt;Gorecipes: Fin&lt;/title&gt;
  &lt;link href=&#34;http://gmpg.org/xfn/11&#34; rel=&#34;profile&#34;&gt;
  &lt;link rel=&#34;alternate&#34; type=&#34;application/atom+xml&#34; title=&#34;Internet Alchemy feed&#34; href=&#34;http://blog.iandavis.com/feed/&#34;&gt;
  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;152x152&#34; href=&#34;/images/apple-touch-icon-152x152.png&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-32x32.png&#34; sizes=&#34;32x32&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/android-chrome-192x192.png&#34; sizes=&#34;192x192&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-96x96.png&#34; sizes=&#34;96x96&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-16x16.png&#34; sizes=&#34;16x16&#34;&gt;
  &lt;link rel=&#34;shortcut icon&#34; href=&#34;/favicon.ico&#34;&gt;

  &lt;meta name=&#34;author&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:card&#34; content=&#34;summary&#34;&gt;
  &lt;meta name=&#34;twitter:site&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta name=&#34;twitter:creator&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:image:src&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta name=&#34;twitter:title&#34; content=&#34;Gorecipes: Fin&#34;&gt;
  

  &lt;meta property=&#34;og:type&#34; content=&#34;article&#34;&gt;
  &lt;meta property=&#34;og:image&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta property=&#34;og:site_name&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta property=&#34;og:title&#34; content=&#34;Gorecipes: Fin&#34;&gt;
  

  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34;&gt;

  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/poole.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/syntax.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/hyde.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;//fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface&#34;&gt;
  &lt;link href=&#34;//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css&#34; rel=&#34;stylesheet&#34;&gt;

  &lt;/head&gt;
&lt;body&gt;


&lt;div class=&#34;sidebar&#34;&gt;
  &lt;div class=&#34;container sidebar-sticky&#34;&gt;
    &lt;div class=&#34;sidebar-about&#34;&gt;
      &lt;h1&gt;&lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;Internet Alchemy&lt;/a&gt;&lt;/h1&gt;
      &lt;p class=&#34;lead&#34;&gt;
       est. 1999 
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2017&#34;&gt;2017&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2011&#34;&gt;2011&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2006&#34;&gt;2006&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2001&#34;&gt;2001&lt;/a&gt;
    &lt;/div&gt;

    &lt;div&gt;
      &lt;a href=&#34;/2016&#34;&gt;2016&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2010&#34;&gt;2010&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2005&#34;&gt;2005&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2000&#34;&gt;2000&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2015&#34;&gt;2015&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2009&#34;&gt;2009&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2004&#34;&gt;2004&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/1999&#34;&gt;1999&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2014&#34;&gt;2014&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2008&#34;&gt;2008&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2003&#34;&gt;2003&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2012&#34;&gt;2012&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2007&#34;&gt;2007&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2002&#34;&gt;2002&lt;/a&gt;
    &lt;/div&gt;

    &lt;a href=&#34;http://iandavis.com/&#34; rel=&#34;me&#34; class=&#34;p-author h-card&#34;&gt;&lt;i class=&#34;fa fa-home&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;&lt;i class=&#34;fa fa-flask&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/feed/&#34;&gt;&lt;i class=&#34;fa fa-rss&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://twitter.com/iand&#34;&gt;&lt;i class=&#34;fa fa-twitter&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://github.com/iand&#34;&gt;&lt;i class=&#34;fa fa-github&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://plus.google.com/u/2/100424448589843669731/posts&#34; rel=“author me”&gt;&lt;i class=&#34;fa fa-google-plus&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://keybase.io/rauyran&#34;&gt;&lt;i class=&#34;fa fa-key&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;div class=&#34;content container&#34;&gt;
        
&lt;article class=&#34;h-entry&#34;&gt;
&lt;div class=&#34;post&#34;&gt;
  &lt;header&gt;
    &lt;span class=&#34;post-date-above&#34;&gt;&lt;a href=&#34;http://blog.iandavis.com/2016/03/gorecipes-fin/&#34;&gt;&lt;time class=&#34;dt-published&#34; datetime=&#34;2016-03-30T06:00:00&#34;&gt;Wed, Mar 30, 2016&lt;/time&gt;&lt;/a&gt;&lt;/span&gt;
    &lt;h1 class=&#34;p-name&#34;&gt;Gorecipes: Fin&lt;/h1&gt;
  &lt;/header&gt;
  &lt;section class=&#34;e-content&#34;&gt;
  &lt;p&gt;How hard can it be to write a book of small, useful programming recipes? Too hard as it turns out.&lt;/p&gt;

&lt;p&gt;About a year ago I was prompted by APress publishing to submit a proposal for a book to be called Go Recipes. Knowing nothing about book publishing this surprised me: I&amp;rsquo;d always assumed that authors pitched ideas to publishers or publishers pitched ideas to authors. It never occurred to me that a publisher would ask an author to devise an idea to pitch out of the blue. I surmised that they must have spotted my &lt;a href=&#34;http://github.com/iand/gocookbook/&#34;&gt;Go Cookbook&lt;/a&gt; repository on Github. After a couple of weeks of hesitation I put together the table of contents and blurb for the kind of book I would want to use, and one I hoped I could write. The publisher liked what I put together and asked me to write it. After another couple of weeks of hesitation, knowing it would be a massive time commitment. I should have hesitated a bit longer because I completely underestimated that investment of time.&lt;/p&gt;

&lt;p&gt;I had plenty of ideas and within a few weeks I had delivered the first chapter and then a few weeks later I managed a second. Then my enthusiasm and energy began to wane: I was busy with other things in my life; I fretted about writing compelling and relevant recipes; I was writing about things I wasn&amp;rsquo;t that interested in; I worried about repeating myself over and over when explaining things in Go. Most of all I was anxious that some of the things I was writing might not be complete enough or not perceived as correct by other Go programmers.&lt;/p&gt;

&lt;p&gt;If you were waiting for that book then I&amp;rsquo;m sorry to disappoint you: it&amp;rsquo;s not going to be completed. I decided that it was going to take too long and APress can&amp;rsquo;t sit around forever waiting for this awesome book to emerge. I don&amp;rsquo;t know if they&amp;rsquo;ll take that idea up with someone else. Hopefully they will because it would be a great resource for new Go programmers.&lt;/p&gt;

&lt;p&gt;All is not doom and gloom though: I have taken the best and most complete recipes I came up with and added them to the &lt;a href=&#34;http://github.com/iand/gocookbook/&#34;&gt;Go Cookbook&lt;/a&gt; repository. These are now in the public domain, free for anyone to use for any purpose. Go wild.&lt;/p&gt;

  
    
  </content>
</entry>

<entry>
  <id>2015/02/another-blog-refresh/</id>
  <author><name>Ian Davis</name></author>
  <title type="html">Another Blog Refresh</title>
  <published>2015-02-22T10:04:00Z</published>
  
  <category term="internet-alchemy"></category>
  
  <category term="gostatic"></category>
  
  <link href="http://blog.iandavis.com/2015/02/another-blog-refresh/" rel="alternate"></link>
  <content type="html">
    
    
      
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&#34;utf-8&#34;&gt;
  &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge,chrome=1&#34;&gt;
  &lt;title&gt;Another Blog Refresh&lt;/title&gt;
  &lt;link href=&#34;http://gmpg.org/xfn/11&#34; rel=&#34;profile&#34;&gt;
  &lt;link rel=&#34;alternate&#34; type=&#34;application/atom+xml&#34; title=&#34;Internet Alchemy feed&#34; href=&#34;http://blog.iandavis.com/feed/&#34;&gt;
  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;152x152&#34; href=&#34;/images/apple-touch-icon-152x152.png&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-32x32.png&#34; sizes=&#34;32x32&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/android-chrome-192x192.png&#34; sizes=&#34;192x192&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-96x96.png&#34; sizes=&#34;96x96&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-16x16.png&#34; sizes=&#34;16x16&#34;&gt;
  &lt;link rel=&#34;shortcut icon&#34; href=&#34;/favicon.ico&#34;&gt;

  &lt;meta name=&#34;author&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:card&#34; content=&#34;summary&#34;&gt;
  &lt;meta name=&#34;twitter:site&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta name=&#34;twitter:creator&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:image:src&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta name=&#34;twitter:title&#34; content=&#34;Another Blog Refresh&#34;&gt;
  

  &lt;meta property=&#34;og:type&#34; content=&#34;article&#34;&gt;
  &lt;meta property=&#34;og:image&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta property=&#34;og:site_name&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta property=&#34;og:title&#34; content=&#34;Another Blog Refresh&#34;&gt;
  

  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34;&gt;

  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/poole.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/syntax.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/hyde.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;//fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface&#34;&gt;
  &lt;link href=&#34;//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css&#34; rel=&#34;stylesheet&#34;&gt;

  &lt;/head&gt;
&lt;body&gt;


&lt;div class=&#34;sidebar&#34;&gt;
  &lt;div class=&#34;container sidebar-sticky&#34;&gt;
    &lt;div class=&#34;sidebar-about&#34;&gt;
      &lt;h1&gt;&lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;Internet Alchemy&lt;/a&gt;&lt;/h1&gt;
      &lt;p class=&#34;lead&#34;&gt;
       est. 1999 
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2017&#34;&gt;2017&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2011&#34;&gt;2011&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2006&#34;&gt;2006&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2001&#34;&gt;2001&lt;/a&gt;
    &lt;/div&gt;

    &lt;div&gt;
      &lt;a href=&#34;/2016&#34;&gt;2016&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2010&#34;&gt;2010&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2005&#34;&gt;2005&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2000&#34;&gt;2000&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2015&#34;&gt;2015&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2009&#34;&gt;2009&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2004&#34;&gt;2004&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/1999&#34;&gt;1999&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2014&#34;&gt;2014&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2008&#34;&gt;2008&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2003&#34;&gt;2003&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2012&#34;&gt;2012&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2007&#34;&gt;2007&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2002&#34;&gt;2002&lt;/a&gt;
    &lt;/div&gt;

    &lt;a href=&#34;http://iandavis.com/&#34; rel=&#34;me&#34; class=&#34;p-author h-card&#34;&gt;&lt;i class=&#34;fa fa-home&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;&lt;i class=&#34;fa fa-flask&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/feed/&#34;&gt;&lt;i class=&#34;fa fa-rss&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://twitter.com/iand&#34;&gt;&lt;i class=&#34;fa fa-twitter&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://github.com/iand&#34;&gt;&lt;i class=&#34;fa fa-github&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://plus.google.com/u/2/100424448589843669731/posts&#34; rel=“author me”&gt;&lt;i class=&#34;fa fa-google-plus&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://keybase.io/rauyran&#34;&gt;&lt;i class=&#34;fa fa-key&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;div class=&#34;content container&#34;&gt;
        
&lt;article class=&#34;h-entry&#34;&gt;
&lt;div class=&#34;post&#34;&gt;
  &lt;header&gt;
    &lt;span class=&#34;post-date-above&#34;&gt;&lt;a href=&#34;http://blog.iandavis.com/2015/02/another-blog-refresh/&#34;&gt;&lt;time class=&#34;dt-published&#34; datetime=&#34;2015-02-22T10:04:00&#34;&gt;Sun, Feb 22, 2015&lt;/time&gt;&lt;/a&gt;&lt;/span&gt;
    &lt;h1 class=&#34;p-name&#34;&gt;Another Blog Refresh&lt;/h1&gt;
  &lt;/header&gt;
  &lt;section class=&#34;e-content&#34;&gt;
  &lt;p&gt;It&amp;rsquo;s time for another blog refresh, this time back to a static site after a few years being hosted by &lt;a href=&#34;http://wordpress.com&#34;&gt;Wordpress.com&lt;/a&gt;. Once again I&amp;rsquo;m convinced by &lt;a href=&#34;http://www.aaronsw.com/weblog/000404&#34;&gt;Aaron&amp;rsquo;s argument&lt;/a&gt; that baking is better than frying. It&amp;rsquo;s not about performance, it&amp;rsquo;s about simplicity and control.&lt;/p&gt;

&lt;p&gt;While I liked the convenience of Wordpress.com, it never really felt like a place I could tailor to my own requirements. I thought having a nice web UI and mobile apps to edit posts would encourage me to post more. It actually made no difference whatsoever. Whatever holds me back from blogging isn&amp;rsquo;t related to the editing UI.&lt;/p&gt;

&lt;p&gt;For this move I looked at various static site generators such as &lt;a href=&#34;http://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;, &lt;a href=&#34;http://hyde.github.io/&#34;&gt;Hyde&lt;/a&gt; and &lt;a href=&#34;http://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; but I settled on a mimimal one: &lt;a href=&#34;https://github.com/piranha/gostatic&#34;&gt;gostatic&lt;/a&gt;. My reasoning (which I admit may not be entirely justified) is that feature-led software gets updated at a much higher rate than I post to my blog. When I come to post, invariably something important has changed in the core software or in a dependency and so I&amp;rsquo;ll need to upgrade or fix that before being able to publish. I find this particularly true of larger systems in dynamic languages like Ruby or PHP.&lt;/p&gt;

&lt;p&gt;This time around I have a single binary (gostatic) to generate the site with no dependencies. It&amp;rsquo;s deliberately feature-poor so I don&amp;rsquo;t rely on things that may be changed or deprecated some time in the future and I have a script that does the rebuild and can sync to whatever laptop I&amp;rsquo;ll be using in the coming years. It&amp;rsquo;s documented for a future me.&lt;/p&gt;

&lt;p&gt;A few technical notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Posts are written in markdown and are compatible with all the static site generators I mentioned above&lt;/li&gt;
&lt;li&gt;This move is partly motivated by moving to a new web server. I&amp;rsquo;m going to be using nginx and serving either static files or fronting Go services. This is the first time I&amp;rsquo;ve had a server that isn&amp;rsquo;t running Apache+PHP.&lt;/li&gt;
&lt;li&gt;Hopefully the atom feed works ok &amp;ndash; it looks ok, but there&amp;rsquo;s almost certainly some weird software out there that will break on it.&lt;/li&gt;
&lt;li&gt;There will be broken links, but already I have fixed hundreds of bad internal links by being able to grep over all the posts locally.&lt;/li&gt;
&lt;li&gt;Formatting will be weird in places since the posts were exported via Wordpress&amp;rsquo;s XML export. I&amp;rsquo;ll get to tidying up the individual posts as an ongoing job.&lt;/li&gt;
&lt;li&gt;There are no comments. I have the comments as part of the Wordpress export, and I&amp;rsquo;m planning to take a look at how to incorporate them into the blog archives. However I&amp;rsquo;m not planning on adding commenting to the blog. Thank you to all of you who have commented on my posts in the past, I have enjoyed reading them. But&amp;hellip; it&amp;rsquo;s time to admit that commenting is a broken form of communication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a contrary views on baked vs fried and blog commenting, see &lt;a href=&#34;/2004/09/redesign-and-move-to-wordpress/&#34;&gt;my post on moving from Moveable Type to Wordpress back in 2004&lt;/a&gt; or my &lt;a href=&#34;/2002/07/moving-to-moveable-type/&#34;&gt;post on moving from a dynamic system to Moveable Type&lt;/a&gt;, or even &lt;a href=&#34;/2010/11/over-to-posterous/&#34;&gt;my post on moving to a hosted blog on Posterous&lt;/a&gt; ;)&lt;/p&gt;

&lt;p&gt;For early blog archaeology see &lt;a href=&#34;/2002/10/site-makeover/&#34;&gt;my post on early versions of Internet Alchemy&lt;/a&gt;&lt;/p&gt;

  
    
  </content>
</entry>

<entry>
  <id>2014/03/why-service-architectures-should-focus-on-workflows/</id>
  <author><name>Ian Davis</name></author>
  <title type="html">Why Service Architectures Should Focus on Workflows</title>
  <published>2014-03-31T23:27:12Z</published>
  
  <category term="architecture"></category>
  
  <category term="distributed-systems"></category>
  
  <category term="post-format-aside"></category>
  
  <category term="technology"></category>
  
  <link href="http://blog.iandavis.com/2014/03/why-service-architectures-should-focus-on-workflows/" rel="alternate"></link>
  <content type="html">
    
    
      
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&#34;utf-8&#34;&gt;
  &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge,chrome=1&#34;&gt;
  &lt;title&gt;Why Service Architectures Should Focus on Workflows&lt;/title&gt;
  &lt;link href=&#34;http://gmpg.org/xfn/11&#34; rel=&#34;profile&#34;&gt;
  &lt;link rel=&#34;alternate&#34; type=&#34;application/atom+xml&#34; title=&#34;Internet Alchemy feed&#34; href=&#34;http://blog.iandavis.com/feed/&#34;&gt;
  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;152x152&#34; href=&#34;/images/apple-touch-icon-152x152.png&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-32x32.png&#34; sizes=&#34;32x32&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/android-chrome-192x192.png&#34; sizes=&#34;192x192&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-96x96.png&#34; sizes=&#34;96x96&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-16x16.png&#34; sizes=&#34;16x16&#34;&gt;
  &lt;link rel=&#34;shortcut icon&#34; href=&#34;/favicon.ico&#34;&gt;

  &lt;meta name=&#34;author&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:card&#34; content=&#34;summary&#34;&gt;
  &lt;meta name=&#34;twitter:site&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta name=&#34;twitter:creator&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:image:src&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta name=&#34;twitter:title&#34; content=&#34;Why Service Architectures Should Focus on Workflows&#34;&gt;
  

  &lt;meta property=&#34;og:type&#34; content=&#34;article&#34;&gt;
  &lt;meta property=&#34;og:image&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta property=&#34;og:site_name&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta property=&#34;og:title&#34; content=&#34;Why Service Architectures Should Focus on Workflows&#34;&gt;
  

  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34;&gt;

  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/poole.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/syntax.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/hyde.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;//fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface&#34;&gt;
  &lt;link href=&#34;//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css&#34; rel=&#34;stylesheet&#34;&gt;

  &lt;/head&gt;
&lt;body&gt;


&lt;div class=&#34;sidebar&#34;&gt;
  &lt;div class=&#34;container sidebar-sticky&#34;&gt;
    &lt;div class=&#34;sidebar-about&#34;&gt;
      &lt;h1&gt;&lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;Internet Alchemy&lt;/a&gt;&lt;/h1&gt;
      &lt;p class=&#34;lead&#34;&gt;
       est. 1999 
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2017&#34;&gt;2017&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2011&#34;&gt;2011&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2006&#34;&gt;2006&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2001&#34;&gt;2001&lt;/a&gt;
    &lt;/div&gt;

    &lt;div&gt;
      &lt;a href=&#34;/2016&#34;&gt;2016&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2010&#34;&gt;2010&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2005&#34;&gt;2005&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2000&#34;&gt;2000&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2015&#34;&gt;2015&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2009&#34;&gt;2009&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2004&#34;&gt;2004&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/1999&#34;&gt;1999&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2014&#34;&gt;2014&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2008&#34;&gt;2008&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2003&#34;&gt;2003&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2012&#34;&gt;2012&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2007&#34;&gt;2007&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2002&#34;&gt;2002&lt;/a&gt;
    &lt;/div&gt;

    &lt;a href=&#34;http://iandavis.com/&#34; rel=&#34;me&#34; class=&#34;p-author h-card&#34;&gt;&lt;i class=&#34;fa fa-home&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;&lt;i class=&#34;fa fa-flask&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/feed/&#34;&gt;&lt;i class=&#34;fa fa-rss&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://twitter.com/iand&#34;&gt;&lt;i class=&#34;fa fa-twitter&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://github.com/iand&#34;&gt;&lt;i class=&#34;fa fa-github&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://plus.google.com/u/2/100424448589843669731/posts&#34; rel=“author me”&gt;&lt;i class=&#34;fa fa-google-plus&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://keybase.io/rauyran&#34;&gt;&lt;i class=&#34;fa fa-key&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;div class=&#34;content container&#34;&gt;
        
&lt;article class=&#34;h-entry&#34;&gt;
&lt;div class=&#34;post&#34;&gt;
  &lt;header&gt;
    &lt;span class=&#34;post-date-above&#34;&gt;&lt;a href=&#34;http://blog.iandavis.com/2014/03/why-service-architectures-should-focus-on-workflows/&#34;&gt;&lt;time class=&#34;dt-published&#34; datetime=&#34;2014-03-31T11:27:12&#34;&gt;Mon, Mar 31, 2014&lt;/time&gt;&lt;/a&gt;&lt;/span&gt;
    &lt;h1 class=&#34;p-name&#34;&gt;Why Service Architectures Should Focus on Workflows&lt;/h1&gt;
  &lt;/header&gt;
  &lt;section class=&#34;e-content&#34;&gt;
  &lt;p&gt;Since this week saw the 15th anniversary of this blog I thought I&amp;rsquo;d celebrate by actually writing a post, and a technical one at that. Before we get to it, I have to recognise that I&amp;rsquo;m blogging in the 21st century now, so here&amp;rsquo;s a meme:&lt;/p&gt;

&lt;p&gt;&lt;img class=&#34;alignnone size-full wp-image-2673&#34; src=&#34;/2014/03/mckayla-maroney-not-impressed-meme1.jpg&#34; alt=&#34;mckayla-maroney-not-impressed-meme1&#34; width=&#34;530&#34; height=&#34;298&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Recently I&amp;rsquo;ve been musing over the way we tend to architect distributed systems. Almost certainly none of what follows is original, but like most of my writing its designed to help me understand and codify a set of thoughts that have been buzzing around for a while.&lt;/p&gt;

&lt;p&gt;If we practise domain driven design then it&amp;rsquo;s important to remember that the domain model is not the system. Rather, its a tool to help us understand our system better, a map of the territory if you like. It helps us navigate and use our system correctly but its insufficient by itself. Its called a model because it makes simplifying assumptions about the world. It tells us how the world might work if we didn&amp;rsquo;t have to worry about things that are hard to control like latency, bandwidth, communication failures, resource limits, concurrency and trust.&lt;/p&gt;

&lt;p&gt;As a whole, the domain model encapsulates the constraints and business rules that apply to our system. We represent real world entities by objects that encapsulate state and manipulate it via methods. A well normalised system will ensure that objects have a single responsibility with the minimal interface required to fulfil it. Interacting with the system quite often requires the orchestration of many objects, each handling their own unique part of the work. Workflows such as taking orders, paying staff or shipping goods  are accomplished by arranging the appropriate objects and invoking methods to achieve the final desired system state according to the constraints defined by the relationships between objects.&lt;/p&gt;

&lt;p&gt;The first place we usually encounter the limitation of our domain model is when we start adding persistence. Aside from the well-known object/relational impedance mismatch we also need to introduce new abstractions to deal with the location of the backend database: batching up reads and writes for efficiency, adding transactions for integrity and connection management for reliability.&lt;/p&gt;

&lt;p&gt;We are compensating for the deficiencies in our domain model but importantly we are not invalidating it. The constraints and rules still apply: customers have orders which have line items etc. Now, however, we are having to interface our simple model to some of the complexities of the real world. If the database was in the same process space as the domain model then we wouldn&amp;rsquo;t be as concerned about the impact of interacting with it. However most databases are physically remote over a fallible network link with huge latency compared to main memory and have multiple clients modifying data concurrently.&lt;/p&gt;

&lt;p&gt;Another place we encounter limitations, and the main point of this post, is when we want to scale out our system to increase capacity. These days that implies we want to distribute the system over several interacting services that can be scaled as necessary. The temptation here is to simply follow the domain model constraints and distribute the system by entity type. Following this we may end up with services for customers, orders and products each encapsulating its data and exposing actions over it. They interact with the database independently to ensure data integrity and can be scaled out with additional instances as necessary as system load grows.&lt;/p&gt;

&lt;p&gt;Placing an order might be orchestrated by the order service that gets the customer details from the customer service, product information from the product service and uses them to create the order. Along the way it might also verify whether the customer is good for credit or needs to pay immediately, check stock levels, lookup shipping costs and trigger activities in fulfilment and invoicing services.&lt;/p&gt;

&lt;p&gt;On the surface this seems reasonable, after all these steps have to happen somewhere, but digging deeper we can expose more complexity. The customer service will probably need get data from a database, perhaps calling into an organisation service for corporate customers to get billing and shipping addresses. The product service also looks up data in the database but we only need basic information such as description and package quantities so getting a full product entity is likely to be overkill for our needs. Creating an order requires locking, persistence of line items and the order itself, and&amp;hellip;. you get the idea: a lot is happening and it&amp;rsquo;s happening over the network.&lt;/p&gt;

&lt;p&gt;This scale out approach carries many of the same problems we encounter with adding persistence to our domain model:
&lt;ul&gt;
    &lt;li&gt;Latency &amp;ndash; the time taken to traverse the network for each service call is at least two orders of magnitude larger than calling an in-process method. Add in disk seeks and it&amp;rsquo;s another order of magnitude slower. The domain model simplifies the world by assuming these calls are free but in reality they can compound up to crippling degrees of slowdown.&lt;/li&gt;
    &lt;li&gt;Bandwidth &amp;ndash; retrieving a customer&amp;rsquo;s details or a product spec can result in a lot of data being transferred unnecessarily when we only need a name or quantity. Again the domain model assumes data is referenced in-place or that bandwidth is infinite. Introducing alternate service calls for summaries and subsets of the data can mitigate this problem but wasting bandwidth limits scalability of the system as a whole.&lt;/li&gt;
    &lt;li&gt;Reliability &amp;ndash; we have to assume that every out of process request can fail unexpectedly. The possible causes are nearly infinite: the network link may be down, the server could be out of sockets, routing may be faulty or someone switched off the destination server. The domain model simplified the world by assuming every method call will succeed. A typical workaround for this is to introduce timeouts and automatic retries which can lead to pathological situations where every timeout cascades up into multiple retries at all levels tying up resources and limiting throughput.&lt;/li&gt;
&lt;/ul&gt;
In addition, the approach introduces some new problems:
&lt;ul&gt;
    &lt;li&gt;Fragility &amp;ndash; because the service model mirrors the domain model, services will participate in multiple of workflows and any failure will affect them all. For example a customer service is likely to be used during ordering, shipping, invoicing and payment. If the customer service is unavailable then all those workflows break at the same time. Not only that but each of these workflows depends on multiple services being available.&lt;/li&gt;
    &lt;li&gt;Scaling &amp;ndash; because lots of services are involved in a single workflow, scaling capacity for one workflow means every service used has to be scaled as well and since the services may be invoked multiple times during a single interaction they have to be scaled faster than the invoking service. This adds unnecessary costs to scaling. If we want to take more payments then we need to scale out a bunch of services even if they are only supplying a single value in our workflow.&lt;/li&gt;
    &lt;li&gt;Hotspots &amp;ndash; most domain models have a few central objects such as customers or companies that are involved in large numbers of workflows. When these are encapsulated as services they become hotspots and bottlenecks for performance, degrading multiple workflows simultaneously.&lt;/li&gt;
    &lt;li&gt;Evolvability &amp;ndash; all systems evolve with business requirements but service architectures that follow the domain model too closely become difficult to evolve. A change to workflow such as adding a new required piece of information can lead to a cascade of interface changes between services to enable them to pass it through to dependent services. Conversely, removing a workflow means removing functionality from services and subsequently retesting and redeployment of large numbers of services. Given the fragility of the system, this can cause problems in unrelated workflows simply because one service is malfunctioning.&lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;&lt;/p&gt;

&lt;p&gt;All of these problems can be mitigated with a different approach to service design. Instead of carving up the domain by entity, focus on the workflows.&lt;/p&gt;

&lt;p&gt;In this approach each important function becomes a separate service that can be scaled independently and has minimal dependencies.  Using the example earlier we would design a &amp;ldquo;place order&amp;rdquo; service that is responsible solely for placing an order. It performs the same tasks as before but instead of calling entity-based services it uses the domain model objects directly to carry out its work, connecting to the database as necessary to select just the information it requires to create the order.&lt;/p&gt;

&lt;p&gt;Communication between workflows is performed asynchronously by sharing state in the database or publishing an event to a message queue. For example once the order has been placed, events are fired that will kick off invoicing and fulfilment workflows.&lt;/p&gt;

&lt;p&gt;This brings a number of immediate advantages:
&lt;ul&gt;
    &lt;li&gt;Deploying or retiring a workflow becomes as simple as switching a service on or off which leads to greater freedom to experiment.&lt;/li&gt;
    &lt;li&gt;Scaling a workflow is limited to scaling a single service horizontally and the costs of doing this can be cleanly evaluated.&lt;/li&gt;
    &lt;li&gt;The system as a whole becomes much more robust. When a service encounters problems it is limited to a single workflow such as issuing invoices. Other workflows can continue to operate independently.&lt;/li&gt;
    &lt;li&gt;Latency, bandwidth use and reliability are all improved because there are fewer network calls. The service still relies on the database and other support systems such as lock servers, but most of the data flow is controlled in-process.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
    &lt;li&gt;The unit of testing and deployment is a single service which reduces the complexity and cost of maintenance.&lt;/li&gt;
&lt;/ul&gt;
This approach also matches the adage of small pieces loosely joined as evidenced in the UNIX philosophy. There we don&amp;rsquo;t find applications representing files, reports and users but small tools for cutting, sorting and creating these kinds of things.&lt;/p&gt;

&lt;p&gt;It&amp;rsquo;s important to recognise the difference between the organisation of code and its deployment. We logically separate the objects we use to implement the domain model using SOLID practices that help us maintain, evolve and reason about our code. But we don&amp;rsquo;t need to be constrained in that way when it comes to deployment as a service. The service uses the domain model objects but it doesn&amp;rsquo;t need to own them &amp;ndash; it just composes the objects it needs into the patterns required for its workflow. Data is still encapsulated by each domain object and their interactions are still well defined.&lt;/p&gt;

&lt;p&gt;In this respect the domain model actually becomes more important because it defines the reusable business rules and logic that will be used to create services for each workflow.&lt;/p&gt;

&lt;p&gt;So we should keep the domain model but be aware that it&amp;rsquo;s only a map to help us navigate our system and tell us how things should work under ideal conditions. As we interface that to the real world we need to introduce abstractions and aggregations tuned to the messy realities of networks, resource constraints and concurrency. To improve reliability, throughput and scaling economics we need to focus on composing domain objects into services that  distinct workflows through our system and arrange our architecture to minimise dependencies between services.&lt;/p&gt;

  
    
  </content>
</entry>

<entry>
  <id>2012/11/help-me-crowdfund-my-game-amberfell/</id>
  <author><name>Ian Davis</name></author>
  <title type="html">Help me crowdfund my game Amberfell</title>
  <published>2012-11-12T09:27:51Z</published>
  
  <category term="amberfell"></category>
  
  <category term="crowdfunding"></category>
  
  <category term="kickstarter"></category>
  
  <category term="projects"></category>
  
  <link href="http://blog.iandavis.com/2012/11/help-me-crowdfund-my-game-amberfell/" rel="alternate"></link>
  <content type="html">
    
    
      
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&#34;utf-8&#34;&gt;
  &lt;meta http-equiv=&#34;X-UA-Compatible&#34; content=&#34;IE=edge,chrome=1&#34;&gt;
  &lt;title&gt;Help me crowdfund my game Amberfell&lt;/title&gt;
  &lt;link href=&#34;http://gmpg.org/xfn/11&#34; rel=&#34;profile&#34;&gt;
  &lt;link rel=&#34;alternate&#34; type=&#34;application/atom+xml&#34; title=&#34;Internet Alchemy feed&#34; href=&#34;http://blog.iandavis.com/feed/&#34;&gt;
  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;152x152&#34; href=&#34;/images/apple-touch-icon-152x152.png&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-32x32.png&#34; sizes=&#34;32x32&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/android-chrome-192x192.png&#34; sizes=&#34;192x192&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-96x96.png&#34; sizes=&#34;96x96&#34;&gt;
  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; href=&#34;/images/favicon-16x16.png&#34; sizes=&#34;16x16&#34;&gt;
  &lt;link rel=&#34;shortcut icon&#34; href=&#34;/favicon.ico&#34;&gt;

  &lt;meta name=&#34;author&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:card&#34; content=&#34;summary&#34;&gt;
  &lt;meta name=&#34;twitter:site&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta name=&#34;twitter:creator&#34; content=&#34;Ian Davis&#34;&gt;
  &lt;meta name=&#34;twitter:image:src&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta name=&#34;twitter:title&#34; content=&#34;Help me crowdfund my game Amberfell&#34;&gt;
  

  &lt;meta property=&#34;og:type&#34; content=&#34;article&#34;&gt;
  &lt;meta property=&#34;og:image&#34; content=&#34;http://www.gravatar.com/avatar/09dc91c92d018a094d7ce79b19034252.png&#34;&gt;
  &lt;meta property=&#34;og:site_name&#34; content=&#34;Internet Alchemy&#34;&gt;
  &lt;meta property=&#34;og:title&#34; content=&#34;Help me crowdfund my game Amberfell&#34;&gt;
  

  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width&#34;&gt;

  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/poole.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/syntax.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;/css/hyde.css&#34;&gt;
  &lt;link rel=&#34;stylesheet&#34; href=&#34;//fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface&#34;&gt;
  &lt;link href=&#34;//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css&#34; rel=&#34;stylesheet&#34;&gt;

  &lt;/head&gt;
&lt;body&gt;


&lt;div class=&#34;sidebar&#34;&gt;
  &lt;div class=&#34;container sidebar-sticky&#34;&gt;
    &lt;div class=&#34;sidebar-about&#34;&gt;
      &lt;h1&gt;&lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;Internet Alchemy&lt;/a&gt;&lt;/h1&gt;
      &lt;p class=&#34;lead&#34;&gt;
       est. 1999 
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2017&#34;&gt;2017&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2011&#34;&gt;2011&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2006&#34;&gt;2006&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2001&#34;&gt;2001&lt;/a&gt;
    &lt;/div&gt;

    &lt;div&gt;
      &lt;a href=&#34;/2016&#34;&gt;2016&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2010&#34;&gt;2010&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2005&#34;&gt;2005&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2000&#34;&gt;2000&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2015&#34;&gt;2015&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2009&#34;&gt;2009&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2004&#34;&gt;2004&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/1999&#34;&gt;1999&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2014&#34;&gt;2014&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2008&#34;&gt;2008&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2003&#34;&gt;2003&lt;/a&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;a href=&#34;/2012&#34;&gt;2012&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2007&#34;&gt;2007&lt;/a&gt; &amp;middot;
      &lt;a href=&#34;/2002&#34;&gt;2002&lt;/a&gt;
    &lt;/div&gt;

    &lt;a href=&#34;http://iandavis.com/&#34; rel=&#34;me&#34; class=&#34;p-author h-card&#34;&gt;&lt;i class=&#34;fa fa-home&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/&#34;&gt;&lt;i class=&#34;fa fa-flask&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;http://blog.iandavis.com/feed/&#34;&gt;&lt;i class=&#34;fa fa-rss&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://twitter.com/iand&#34;&gt;&lt;i class=&#34;fa fa-twitter&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://github.com/iand&#34;&gt;&lt;i class=&#34;fa fa-github&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://plus.google.com/u/2/100424448589843669731/posts&#34; rel=“author me”&gt;&lt;i class=&#34;fa fa-google-plus&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
    &lt;a href=&#34;https://keybase.io/rauyran&#34;&gt;&lt;i class=&#34;fa fa-key&#34;&gt;&lt;/i&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;div class=&#34;content container&#34;&gt;
        
&lt;article class=&#34;h-entry&#34;&gt;
&lt;div class=&#34;post&#34;&gt;
  &lt;header&gt;
    &lt;span class=&#34;post-date-above&#34;&gt;&lt;a href=&#34;http://blog.iandavis.com/2012/11/help-me-crowdfund-my-game-amberfell/&#34;&gt;&lt;time class=&#34;dt-published&#34; datetime=&#34;2012-11-12T09:27:51&#34;&gt;Mon, Nov 12, 2012&lt;/time&gt;&lt;/a&gt;&lt;/span&gt;
    &lt;h1 class=&#34;p-name&#34;&gt;Help me crowdfund my game Amberfell&lt;/h1&gt;
  &lt;/header&gt;
  &lt;section class=&#34;e-content&#34;&gt;
  &lt;p&gt;I&#39;m excited to announce that I&#39;ve launched a &lt;a href=&#34;http://www.kickstarter.com/projects/rauyran/amberfell&#34;&gt;Kickstarter project&lt;/a&gt; to complete the development of Amberfell, the game I started writing a few months ago. I&#39;m hoping to raise £20,000 so I can hire a graphic artist to make the game look amazing, spend some on promotion and marketing and the rest to fund me taking time out of contract work to finish the programming.&lt;/p&gt;
&lt;p&gt;For those that haven&#39;t see it before on my blog, Amberfell is a resource collecting video game set in a steampunk alternate history. It has some vague similarities with Minecraft but may play a bit more like Warcraft. It&#39;ll support singleplayer against the computer or multiplayer against friends over the Internet. Each player takes on the role of a prospector seeking a substance called amberfell which not only is incredibly valuable but has amazing properties too. To gather it they need to build tools and machines to help them and hinder their opponents. This is set against a backdrop of a wilderness world populated with dangerous creatures and natural hazards. You can read more about my ideas for it on the &lt;a href=&#34;http://www.kickstarter.com/projects/rauyran/amberfell&#34;&gt;kickstarter&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;You might ask why I am seeking to fund this through kickstarter and why now? The simple answer is that Kickstarter have just launched in the UK, literally just a couple of weeks ago. Earlier this year I looked into signing up with them but was stymied by their restriction to US bank accounts. I looked at a couple of other similar services, but Kickstarter has the biggest audience and numbers matter for crowdfunding.&lt;/p&gt;
&lt;p&gt;Also, running crowdfunding project for a game of like this isn&#39;t really about raising the money, it&#39;s about gauging audience demand. I could continue to develop the game in my spare time and launch it in 12-18 months time but this way I get to find out if anyone is actually interested in the game much sooner. I&#39;m hoping to get some feedback on my ideas: does it capture the imagination; does it sound like fun; would you pay for it and if not, what would you pay for?&lt;/p&gt;
&lt;p&gt;If i don&#39;t get over 100 backers then it&#39;s going to be a clear signal that the game doesn&#39;t light any fires and I&#39;d better rethink it. I might still continue with it just because it&#39;s a game I want to play myself, or I may radically shift it. For me, that&#39;s the most exciting part!&lt;/p&gt;
&lt;p&gt;I&#39;m tweeting about the game and the funding drive on &lt;a href=&#34;http://twitter.com/amberfell&#34;&gt;amberfell&#39;s twitter account&lt;/a&gt; so follow me there to keep up to date.&lt;/p&gt;
&lt;p&gt;Here&#39;s a quick video of the game in action so far:&lt;/p&gt;

&lt;iframe width=&#34;640&#34; height=&#34;480&#34; src=&#34;http://www.youtube.com/embed/5bpr5w8LWVw&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;I&#39;d love to have your feedback on the game, even if it&#39;s something you would never buy yourself. I want to hear your opinions and thoughts on it. Please leave a comment here or head over to the &lt;a href=&#34;http://www.kickstarter.com/projects/rauyran/amberfell&#34;&gt;Kickstarter page&lt;/a&gt; and tell me there. If you are also able to donate to the development fund then that would be wonderful - thank you! You can get a copy of the game as a reward or even get a likeness of you built into the game and playable by (hopefully) tens of thousands of people around the world! :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

  
    
  </content>
</entry>


</feed>
