---
title: Constructing a Resilient FeatureBoard Architecture
description: Learn how to ensure connectivity to FeatureBoard is as resilient as possible with the use of an External State Store. Discover how to implement this feature using the FeatureBoard .NET SDK and create a highly available application with direct access to a more resilient set of features. Check out the latest updates to the .NET SDK on NuGet.
image: https://blog.arkahna.io/hubfs/DALL%C2%B7E%20architecture%20diagram.png
---

[Skip to the main content.](https://blog.arkahna.io/constructing-a-resilient-featureboard-architecture#main-content)

[![Arkahna_Brand+Word-Horizontal-WHITE](https://blog.arkahna.io/hs-fs/hubfs/logos/Arkahna_Brand+Word-Horizontal-WHITE.png?width=4000&height=1445&name=Arkahna_Brand+Word-Horizontal-WHITE.png "Arkahna_Brand+Word-Horizontal-WHITE")](https://arkahna.io)

[![Arkahna_Brand+Word-Horizontal](https://blog.arkahna.io/hs-fs/hubfs/logos/Arkahna_Brand+Word-Horizontal.png?width=2286&height=826&name=Arkahna_Brand+Word-Horizontal.png "Arkahna_Brand+Word-Horizontal")](https://arkahna.io)

- [Plan](https://arkahna.io/plan)
- [Build](https://arkahna.io/build)
- [Accelerate](https://arkahna.io/accelerate) 
    - [FeatureBoard](https://arkahna.io/featureboard)
    - [Marketplace Elements](https://arkahna.io/accelerate/marketplace-elements)
- [Run](https://arkahna.io/run) 
    - [Sigil](https://arkahna.io/sigil)
- [Blog](https://blog.arkahna.io)

Toggle Menu

Toggle Menu

- [Plan](https://arkahna.io/plan)
- [Build](https://arkahna.io/build)
- [Accelerate](https://arkahna.io/accelerate) 
    - [FeatureBoard](https://arkahna.io/featureboard)
    - [Marketplace Elements](https://arkahna.io/accelerate/marketplace-elements)
- [Run](https://arkahna.io/run) 
    - [Sigil](https://arkahna.io/sigil)
- [Blog](https://blog.arkahna.io)

- [Home](https://arkahna.io)
- [FeatureBoard](https://arkahna.io/featureboard)
- [Sigil](https://arkahna.io/sigil)
- [Blog](https://blog.arkahna.io)

[Facebook](https://www.facebook.com/arkahna) [Linkedin](https://www.linkedin.com/company/arkahna) [X](https://twitter.com/ArkahnaAU)

 2 min read

# Constructing a Resilient FeatureBoard Architecture

[![Picture of Matthew Nixon](https://blog.arkahna.io/hubfs/Matt%20Nixon.png) Matthew Nixon](https://blog.arkahna.io/author/matthew-nixon) :  Jan 12, 2024 10:36:14 AM

[featureboard](https://blog.arkahna.io/tag/featureboard) [web development](https://blog.arkahna.io/tag/web-development) [.NET](https://blog.arkahna.io/tag/net)

![Constructing a Resilient FeatureBoard Architecture](https://blog.arkahna.io/hubfs/DALL%C2%B7E%20architecture%20diagram.png)

The [Twelve-Factor App methodology](https://12factor.net/backing-services) describes treating backing resources as “attached resources”, so how do you ensure connectivity to FeatureBoard is as resilient as possible? The FeatureBoard SDK provides a fallback mechanism for you to maintain a copy of Features and its Audience Exceptions using a concept called an External State Store. When accessing features via the FeatureBoard SDK, if an External State Store is provided and connectivity is lost to FeatureBoard (e.g. perhaps by a severed Internet connection), the SDK will have fallback values for Features and its Audience Exceptions

## Implementation using .NET SDK

Let’s start by adding the FeatureBoard .NET SDK to our project:

`dotnet add package FeatureBoard.DotnetSdk`

then creating a class that implements the `IFeatureBoardExternalState` :

`using FeatureBoard.DotnetSdk.Models; using FeatureBoard.DotnetSdk.States; public class MyExternalState: IFeatureBoardExternalState {   public Task<IReadOnlyCollection<FeatureConfiguration>> GetState(CancellationToken cancellationToken)   {   // TODO: implement me   }   public Task UpdateState(IReadOnlyCollection<FeatureConfiguration> features, CancellationToken cancellationToken)   {   // TODO: implement me   } }`

Next let's make sure the new state store is registered in Program.cs:

`builder.Services.AddFeatureBoard<WeatherFeatures, QueryStringAudienceProvider>()   .WithPollingUpdateStrategy()   .WithExternalState<MyExternalState>();`

OK that’s the easy part done - how can we ensure this newly configured External State Store is as resilient as possible? Let’s say you have a Web Application that is already rated Highly Available by means of geo-redundancy or some other mechanism - let’s ensure the External state store is backed by a resource that is also Highly Available!

It is important to understand that with a fleet of Web Applications interacting with an External State Store, the FeatureBoard SDK will preference values that are “written last”. As such, please select a location for your External State store that can handle synchronous writes without blocking. Examples include:

- A RDBMS (e.g. Azure SQL Server, MySQL)
- A Cloud Storage Service (e.g. Azure Blob Storage, AWS S3)
- In-Memory distributed state storage (e.g. REDIS)

So, for our example suppose your Web Application is hosted in a scaled [Azure App Service](https://azure.microsoft.com/en-au/products/app-service) and your organisation has [Geo-Redundant Premium Azure Blob Storage](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)

![01 storage diagram](https://blog.arkahna.io/hs-fs/hubfs/01%20storage%20diagram.jpg?width=690&height=456&name=01%20storage%20diagram.jpg)

In the above example let's go ahead and create a service for writing to a blob store and wire it in to our External State Store. In the below example the MyStateStoreWriter class should contain implementation specifics for your chosen External State Store (e.g. how to write to an Azure Blob Store):

Program.cs:

`services.AddTransient<MyStateStoreWriter>();`

Now let’s update our state store:

`using FeatureBoard.DotnetSdk.Models; namespace MyApplication.State; public class MyExternalState: IFeatureBoardExternalState     // This interface should handle fetching/updating State as required depending     // on where it may be hosted.     private IMyStateStoreWriter _stateStoreWriter;          public MyExternalState(IStateStoreWriter stateStoreWriter)     {         this._stateStoreWriter = stateStoreWriter;     }          public async Task<IReadOnlyCollection<FeatureConfiguration>> GetState(CancellationToken cancellationToken)     {           // i.e. will return a copy of the last written set of Features/Audiences          return await _stateStoreWriter.GetState(cancellationToken);     }     public async Task UpdateState(IReadOnlyCollection<FeatureConfiguration> features, CancellationToken cancellationToken)     {         // i.e. update the underlying data store with an updated state store values                 await _stateStoreWriter.UpdateState(features, cancellationToken);     }`

There you go! You’ve implemented a simple External State store with the FeatureBoard SDK! You should now be able to ensure all of your Highly Available Application nodes/instances have direct access to a more resilient set of Features and its Audience Exceptions.

Be sure to check [FeatureBoard.DotnetSdk on NuGet](https://www.nuget.org/packages/FeatureBoard.DotnetSdk) for the latest updates to the .NET SDK.

- [Tweet](https://twitter.com/share)

[![Building a Feature Flagging Culture](https://blog.arkahna.io/hubfs/blog-images/image-20240226-043638.png)](https://blog.arkahna.io/building-a-feature-flagging-culture)

#### [Building a Feature Flagging Culture](https://blog.arkahna.io/building-a-feature-flagging-culture)

[Jake Ginnivan](https://blog.arkahna.io/author/jake-ginnivan) : Mar 4, 2024 8:00:00 AM

The culture around feature flagging is something important to myself and the team, but if you are starting on the journey it can be hard to get...

[feature management](https://blog.arkahna.io/tag/feature-management) [featureboard](https://blog.arkahna.io/tag/featureboard) 

[Read More](https://blog.arkahna.io/building-a-feature-flagging-culture)

[![Simplifying Feature Management at DDD Adelaide](https://blog.arkahna.io/hubfs/blog-images/1732408553051.jpg)](https://blog.arkahna.io/simplifying-feature-management-at-ddd-adelaide)

#### [Simplifying Feature Management at DDD Adelaide](https://blog.arkahna.io/simplifying-feature-management-at-ddd-adelaide)

![Picture of Lars Klint](https://blog.arkahna.io/hs-fs/hubfs/profile-pictures/DSCF5609_resized.jpg?width=30&name=DSCF5609_resized.jpg) [Lars Klint](https://blog.arkahna.io/author/lars-klint) : Nov 29, 2024 4:52:23 PM

I had an absolute blast attending DDD Adelaide recently! It's always great to be part of a community where developers come together to share ideas,...

[feature management](https://blog.arkahna.io/tag/feature-management) [featureboard](https://blog.arkahna.io/tag/featureboard) 

[Read More](https://blog.arkahna.io/simplifying-feature-management-at-ddd-adelaide)

[![Audiences over Attributes - A Feature Flagging Story](https://blog.arkahna.io/hubfs/blog-images/image-20240226-061236.png)](https://blog.arkahna.io/audiences-over-attributes-a-feature-flagging-story)

#### [Audiences over Attributes - A Feature Flagging Story](https://blog.arkahna.io/audiences-over-attributes-a-feature-flagging-story)

[Jake Ginnivan](https://blog.arkahna.io/author/jake-ginnivan) : Mar 11, 2024 8:00:00 AM

During the initial planning for FeatureBoard we wanted to do things differently after finding it was harder than it should have been to adopt a ...

[feature management](https://blog.arkahna.io/tag/feature-management) [featureboard](https://blog.arkahna.io/tag/featureboard) 

[Read More](https://blog.arkahna.io/audiences-over-attributes-a-feature-flagging-story)

[![arkahna-brand-word-white](https://blog.arkahna.io/hubfs/arkahna-brand-word-white.png)](https://www.arkahna.io)

- [Privacy Policy](https://arkahna.io/privacy)
- [Terms of Sale](https://arkahna.io/terms)

© 2026 Arkahna Pty Ltd

[Facebook](https://www.facebook.com/arkahna)[X](https://twitter.com/ArkahnaAU)[Linkedin](https://www.linkedin.com/company/arkahna) [GitHub](https://github.com/arkahna)

We acknowledge the Traditional Custodians of the lands we live and work on, the Aboriginal and Torres Strait Islander peoples of Australia, and the Māori peoples of Aotearoa New Zealand.  We pay our respects to Elders past and present.

Return to top

```json
{
  "@context" : "https://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Matthew Nixon",
    "url" : "https://blog.arkahna.io/author/matthew-nixon"
  },
  "dateModified" : "2024-01-15T09:36:02.982Z",
  "datePublished" : "2024-01-12T02:36:14.000Z",
  "headline" : "Constructing a Resilient FeatureBoard Architecture",
  "image" : [ "https://blog.arkahna.io/hubfs/DALL%C2%B7E%20architecture%20diagram.png" ],
  "mainEntityOfPage" : {
    "@id" : "https://blog.arkahna.io/constructing-a-resilient-featureboard-architecture",
    "@type" : "WebPage"
  },
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "url" : "https://blog.arkahna.io/hubfs/Arkahna_Brandmark.png"
    },
    "name" : "Arkahna Pty Ltd"
  }
}
```