2

在这方面,我很难从 Google 那里获得好评。我有一个 Web 应用程序,它使用 QueueClient 来在用户创建记录时对消息进行排队。我想要的是一种“开枪即忘,但在合理范围内信任”的方式。也就是说:

  • 我希望能够向总线发送消息并立即返回(因此用户不必等待
  • 我希望消息在本地汇集(缓冲?批处理?),以便系统在给定的时间段内一次发送 1、5、50 个。所以“当缓冲区大于 10 或 5 秒时发送
  • 缓冲区被分页到磁盘,这样如果系统重新启动或其他什么,它将尝试再次传递
  • 如果一切都失败了,哦,好吧。

我觉得我已经阅读了 QueueClient 中的缓冲/批处理,但现在我找不到任何关于它的信息。在 Web 应用程序中跨线程(请求)重用 QueueClients 是否安全?

有没有人有建议的模式或框架来实现上述目标?

目前,我在静态变量 (_client) 中缓存了一个共享的 QueueClient - 也许这是不正确的。我应该缓存和重用客户端还是工厂?

private static QueueClient GetQueueClient()
    {
        if (_client == null || _client.IsClosed)
        {
            // Create management credentials
            TokenProvider credentials = TokenProvider.CreateSharedSecretTokenProvider(
                Settings.ServiceBusIssuer, 
                Settings.ServiceBusIssuerKey);

            //create the client object for the queue
            MessagingFactory factory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", "Magic", string.Empty), credentials);

            string queueName = Crelate.Properties.Settings.Default.ServiceBusQueueName;
            QueueClient client = factory.CreateQueueClient(queueName);
            _client = client;

            return client;
        }

        return _client;
    }

然后我这样做,这绝对不是我想要的:

QueueClient client = GetQueueClient();
BrokeredMessage msg = new BrokeredMessage(opInfo);
msg.MessageId = "SomeUsefulId";
await Task.Factory.FromAsync(client.BeginSend, client.EndSend, msg, null);

感谢您的时间和想法。

当然,在写完这一切之后,我发现了以下内容:

http://msdn.microsoft.com/en-us/library/hh528527.aspx(其中提到了客户端批处理和重试逻辑)

4

0 回答 0