通过事件中心传递事件

问题描述 投票:0回答:1

我正在将大量事件(每秒超过1000个)从多个传感器传递到单个事件中心。将数据从传感器传递到事件中心时,我无法访问传感器ID,因此我只能使用1个分区,因为事件排序至关重要。事件中心的输出是流分析,然后将数据保存到cosmosDB。

Event Hub(single partition) -> Stream Analytics -> CosmosDB

问题是随着请求数量的增加,延迟也随之增加。我当时正在考虑使用一个中间事件中心,可以在其中设置分区键。

Event Hub(multiple partition) -> Stream Analytics -> Event Hub with Partition Key -> Stream Analytics -> CosmosDB

我的担心是:

将在中间事件中心中维护事件顺序吗?

该体系结构是否有性能优势?

而且我还需要更新网站和移动设备中的UI。我是否使用cosmos DB更改提要或信号R作为流分析的输出?

所以我测试了系统每秒发送大约200个请求。我使用了azure函数将这些请求发送到事件中心。

功能指标:Request sent from azure function to event hub

注意:事件中心有20个分区,每个事件都带有一个分区键。

我使用了另一个Azure函数从事件中心读取数据。最初仅通过记录数据计数进行测试(不将数据保存到cosmosDB)。

注意:我使用maxBatchSize到1进行数据排序(我不确定是否需要这样做。如果我增加此批处理大小,我是否仍将保持数据排序?)]] >>

我可以看到该功能能够以与写入事件相同的速度从事件中心读取数据。

功能指标:Azure function reading the data

但是,一旦我添加了将这些数据保存到数据库的代码,性能就会明显下降。

注意:CosmosDB RU设置为15000 RU / s

功能指标:Function only getting around 20req/s

我相信我的代码有问题。我在这里使用的功能

 [FunctionName("ProcessStreamData")]
    public static async Task Run([EventHubTrigger("eventhub-name", Connection = "EventHubsConnection")] EventData[] podStreamData, [CosmosDB(
            databaseName: "dbname",
            collectionName: "containername",
            ConnectionStringSetting ="CosmosDBConnection")]
        IAsyncCollector<SensorData> PodStreamDataOut, ILogger log)
    {
        var exceptions = new List<Exception>();

        foreach (EventData eventData in podStreamData)
        {
            try
            {
                var messageBody = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
                var allData = JsonConvert.DeserializeObject<List<SensorData>>(messageBody);

     //I have data for different sensors in one eventdata so i'll need 
    //to loop around each of these data 
    //and create dynamic partitonkey ,ttl for cosmos 

                foreach (SensorData data in allData)
                {
                    data.partitionKey = $"{data.mac}-{DateTime.UtcNow:yyyy-MM}";
                    data.ttl = 60 * 60 * 60 * 24 * 60; //60 days
                    data.timestamp = DateTime.UtcNow;
                    await PodStreamDataOut.AddAsync(data);
                }
            }
            catch (Exception e)
            { 
                exceptions.Add(e);
            }
        }

我正在将大量事件(每秒超过1000个)从多个传感器传递到单个事件中心。在将数据从传感器传递到事件中心时,我无法访问传感器ID,因此我只能...

azure azure-cosmosdb azure-eventhub azure-stream-analytics
1个回答
0
投票

我假设您需要订购来自单个传感器的事件。

您可以使用Send event with publisher ID,然后来自单个传感器的事件将降落在同一分区中。

© www.soinside.com 2019 - 2024. All rights reserved.