{"id":3517,"date":"2017-09-19T00:00:00","date_gmt":"2017-09-19T00:00:00","guid":{"rendered":"https:\/\/azure.microsoft.com\/blog\/processing-100-000-events-per-second-on-azure-functions"},"modified":"2025-06-25T06:42:09","modified_gmt":"2025-06-25T13:42:09","slug":"processing-100-000-events-per-second-on-azure-functions","status":"publish","type":"post","link":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/","title":{"rendered":"Processing 100,000 events per second on Azure Functions"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Customers often ask us about the scalability and throughput limits of the consumption plan for <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/functions\/\" target=\"_blank\" rel=\"noreferrer noopener\">Azure Functions<\/a>. The short answer is always \u201cit depends, what does your workload look like?\u201d. Today I want to talk about running high scale Event Hub\/IOT Hub workloads on Azure Functions and some key points to be aware of in order to maximize the performance you get from the platform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We partnered with the <a href=\"https:\/\/blogs.msdn.microsoft.com\/azurecat\/2017\/01\/05\/hello-world-welcome-to-azurecat-guidance\/\">Azure CAT team<\/a> to build a simple but representative event processing pipeline using Azure Functions and<a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/event-hubs\/\"> Event Hubs<\/a>, with telemetry going into <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/application-insights\/\">Application Insights<\/a>:<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.webp\" alt=\"graphical user interface, diagram\" class=\"wp-image-10992 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.webp\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The load generator, also running on Functions, writes batched messages to an ingestion event hub. These messages represent a set of readings from a given sensor. Functions picks up messages from the ingestion event hub, extracts individual readings from the batch, and writes them to the target event hub augmenting the messages with additional telemetry along the way. Two more functions within the same function app on the consumption plan each process the individual readings and send aggregated telemetry to App Insights.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"performance\">Performance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We ran the system under a target load of 100,000 events per second for a total of nine days. Over that time the system processed a total of 76 billion events. We measured the e2e latency of the pipeline, for example, the amount of time taken between writing the message to the ingestion hub and processing the message in the weather\/seismic function. Here are the results:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E2E Latency Percentiles<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>P50<\/strong><\/td><td><strong>P90<\/strong><\/td><td><strong>P95<\/strong><\/td><td><strong>P99<\/strong><\/td><td><strong>P99.9<\/strong><\/td><td><strong>P99.99<\/strong><\/td><td><strong>Max<\/strong><\/td><\/tr><tr><td>1,102.42ms<\/td><td>2,755.56ms<\/td><td>3,788.30ms<\/td><td>11,894.12ms<\/td><td>50,367.23ms<\/td><td>111,240.50ms<\/td><td>239,890.10ms<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In simple terms:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Half of the messages were processed within 1.2 seconds of being written to the ingestion hub<\/li>\n\n\n\n<li class=\"wp-block-list-item\">Nine out of ten messages were processed in under three seconds<\/li>\n\n\n\n<li class=\"wp-block-list-item\">999 out of 1000 messages were processed in under one minute<\/li>\n\n\n\n<li class=\"wp-block-list-item\">All messages were processed in under five minutes<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"monitoring\">Monitoring<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Azure Functions has two built in monitoring solutions, the WebJobs dashboard and Application Insights. Integration between Azure Functions and App Insights is currently in preview. The dashboard was designed with longer running jobs in mind and isn\u2019t optimized for scenarios where there are 10,000 plus function executions happening per second. Fortunately, App Insights is an incredibly robust telemetry system and we\u2019ve made sure that it works great with Azure Functions in high scale scenarios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Turning on App insights is really easy, just add your instrumentation key to your function app and Azure Functions will start sending data to App Insights automatically. For more info read the blog, \u201c<a href=\"https:\/\/blogs.msdn.microsoft.com\/appserviceteam\/2017\/04\/06\/azure-functions-application-insights\/\" target=\"_blank\" rel=\"noreferrer noopener\">Azure Functions now has direct integration with Application Insights<\/a>.\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Azure dashboard is highly customizable and App Insights has great support for pinning its visual components. It only took an hour or two to put together a pretty useful monitoring dashboard for this scenario:<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/eee53d00-4335-4036-9c98-15c7dd72d9c5.webp\" alt=\"graphical user interface, application, table, Excel\" class=\"wp-image-10994 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/eee53d00-4335-4036-9c98-15c7dd72d9c5.webp\"><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"configuration\">Configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We made some notable configuration choices to achieve this result:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">The functions process messages in batches<\/li>\n\n\n\n<li class=\"wp-block-list-item\">The WebJobs dashboard is disabled in favor of using Application Insights for monitoring and telemetry<\/li>\n\n\n\n<li class=\"wp-block-list-item\">Each event hub is configured with 100 partitions<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Data is sent to the event hubs without partition keys<\/li>\n\n\n\n<li class=\"wp-block-list-item\">Events are serialized using protocol buffers<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">See below for additional details on each of these.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"batching\">Batching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An event hub triggered function can be written to process single messages or batches of messages. The latter has much better performance characteristics. Lets take the splitter function as an example:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\npublic static async Task Run(\n\nEventData[] sensorEvent,\n\nPartitionContext partitionContext,\n\nIAsyncCollector outputWeatherData,\n\nIAsyncCollector outputSeismicData,\n\nTraceWriter log)\n\n\t\t{\n\n   foreach (var sensorData in sensorEvent)\n\n\t\t\t\t{\n\nSensorType sensorType = SensorType.Unknown;\n\n   try\n\n\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n   if (sensorData.Properties.ContainsKey(\"SensorType\"))\n\n\t\t\t\t\t\t\t\t{\n\nSystem.Enum.TryParse(sensorData.Properties[\"SensorType\"].ToString(), out sensorType);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait ProcessEvent(sensorData, sensorType, partitionContext, outputWeatherData, outputSeismicData);\n\n\t\t\t\t\t\t}\n\ncatch(Exception ex)\n\n\t\t\t\t\t\t{\n\ntelemetryHelper.PostException(ex, sensorData, partitionContext.Lease.PartitionId, sensorType.ToString());\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\n\t\t}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The main things to note about this code:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">An array of events are passed to the function in one execution<\/li>\n\n\n\n<li class=\"wp-block-list-item\">An exception handling block wraps the processing of each event<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The array based approach performs better primarily due to per function execution overhead. The system performs a number of actions when invoking your function and those actions will only happen once for an array of events rather than once per event. Please note, for JavaScript functions you\u2019ll need to explicitly set the cardinality property in your function.json to many in order to enable batching. You an find examples of&nbsp;<a href=\"https:\/\/github.com\/Azure\/azure-webjobs-sdk-templates\/blob\/df94e19484fea88fc2c68d9f032c9d18d860d5b5\/Functions.Templates\/Templates\/EventHubTrigger-JavaScript\/function.json\">enabling batching<\/a>&nbsp;on GitHub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This approach to exception handling is important if you want to ensure you don\u2019t lose or skip messages. Typically you\u2019ll write your exception handler so that it stores the event that failed for later processing and analysis. This is important because Azure Functions does not have any built in dead lettering for Event Hubs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"webjobs-dashboard\">WebJobs dashboard<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As mentioned above, because we were using App Insights for monitoring we disabled the dashboard. To do this simply go to your application setting and remove the AzureWebJobsDashboard setting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"partition-configuration\">Partition configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Azure Functions uses the EventProcessorHost provided in the Event Hubs SDK to process event hub messages. For more information see our documentation, \u201c<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/event-hubs\/event-hubs-programming-guide\" target=\"_blank\" rel=\"noreferrer noopener\">Programming guide for Azure Event Hubs<\/a>.\u201d The way EventProcessorHost works is that each VM running your app acquires leases to some of the partitions, allowing it to process messages on those partitions. This means that if your event hub has only two partitions, only two VMs can process messages at any given time i.e. the partition count puts an upper limit on the scalability of your function.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The basic and standard tiers for Event Hubs have a default limit of 32 partitions per event hub, but this limit can be increased if you contact&nbsp;<a href=\"https:\/\/portal.azure.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">billing support<\/a>. By setting the event hubs to have 100 partitions, each function was able to run on 100 VMs simultaneously. We can see this if we look at one minute of telemetry, counting the number of unique VMs that executed the weather function:<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/875b464a-0582-4168-920f-a8654c9275d7.webp\" alt=\"graphical user interface, text, application, email\" class=\"wp-image-10996 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/875b464a-0582-4168-920f-a8654c9275d7.webp\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">We can get an idea of how evenly the work was distributed over those 94 VMs with another simple query:<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/6be8d4fc-0265-467d-b5cc-52babc9d90b5.webp\" alt=\"text\" class=\"wp-image-10998 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/6be8d4fc-0265-467d-b5cc-52babc9d90b5.webp\"><\/figure>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/d50a9927-3e25-4ea5-ab33-85eaa0c03a5f.webp\" alt=\"chart, pie chart\" class=\"wp-image-11000 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/d50a9927-3e25-4ea5-ab33-85eaa0c03a5f.webp\"><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"partition-keys\">Partition keys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The event hubs programming guide has a\u00a0<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/event-hubs\/event-hubs-programming-guide\" target=\"_blank\" rel=\"noreferrer noopener\">good summary<\/a>\u00a0of partition keys and when you might want to use them. This scenario had no ordering or statefulness requirements so events were generated without partition keys. This increased the overall throughput and availability for the run.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"protocol-buffers\">Protocol buffers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you\u2019re writing and reading 100,000+ events a second, you want the serialization and deserialization of those events to be as efficient as possible, both from the perspective of time taken to do the serialization step and also size on the wire.\u00a0<a href=\"https:\/\/developers.google.com\/protocol-buffers\/\" target=\"_blank\" rel=\"noreferrer noopener\">Protocol buffers<\/a>\u00a0is a high performance serialization format that is easy to work with. Here\u2019s some example code deserializing and processing a batch of weather readings from an event:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nif (sensorType == SensorType.Weather)\n\n{\n\n  var batch = WeatherReadingBatch.Parser.ParseFrom(sensorData.GetBytes());\n\n  var messages = batch.SensorReadings\n\n.Select(reading => EnrichData(enqueuedTime, reading));\n\n  await WriteOutput(messages, sensorData.PartitionKey, outputWeatherData);\n\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">If you\u2019d like to see the .proto file used for this scenario see the\u00a0<a href=\"https:\/\/gist.github.com\/paulbatum\/c918e19cadb43fdfcce978d58d97d235\" target=\"_blank\" rel=\"noreferrer noopener\">Protocol Buffers example in GitHub<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cost\">Cost<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The total cost of running the function app and its dependencies for the nine day run was approximately $1200 USD. Here\u2019s what the cost per hour looks like for each service:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Service<\/strong><\/td><td><strong>Cost per Hour (USD)<\/strong><\/td><\/tr><tr><td>Functions<\/td><td>$2.71<\/td><\/tr><tr><td>Storage<\/td><td>$1.80<\/td><\/tr><tr><td>Application Insights<\/td><td>$1.03<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A few important points to note:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">This data does not include the cost of the load generator and Event Hubs as no effort was spent on optimizing these.<\/li>\n\n\n\n<li class=\"wp-block-list-item\">The Azure Storage cost is based on approximately 50 million transactions per hour. Almost all of these transactions are related to Event Hubs checkpointing.<\/li>\n\n\n\n<li class=\"wp-block-list-item\">The Application Insights cost is based on 450mb of data ingestion per hour.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">We can dive into function app cost in more detail by using the execution count and execution units data available via the Azure Monitor REST API. For more information please visit the<a href=\"https:\/\/stackoverflow.com\/questions\/41128329\/how-can-i-programmatically-access-azure-functions-usage-metrics\" target=\"_blank\" rel=\"noreferrer noopener\">&nbsp;Stack Overflow forum<\/a>. Querying for one hour of data, we get the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">Function Execution Count: 6,500,012<\/li>\n\n\n\n<li class=\"wp-block-list-item\">Function Execution Units: 90,305,037,184<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Note, the function execution units here are measured in mb-milliseconds. To convert these into gb-seconds, divide by 1024000. You can find&nbsp;<a href=\"https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/functions\/\" target=\"_blank\" rel=\"noreferrer noopener\">pricing details for functions<\/a>&nbsp;and a&nbsp;<a href=\"https:\/\/gist.github.com\/paulbatum\/2b16c5f92351ed1c59e3a2b8a727ca97\" target=\"_blank\" rel=\"noreferrer noopener\">simple program&nbsp;<\/a>I wrote in order to assist:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cost per hour = (6,500,012 executions * ( $0.20 \/ 1,000,000 )) + ((90,305,037,184 units \/ (1024 * 1000)) * $0.000016) = $2.71 USD<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"summary\">Summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The consumption plan for Azure Functions is capable of scaling your app to run on hundreds of VMs, enabling high performance scenarios without having to reserve and pay for huge amounts of compute capacity up front. To learn more about Azure Functions and building cloud applications on serverless technology, start on the<a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/functions\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00a0Functions product page<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","footnotes":"","msx_community_cta_settings":[]},"categories":[1467,1470,1485],"tags":[],"audience":[3055,3053,3056],"content-type":[1481],"product":[1536],"tech-community":[],"topic":[],"coauthors":[1032],"class_list":["post-3517","post","type-post","status-publish","format-standard","hentry","category-compute","category-containers","category-internet-of-things","audience-developers","audience-it-decision-makers","audience-it-implementors","content-type-thought-leadership","product-azure-functions","review-flag-1680286581-295","review-flag-1680286581-56","review-flag-1680286581-364","review-flag-1680286584-658","review-flag-1-1680286581-825","review-flag-2-1680286581-601","review-flag-3-1680286581-173","review-flag-6-1680286581-909","review-flag-9-1680286581-259","review-flag-alway-1680286580-106","review-flag-disabled","review-flag-iot-1680286585-835","review-flag-usd-1680286585-730","review-flag-vm-1680286585-143"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Processing 100,000 events per second on Azure Functions | Microsoft Azure Blog<\/title>\n<meta name=\"description\" content=\"Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Processing 100,000 events per second on Azure Functions | Microsoft Azure Blog\" \/>\n<meta property=\"og:description\" content=\"Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Azure Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/microsoftazure\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-19T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-25T13:42:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.png\" \/>\n<meta name=\"author\" content=\"Paul Batum\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@azure\" \/>\n<meta name=\"twitter:site\" content=\"@azure\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Batum\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\"},\"author\":[{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/paul-batum\/\",\"@type\":\"Person\",\"@name\":\"Paul Batum\"}],\"headline\":\"Processing 100,000 events per second on Azure Functions\",\"datePublished\":\"2017-09-19T00:00:00+00:00\",\"dateModified\":\"2025-06-25T13:42:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\"},\"wordCount\":1335,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.png\",\"articleSection\":[\"Compute\",\"Containers\",\"Internet of things\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\",\"name\":\"Processing 100,000 events per second on Azure Functions | Microsoft Azure Blog\",\"isPartOf\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.png\",\"datePublished\":\"2017-09-19T00:00:00+00:00\",\"dateModified\":\"2025-06-25T13:42:09+00:00\",\"description\":\"Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.\",\"breadcrumb\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.webp\",\"contentUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.webp\",\"width\":1022,\"height\":360,\"caption\":\"graphical user interface, diagram\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog home\",\"item\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Compute\",\"item\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/category\/compute\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Processing 100,000 events per second on Azure Functions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#website\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/\",\"name\":\"Microsoft Azure Blog\",\"description\":\"Get the latest Azure news, updates, and announcements from the Azure blog. From product updates to hot topics, hear from the Azure experts.\",\"publisher\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization\",\"name\":\"Microsoft Azure Blog\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp\",\"contentUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp\",\"width\":512,\"height\":512,\"caption\":\"Microsoft Azure Blog\"},\"image\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/microsoftazure\",\"https:\/\/x.com\/azure\",\"https:\/\/www.instagram.com\/microsoftdeveloper\/\",\"https:\/\/www.linkedin.com\/company\/16188386\",\"https:\/\/www.youtube.com\/user\/windowsazure\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/person\/c702e5edd662b328b49b7e1180cab117\",\"name\":\"shakir\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g7664e653ea371ce16eaf75e9fa8952c4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g\",\"caption\":\"shakir\"},\"sameAs\":[\"https:\/\/azure.microsoft.com\"],\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/shakir\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Processing 100,000 events per second on Azure Functions | Microsoft Azure Blog","description":"Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.","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:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/","og_locale":"en_US","og_type":"article","og_title":"Processing 100,000 events per second on Azure Functions | Microsoft Azure Blog","og_description":"Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.","og_url":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/","og_site_name":"Microsoft Azure Blog","article_publisher":"https:\/\/www.facebook.com\/microsoftazure","article_published_time":"2017-09-19T00:00:00+00:00","article_modified_time":"2025-06-25T13:42:09+00:00","og_image":[{"url":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.png","type":"","width":"","height":""}],"author":"Paul Batum","twitter_card":"summary_large_image","twitter_creator":"@azure","twitter_site":"@azure","twitter_misc":{"Written by":"Paul Batum","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#article","isPartOf":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/"},"author":[{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/paul-batum\/","@type":"Person","@name":"Paul Batum"}],"headline":"Processing 100,000 events per second on Azure Functions","datePublished":"2017-09-19T00:00:00+00:00","dateModified":"2025-06-25T13:42:09+00:00","mainEntityOfPage":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/"},"wordCount":1335,"commentCount":0,"publisher":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization"},"image":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.png","articleSection":["Compute","Containers","Internet of things"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/","name":"Processing 100,000 events per second on Azure Functions | Microsoft Azure Blog","isPartOf":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage"},"image":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.png","datePublished":"2017-09-19T00:00:00+00:00","dateModified":"2025-06-25T13:42:09+00:00","description":"Customers often ask us about the scalability and throughput limits of the consumption plan for Azure Functions. The short answer is always \u201cit depends, what does your workload look like?\u201d.","breadcrumb":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#primaryimage","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.webp","contentUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/09\/e919f9db-bc0f-48bf-b5b7-05765bf310f0.webp","width":1022,"height":360,"caption":"graphical user interface, diagram"},{"@type":"BreadcrumbList","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/processing-100-000-events-per-second-on-azure-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog home","item":"https:\/\/azure.microsoft.com\/en-us\/blog\/"},{"@type":"ListItem","position":2,"name":"Compute","item":"https:\/\/azure.microsoft.com\/en-us\/blog\/category\/compute\/"},{"@type":"ListItem","position":3,"name":"Processing 100,000 events per second on Azure Functions"}]},{"@type":"WebSite","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#website","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/","name":"Microsoft Azure Blog","description":"Get the latest Azure news, updates, and announcements from the Azure blog. From product updates to hot topics, hear from the Azure experts.","publisher":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/azure.microsoft.com\/en-us\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization","name":"Microsoft Azure Blog","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp","contentUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp","width":512,"height":512,"caption":"Microsoft Azure Blog"},"image":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/microsoftazure","https:\/\/x.com\/azure","https:\/\/www.instagram.com\/microsoftdeveloper\/","https:\/\/www.linkedin.com\/company\/16188386","https:\/\/www.youtube.com\/user\/windowsazure"]},{"@type":"Person","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/person\/c702e5edd662b328b49b7e1180cab117","name":"shakir","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g7664e653ea371ce16eaf75e9fa8952c4","url":"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g","caption":"shakir"},"sameAs":["https:\/\/azure.microsoft.com"],"url":"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/shakir\/"}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Azure Blog","distributor_original_site_url":"https:\/\/azure.microsoft.com\/en-us\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts\/3517","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/comments?post=3517"}],"version-history":[{"count":2,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts\/3517\/revisions"}],"predecessor-version":[{"id":43343,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts\/3517\/revisions\/43343"}],"wp:attachment":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/media?parent=3517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/categories?post=3517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/tags?post=3517"},{"taxonomy":"audience","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/audience?post=3517"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/content-type?post=3517"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/product?post=3517"},{"taxonomy":"tech-community","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/tech-community?post=3517"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/topic?post=3517"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/coauthors?post=3517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}