【问题标题】:Filter Duplicate Messages IoT Device过滤重复消息物联网设备
【发布时间】:2021-12-29 19:44:05
【问题描述】:

我正在开发一个控制台应用程序,该程序从 Azure IoT 设备接收消息,并使用计时器每两秒接收一次消息。收到消息后,设备会发出呼叫以完成消息。我遇到的问题是,在设备再次收到消息之前,消息在 Azure 中没有完成,这导致消息被重新处理。我试图过滤传入的消息,当它是多次传入的相同消息时,但无论它们是重复消息还是新消息,这些消息都以相同的消息 ID 传入。我无权控制传入消息的消息 id 字段并使其唯一,但这可以解决问题。序列号对于传入的每条消息都是唯一的,无论它是否重复,因此我也不能将其用作过滤器。有没有办法在没有消息 id 字段的情况下过滤消息以查看它是否是重复的?

//Within Program.cs > Main():

_timer = new Timer(Operations, null, 0, _timerInterval); //_timerInterval is set to 2000


//Within Initialize class used to setup device client:

//Fully qualified namespace for DeviceClient:
//Microsoft.Azure.Devices.Client.DeviceClient

string connectionString = "code removed for example";

var deviceClient = DeviceClient.CreateFromConnectionString(connectionString);


//Within Operations class:

var message = await deviceClient.ReceiveAsync();

if (message != null && !string.IsNullOrEmpty(message?.MessageId))
{
    //Filtering message based on MessageId
    if (_memoryCache.Get(message.MessageId) == null)
    {
        _memoryCache.Set(message.MessageId, message.MessageId, DateTimeOffset.UtcNow.AddMinutes(10));

        await deviceClient.CompleteAsync(message);

        //Processing message
        await ProcessMessage(message);
    }
    else
    {
        await deviceClient.RejectAsync(message);
    }
}

【问题讨论】:

  • 您能否澄清一下,这个物联网设备是您开发的,还是现成的产品?物联网设备应负责在每条消息上显式设置唯一 ID,以便您可以处理此类场景。您是否设置了断点并查看了运行时提供的所有属性?它可以在 message.Properties 字典中以自定义名称提供
  • 您好 Andrew,这是一个 Microsoft Azure IoT Hub 设备。看起来可以设置消息 ID,但由于消息不是来自该程序,因此我无法在此处设置并使其唯一。我设置了一个断点,并尝试过滤任何内置消息属性以及 Message.Properties 字典,但在这两个地方都没有任何东西可以作为唯一标识符。
  • @Developer 您认为什么是重复消息?你怎么知道一条消息是重复的?
  • 重复消息是指具有与另一条相同的消息 ID、属性和内容的消息。我遇到的问题是不同的消息(不是重复的)可以具有与其他消息相同的内容、属性和消息 ID,从而消除了任何会使它们变得独特的东西。

标签: c# filter async-await message azure-iot-hub


【解决方案1】:

您可以使用Microsoft.Azure.Devices.Client.Message 包来检索设备客户端消息值。

在接收消息时使用 IOT 显式唯一 ID 来检查重复项。

按照以下代码检查重复值

List<string> FinalResponse = new List<string>();

Microsoft.Azure.Devices.Client.Message Response = await deviceClient.ReceiveAsync(TimeSpan.FromSeconds(10));
if (Response == null)
{
    await Task.Delay(10).ConfigureAwait(false);
    continue;
}

 //here you can use the explicit properties like message id or correlation Id 
Trace.WriteLine(Response.MessageId.ToString());
await this.deviceClient.CompleteAsync(Response);
var content = Encoding.UTF8.GetString(Response.GetBytes());
FinalResponse.Add(content);

您可以使用以上一个或使用以下条件

创建一个List添加从设备获取的所有值到列表中

添加条件以忽略如果在插入列表时出现任何重复

然后将不重复的值发送到 Azure。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多