Skip to main content

Posts

Showing posts from 2018

Azure Table Storage Batch Insert Within Operations Limit

When working with Azure Table Storage and needing to bulk insert a number of records, it's more efficient and reliable to do so by inserting a batch of records in one step, rather than one at a time.On a recent project we've been using table storage as a location to record the log for an import operation migrating information from one content management system into another. As each field was imported a couple of log lines of information were recorded - which were useful for auditing and debugging.Rather than inserting each log line as it was generated, we've batched them up, and then loaded them into table storage in the finally part of a try/catch that sits around the import logic. In this way, we store all the log information in one go.For a few imports though, we found this error being recorded in the application logs:Error processing message, message: An error has occurred. Exception message: The maximum number of operations allowed in one batch has been exceeded. Type…

Pluralsight Course: Azure Custom Vision Service

Over the past few months I've been working on authoring a first course for Pluralsight on the topic of the Custom Vision Service, part of the Cognitive Services suite provided by Microsoft and hosted on Azure.It was released a couple of days ago, and those with subscriptions or a free trial, can access it here:

Streaming mp3s from Azure blob storage gotcha

Have been wrestling with an issue one and off for a few weeks where have found mp3 files that previously played correctly in a web browser were having some issues relating to streaming. There's an example here. What I found - hopefully resolved now if you try the link - was that the audio would play, but the play bar that updates the position on the track wouldn't move, nor could the user navigate to parts of the audio to review it.We're using jplayer and have the mp3 files hosted in Azure blob storage. All had worked fine for several years, but recently could see this issue on Chrome, even though they still played as expected in Edge. So must have been related to a relatively recent Chrome update.The resolution though turned out to be a setting on the blob storage account, that I was led to via this Stackoverflow answer, that indicated setting the DefaultServiceVersion to an appropriate value might resolve it. And sure enough, when querying the current value I found …

Refactoring an interface to facilitate unit testing

Short post to follow, generalising something I've just done in an active project that seems to have general relevance. I had an interface and class like this, that wasn't easy to put under a unit test. interface ISomething { string GetValue(); string GetComplicatedConvertedValue(); } class MySomething : ISomething { string GetValue() { // Get value from something that's a simple one-liner call but not easy to mock or stub (in my case, Sitecore settings) ... } string GetComplicatedConvertedValue() { var rawValue = GetValue(); // Do some processing on the raw value that ideally we'd like under unit test, and return it ... } } One answer I realised is that, as the main value for testing this class is in the second method - retrieving the raw value is hard to test, but little value as it's a one liner into platform functionality - I can just remove that from the interface, and ins…

Tackling Common Concerns with Azure Function Patterns

I've recently had (or perhaps am about to have if you have found this early) the pleasure of talking at the Intelligent Cloud Conference in Copenhagen, in May 2018, on the topic of Tackling Common Concerns with Azure Function PatternsI've collated here a few links to resources discussed in my session.First, find a copy of the slides here (in pptx, so you may find fonts a bit off without our company one), or, perhaps better, as a PDF here.Then links to GitHub repos containing the full implementations of the patterns discussed in the talk, and from where the code samples presented are drawn.Azure functions demosQueue based load levelling demoSome tools mentioned in the talk:Azure storage emulatorAzure storage explorerLastly, the Azure functions documentation.

Verification of Sitecore Helix Architecture via a Fitness Function

Recently I've been reading - and recommend - the book Building Evolutionary Architectures by by Neal Ford,‎ Rebecca Parsons and Patrick Kua, where they discuss the concept of a fitness function. The idea here is that, as well as implementing the business requirements, a solution will also need to address certain non-functional concerns, such as security, performance, reliability and maintainability. Some of these can be measured or validated, and therefore tested, and ideally, tested in an automated way.Within a Sitecore project I'm working on, we are adhering to the Helix principles that in part addresses the organisation of projects with a Visual Studio solution. You end up with many individual projects, each within a layer - foundation, feature and project.The foundation layer is considered the highest level and most stable. Projects within this layer may have dependencies on each other, but not on any at the lower levels.Feature layer projects are intended to be cohesi…

Return JSON from Sitecore rendering controller

As well as displaying the appropriate HTML and content, a Sitecore rendering controller can also be used to handle to form posts. As such you can have a single controller responsible for rendering the mark-up of a form and handling the POST request that's triggered when the form is submitted.With this setup, I wanted to add some progressive enhancement and use the same form processing logic to handle an AJAX request. Using JavaScript we could hijack the form submission and make an AJAX request using the Fetch API. In the controller action method we can detect that an AJAX request is being made, and if so return a small JSON response, instead of the standard redirect back to the page to display a confirmation message.This is quite a common pattern with ASP.Net MVC, making use of the Request.IsAjaxRequest() method available in the controller.(As a quick aside, in order to use this method in an AJAX request triggered via the Fetch API, it's necessary to add a header that'…

Queue based load levelling using Azure Functions

On a current project I've been looking to employ a cloud design pattern known as queue based load levelling, and to implement it using Azure storage components and functions.
The Queue based load levelling pattern The pattern is useful in a range of situations where there's a need for timely and reliable integration between different software systems. In short, the pattern utilises a queue service as a buffer for messages from one system to the other, allowing them to be passed to the destination system for processing in a controlled manner, and at a rate that won’t overwhelm available resources.

It can be adopted where one software system must send messages to another but for various reasons we want to avoid a direct connection between the two. One good reason we might want to do this is simply to reduce coupling – the two systems will need to agree on a message format, but ideally we don’t want to tie them to each other’s implementation details any further than that.

We may…