{"id":4020,"date":"2017-09-15T11:54:46","date_gmt":"2017-09-15T18:54:46","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4020"},"modified":"2025-06-13T20:57:01","modified_gmt":"2025-06-14T03:57:01","slug":"azure-functions-lazy-initialization-couchbase-server","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/","title":{"rendered":"Azure Functions and Lazy Initialization with Couchbase Server"},"content":{"rendered":"<div class=\"paragraph\">\n<p>Azure Functions are still new to me, and I\u2019m learning as I\u2019m going. I blogged about my foray into Azure Functions with Couchbase <a href=\"https:\/\/www.couchbase.com\/blog\/azure-functions-couchbase-server\/\">over a month ago<\/a>. Right after I posted that, I got some helpful feedback about the way I was instantiating a Couchbase cluster (and bucket).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>I had (wrongly) assumed that there was no way to save state between Azure Function calls. This is why I created a <code>GetCluster()<\/code> method that was called each time the function ran. But, initializing a Couchbase <code>Cluster<\/code> object is an expensive operation. The less often you instantiate it, the better.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>You can follow along with the updated <a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/080AzureFunctionsFollowUp\/src\/CouchbaseWithAzureFunctions\">source code for this blog post on Github<\/a>.<\/em><\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_static_state\">Static state<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>I had a hard time finding documentation on whether I could use a <code>static<\/code> object for reuse between function calls. I suppose I should have experimented, like <a href=\"https:\/\/markheath.net\/post\/sharing-state-between-azure-functions\">fellow Microsoft MVP Mark Heath<\/a> did. Instead, I <a href=\"https:\/\/stackoverflow.com\/questions\/46162151\/azure-functions-singleton-for-expensive-object\">posed the question to StackOverflow<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>In short: yes. A <code>Cluster<\/code>, instantiated and saved to a static member, can is reusable between function calls. According to Mark\u2019s post above, there\u2019s no guarantee how long this value will survive. But that\u2019s an expected trade-off that you make when going &#8220;serverless&#8221;.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_lazy_initializing_within_azure_functions\">Lazy initializing within Azure Functions<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Simply using a static member would work, but it\u2019s not thread-safe. There are a few ways to tackle that issue, but an easy way that\u2019s built right into the .NET framework is to use <a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/framework\/performance\/lazy-initialization\">Lazy Initialization<\/a> with <code>Lazy&lt;T&gt;<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/09\/08001-lazy-initialization-in-azure-functions.png\" alt=\"Lazy Initialization in Azure Functions\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>First, I removed the <code>GetBucket<\/code> and <code>GetCluster<\/code> methods. Next, I created a <code>Lazy&lt;IBucket&gt;<\/code> property to replace them.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">private static readonly Lazy&lt;IBucket&gt; Bucket = new Lazy&lt;IBucket&gt;(() =&gt;\r\n{\r\n    var uri = ConfigurationManager.AppSettings[\"couchbaseUri\"];\r\n    var bucketName = ConfigurationManager.AppSettings[\"couchbaseBucketName\"];\r\n    var bucketPassword = ConfigurationManager.AppSettings[\"couchbaseBucketPassword\"];\r\n    var cluster = new Cluster(new ClientConfiguration\r\n    {\r\n        Servers = new List&lt;Uri&gt; { new Uri(uri) }\r\n    });\r\n    return cluster.OpenBucket(bucketName, bucketPassword);\r\n});<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>I just made a single property for a bucket, since that\u2019s all I need for this example. But if you need to use the cluster, you can easily make that its own <code>Lazy<\/code> property. (Once you have a cluster, getting a bucket is a relatively cheap operation).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_using_a_lazy_property\">Using a Lazy property<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>When you instantiate a <code>Lazy&lt;T&gt;<\/code> object, you supply it with an initialization lambda. That lambda won\u2019t execute until the <code>Value<\/code> property is actually called for the first time.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var lazyObject = new Lazy&lt;string&gt;(() =&gt;\r\n{\r\n    \/\/ this code won't be called until 'lazyObject.Value' is referenced\r\n    \/\/ for the first time\r\n    return \"I'm lazy!\";\r\n});<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>For instance, notice the <code>Value<\/code> between <code>Bucket<\/code> and <code>GetAsync<\/code> in the updated version of my Azure Functions:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var doc = await Bucket.Value.GetAsync&lt;MyDocument&gt;(id);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>If that\u2019s the first time <code>Value<\/code> is used, the cluster will be initialized. Otherwise, it will use the already initialized cluster (try experimenting with a <code>Guid<\/code> instead of a <code>Bucket<\/code>).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_summary\">Summary<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>State can be saved between Azure Function calls by using a static member. Make sure that it\u2019s thread-safe (by using <code>Lazy&lt;T&gt;<\/code> or something like it). Don\u2019t make any assumptions about how long that object will be around.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Anything else I missed? Are you using Azure Functions with Couchbase? I would love to hear from you. Please leave a comment below or ping me on <a href=\"https:\/\/twitter.com\/mgroves\">Twitter @mgroves<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Azure Functions are still new to me, and I\u2019m learning as I\u2019m going. I blogged about my foray into Azure Functions with Couchbase over a month ago. Right after I posted that, I got some helpful feedback about the way [&hellip;]<\/p>\n","protected":false},"author":71,"featured_media":3934,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,10127,1816],"tags":[1245,1673,1772],"ppma_author":[8937],"class_list":["post-4020","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-c-sharp","category-couchbase-server","tag-cloud","tag-microsoft-azure","tag-visual-studio"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Lazy initializing within Azure Functions - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"A Couchbase cluster is an expensive object to create. You can lazily instantiate and share between Azure Functions calls.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Azure Functions and Lazy Initialization with Couchbase Server\" \/>\n<meta property=\"og:description\" content=\"A Couchbase cluster is an expensive object to create. You can lazily instantiate and share between Azure Functions calls.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-15T18:54:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:57:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"922\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Azure Functions and Lazy Initialization with Couchbase Server\",\"datePublished\":\"2017-09-15T18:54:46+00:00\",\"dateModified\":\"2025-06-14T03:57:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\"},\"wordCount\":453,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg\",\"keywords\":[\"cloud\",\"Microsoft Azure\",\"Visual Studio\"],\"articleSection\":[\".NET\",\"C#\",\"Couchbase Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\",\"name\":\"Lazy initializing within Azure Functions - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg\",\"datePublished\":\"2017-09-15T18:54:46+00:00\",\"dateModified\":\"2025-06-14T03:57:01+00:00\",\"description\":\"A Couchbase cluster is an expensive object to create. You can lazily instantiate and share between Azure Functions calls.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg\",\"width\":1920,\"height\":922,\"caption\":\"National Cloud Database Day\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Azure Functions and Lazy Initialization with Couchbase Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Lazy initializing within Azure Functions - The Couchbase Blog","description":"A Couchbase cluster is an expensive object to create. You can lazily instantiate and share between Azure Functions calls.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/","og_locale":"en_US","og_type":"article","og_title":"Azure Functions and Lazy Initialization with Couchbase Server","og_description":"A Couchbase cluster is an expensive object to create. You can lazily instantiate and share between Azure Functions calls.","og_url":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-09-15T18:54:46+00:00","article_modified_time":"2025-06-14T03:57:01+00:00","og_image":[{"width":1920,"height":922,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Azure Functions and Lazy Initialization with Couchbase Server","datePublished":"2017-09-15T18:54:46+00:00","dateModified":"2025-06-14T03:57:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/"},"wordCount":453,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg","keywords":["cloud","Microsoft Azure","Visual Studio"],"articleSection":[".NET","C#","Couchbase Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/","url":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/","name":"Lazy initializing within Azure Functions - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg","datePublished":"2017-09-15T18:54:46+00:00","dateModified":"2025-06-14T03:57:01+00:00","description":"A Couchbase cluster is an expensive object to create. You can lazily instantiate and share between Azure Functions calls.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/074-hero-Azure-Clouds.jpg","width":1920,"height":922,"caption":"National Cloud Database Day"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/azure-functions-lazy-initialization-couchbase-server\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Azure Functions and Lazy Initialization with Couchbase Server"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"Matthew D. Groves is a guy who loves to code.  It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything.  He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s.  He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community.  He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/4020","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=4020"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/4020\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/3934"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=4020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=4020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=4020"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=4020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}