【问题标题】:How to get PartitionId in event hub triggered Azure function?如何在事件中心触发 Azure 函数中获取 PartitionId?
【发布时间】:2019-04-08 14:44:06
【问题描述】:

我有一个由事件中心触发的 Azure 函数。我在 host.json 中将函数应用配置为 MaxBatchSize 为 32。我的事件中心有 6 个分区,我不希望一个事件被处理两次。

所以,我需要分区 ID 和序列号来唯一标识事件。我想在我的数据库中保存 PartitionID 和 SequenceNumber 作为主键。我的函数是在 EventData 数组的输入中触发的。对数组进行迭代,我可以获得每条消息的 SequenceNumber,但我不知道如何获取每个 PartitionID。我试图在输入参数中包含 PartitionContext 类型的参数,但它不起作用。

这是我的代码:

[FunctionName("EventHubTriggeredFunction")]
public static void Run([EventHubTrigger("events", Connection = "EventHubConnection")]EventData[] eventHubMessages, TraceWriter log)
{
    foreach (var message in eventHubMessages)
    {
        using (Stream stream = message.GetBodyStream())
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                try
                {
                    //... do something

                    //SequenceNumber: message.SequenceNumber
                    Save(reader.ReadToEnd(), message);

                    //... do something else
                }
            }
        }
 }

如何获取每条已处理消息的 PartitionID?

【问题讨论】:

  • 是什么让您认为您的消息被处理了两次?正常行为是消息被处理一次。
  • @PeterBons 知道了。我认为可以多次处理一条消息,直到他到期(在我的情况下为 1 天)。我是事件中心的初学者。谢谢你的澄清。
  • 那一天(我们正在谈论保留,是吗?)是保留消息的最短天数。在现实世界中,我看到他们在那里坐了几个星期,甚至几个月
  • 您可以处理较旧的消息,但需要一些(手动)步骤,但这不是默认行为。

标签: c# azure-functions azure-eventhub


【解决方案1】:

定义 EventHub 触发器to include Event Metadata。然后在上下文对象上使用receiverRuntimeInfo

PartitionContext.RuntimeInfo.PartitionId

【讨论】:

  • 我已经尝试过这个解决方案,但是我为参数使用了不同的名称(我只使用了PartitionContext context 而不是PartitionContext PartitionContext)。文档没有清楚解释的是参数必须具有属性的确切名称。还是谢谢你
  • 谢谢!顺便说一句,分区 id 在partitionContext.PartitionId 下也可用。在此处查看完整代码:gist.github.com/felipecruz91/…
猜你喜欢
  • 2017-10-07
  • 2022-10-06
  • 2022-11-04
  • 1970-01-01
  • 2023-03-05
  • 2023-02-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多