今天来介绍这几年在云上比较流行的event driven,也就是事件驱动的架构,用一个很简单的sample来实际看下事件驱动的架构到底是个啥
事件驱动的架构由生成事件流的事件生成者和侦听事件的事件使用者组成,它的特点是事件可几乎实时发送,因此使用者可在事件发生时需要立即做出响应。 生成者脱离使用者,即生成者不知道哪个使用者正在倾听。 使用者之间也能彼此脱离,且每个使用者都能看到所有事件。 这与使用者竞争模式不同,在此模式中,使用者从队列中拉取消息,且消息仅处理一次(假设没有错误)。
这种架构在IOT等系统中是非常常见的,但除了IOT之外,在Azure中很多其他场景也可以用到这样的架构,今天举的例子里主要用到了Azure EventGrid以及Azure Function,对应的场景主要还是解决云上的一些类似compliance问题,比如如果我们需要把云上的事件日志保存到数据库里做归档,或者需要根据云上的事件日志做一些对应的处理等,都可以用到下边的架构,这种架构的通用性还是比较强的。
今天这个举的这个例子,最终实现的目的就是把云上产生的各种日志,包括activity log等通过function最终写入到数据库里。每次云上产生log之后,EventGrid会订阅这些event,我们可以订阅很多种类型的event,但是我们这里只订阅subscription级别的activity log来做个测试,下游的function会通过eventgrid trigger来触发function,最终在function里对这些事件进行处理,通过Azure SQL的output binding来把数据最终写到数据库里
EventGrid是啥这里就不过多的介绍了,简单理解就是一个消息队列系统,其实几年之前就对这个服务做过介绍,架构其实和今天介绍的这个场景也颇有些类似,有兴趣的可以再翻翻
使用Function和eventgrid实现storage account log的自动分析和转换
这个案例里我们需要用到的服务主要包括以下几个
- Azure EventGrid system topic
- Azure EventGrid event subscription
- Azure Function
- Azure SQL
首先先把EventGrid topic部署出来,topic决定了我们要订阅什么类型的事件,这里我们主要用到的是subscription的activity log
$sub_id= '/subscriptions/xxxx-xxxxx-xxxx-xxxx'
az eventgrid system-topic create `
-g event `
--name subevent `
--location global `
--topic-type Microsoft.Resources.Subscriptions `
--source $sub_id
部署完成之后,其实已经可以看到有数据出来了
接下来准备把下游的function app先部署出来,这样才可以把eventgrid和function link在一起
$AZURE_STORAGE_ACCOUNT='functionsakj'
$functionAppName='eventfunction2024'
az storage account create --name $AZURE_STORAGE_ACCOUNT `
--resource-group Event `
--location eastasia
az functionapp create `
--name $functionAppName `
--storage-account $AZURE_STORAGE_ACCOUNT `
--consumption-plan-location eastasia `
--resource-group Event `
--os-type Linux `
--runtime python `
--runtime-version '3.11' `
--functions-version 4
function app部署好之后,还要把function部署出来,因为最终是function和eventgrid link起来,而不是function app,function部署主要会用到VSCODE,这里我们要创建一个eventgrid trigger的function,这里function中的代码我们可以先用默认生成的,之后再替换成实际的代码,这个过程不多赘述
function部署完成
接下来就可以创建event subscription了,可以看到这里的endpoint指定的其实就是我们上边创建的function的id。
$function_id=az functionapp function show -g event -n $functionAppName --function-name EventGridTrigger --query id -o tsv
az eventgrid system-topic event-subscription create -n event `
-g event `
--system-topic-name subevent `
--endpoint $function_id `
--endpoint-type azurefunction `
--enable-advanced-filtering-on-arrays true
在这之后,我们的event和function相当于就连接在一起了,云上生成的事件会通过evengrid最终转到function那里进行处理,可以看到配置好了之后,function已经在被trigger了
这篇里我们部署的实际上是架构图中的左边部分,下篇中再来看从function如何把数据写入到Azure SQL