The AutotuneWeb system described in Part 1 is made up of 4 services in Microsoft Azure working together as illustrated below:
The App Service runs the website that users access. Written as an ASP.NET MVC application, the user enters their Nightscout URL and the application:
- Extracts the profile information, including the insulin:carb ratio, insulin sensitivity factor and basal rates
- Converts that profile information to the format expected by Autotune
- Displays the converted profile and the command line required to run it to the user
At this point we’ve covered the initial requirements to simplify access to Autotune. The remaining step is to actually run Autotune automatically and email the results back. To handle this we need a few more services:
The SQL Database stores details of each Autotune job that is requested, including a unique identifier and the email address to send the results back to.
The Storage Account holds the Autotune-format profile information and the results produced by Autotune.
The Batch Account processes Autotune using the profile stored in the Storage Account, places the results in the same Storage Account.
When Autotune has finished running, the App Service is notified by the Batch job. The MVC application then retrieves the Autotune results from the Storage Account and reformats it into a more easily-readable format using the same Razor engine used by the MVC views. The email address to send it to is retrieved from the SQL Database, and the email is finally sent using SendGrid.
Because Autotune is run using Azure Batch, the service can scale quickly based on the amount of jobs that users are requesting at any one time. An initial version that used the single VM I had set up originally to run only my own Autotune commands was quickly overwhelmed when more than 2 or 3 jobs were queued at once. By switching to Azure Batch I eliminated this problem and also reduced cost, as I could use low priority VMs for 20% of the cost of a regular VM. The scaling is handled automatically by a formula on the Batch Account pool that increases the number of VMs when there are more jobs waiting to run and removes VMs all the way down to zero when there is nothing waiting.
If you have a Nightscout site that you want to run Autotune against, you’re welcome to use AutotuneWeb to do it for you right now.
All the code for AutotuneWeb is available on GitHub if you want to run everything yourself or just see more detail about how any of it works. PRs welcome!
I used a SQL database originally because that’s the technology I’m most familiar with. However, it’s probably overkill for what is required by this application and could be more efficiently replaced by a Table in the Storage Account. This is my first “cloud-native” application, so please let me know if there’s anything more I could do to make it more “cloudy”!