【问题标题】:Azure Service Bus/Service Fabric message not being removed from queue未从队列中删除 Azure 服务总线/Service Fabric 消息
【发布时间】:2017-01-16 06:30:36
【问题描述】:

我正在将计算引擎从 Azure 辅助角色转移到 Azure Service Fabric。它通过侦听服务总线上的消息来工作,然后根据消息内容进行处理。

目前,计算工作正常,但如果计算时间超过一分钟左右,则消息在完成后不会从队列中删除。在工作者角色中,我们通过增加“AutoRenewTimeout”解决了这个问题。

var options = new OnMessageOptions { AutoComplete = true, AutoRenewTimeout = TimeSpan.FromMinutes(3) };
        _queueClient.OnMessage(OnMessage, options);

但是,使用 "ServiceFabric.ServiceBus" nuget 包,我无法确定您将在哪里设置它。我使用demo project 作为参考来设置实际运行计算的无状态服务。下面是对无状态服务初始化的 CalculateService.cs 的摘录。

internal sealed class CalculateService : StatelessService
{
    public CalculateService(StatelessServiceContext context)
        : base(context)
    { }

    /// <summary>
    /// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests.
    /// </summary>
    /// <returns>A collection of listeners.</returns>
    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        string serviceBusQueueName = CloudConfigurationManager.GetSetting("QueueName");
        yield return new ServiceInstanceListener(context => new ServiceBusQueueCommunicationListener(new Handler(this), context, serviceBusQueueName), "StatelessService-ServiceBusQueueListener");
    }
}


internal sealed class Handler : AutoCompleteServiceBusMessageReceiver
{
    protected override Task ReceiveMessageImplAsync(BrokeredMessage message, CancellationToken cancellationToken)
    {
        ServiceEventSource.Current.ServiceMessage(_service, $"Handling queue message {message.MessageId}");
        var computeRole = new ExcelCompute();
        var rMessage = new RangeMessage();
        rMessage = message.GetBody<RangeMessage>();
        var result = computeRole.OnMessage(rMessage, message.MessageId); //returns true if the compute was successful (which it currently, always is)
        return Task.FromResult(result);
    }
 }

我确实尝试过使用&lt;BrokeredMessage&gt; message.Complete();,但这会引发消息锁定错误。

【问题讨论】:

    标签: c# azure azureservicebus azure-service-fabric azure-servicebus-queues


    【解决方案1】:
    1. 获取最新版本的软件包 (>= v3.5.0)。将CommunicationListener 上的属性“MessageLockRenewTimeSpan”设置为小于锁定持续时间的值。 (例如,锁定持续时间为 60 秒的 50 秒)这允许一些时钟偏差。注意:默认情况下该属性为空,表示不自动更新锁。

    此选项在处理花费的时间超过锁定持续时间允许的批处理时效果很好。

    1. 当处理时间超过锁定持续时间时,您可以使用BrokeredMessage.RenewLock 定期延长您的消息锁定。如果需要,您可以在单独的线程中执行此操作。 May be useful info

    当处理单个消息(批量大小为 1)所花费的时间超过锁定持续时间所允许的时间时,此选项效果很好。

    【讨论】:

    • 感谢 LoekD,我正在使用 message.RenewLock 的单独线程中订阅结束计算事件,直到事件被触发。但是,我们将非常感谢 AutoRenewTimeout 支持! :) 感谢您的帮助!
    • 我已经添加了支持,查看演示了解详细信息。请让我知道你的效果如何。
    • 很抱歉没有早点回复您。这确实完美地解决了我的问题。非常感谢您的帮助和支持。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多