事件中心邮件分发

时间:2017-07-31 14:45:25

标签: c# azureservicebus azure-eventhub azure-iot-hub event-processor-host

我们正在使用IoT Hub来提取设备数据。我们目前正在使用10个分区来处理消息。因此,运行5个工作程序将使每个实例处理2个分区。

我们发现,如果设备连接并卸载,则允许向集线器发送500条消息,即使其他消息没有做任何工作,所有这些消息也只会从一个上下文分区中传出。

是设计使用路由/端点实现此目的的系统的唯一选择吗?

我们在低级别设备上使用MQTT,因此无法短期更改设备固件,但可能是长期的。

我会诚实地说,我认为它以最少的顺序输入信息,即使循环也会更好。我们很可能需要将消息提供到队列中并从那里处理它们以实现更好的扩展。目前创建多个线程来处理每个分区及其MUUUCH的每个IEnumerable<EventData> messages更好的谢天谢地。然而,瓶颈仍将以某种形式存在,直到我们转向实施进一步的队列并在那里进行扩展。

更新 - 添加一些示例代码,显示我在做什么 通过多个任务处理每批消息,我们现在可以提高10倍的性能。我将在下一个版本中重构代码,但是现在这很有用。

    async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
    {
       await ProcessEventsBulk(context, messages);
    }

    async Task ProcessEventsBulk(PartitionContext context, IEnumerable<EventData> messages)
    {
        List<Task> TaskList = new List<Task>();
        foreach (EventData message in messages)
        {
            var LastTask = Task.Run(() => GoBoy(context, message));
            TaskList.Add(LastTask);
        }
        await Task.WhenAll(TaskList);
    }

    async Task GoBoy(PartitionContext context, EventData message)
    {
        using (var db = new AppDbContext(_dbContextConnectionString))
        {
            await ProcessEvent(message, context.Lease.PartitionId, new CoreManagerContainer(db), db);
            await db.SaveChangesAsync();
        }
    }

Process Event将执行以下操作:

  • 解码数据包
  • 通过NLOG登录Azure表存储
  • 更新SQL中的值(特别是设备表)
  • 将消息插入DocumentDB
  • 将消息转发到2个队列
  • 回应单位

我知道我们可以将这些分成不同的工作人员,但我喜欢它的实时&#34;并且更安全,因为在我们确认之前,该单位不会清除该消息。

我创建了一个带有一些早期代码的分支,我在ACK之前批量插入DocDB。没有看到一个重大的改进,但应该帮助我假设的RUs。

0 个答案:

没有答案