Как Azure Service Bus Queue доставляет сообщения клиенту в режиме HTTP - PullRequest
0 голосов
/ 29 января 2019

Мы используем режим HTTP для очереди Azure Service Bus в нашем приложении.

ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https;

Но мы не уверены, как Azure Service Bus доставляет сообщения в режиме HTTP, если клиент Service Bus использует опрос, как часто дляопрос очереди Azure Service Bus.

Мы используем пакет:

Microsoft.ServiceBus;
Microsoft.ServiceBus.Messaging;

1 Ответ

0 голосов
/ 11 февраля 2019

У нас нет официальной документации по этому вопросу.Однако большинство клиентов служебной шины используют длительный опрос, что означает, что они открывают соединение с служебной шиной и оставляют его открытым, пока не получат данные.Если сообщение получено, клиент обрабатывает сообщение и открывает новое соединение.Если время соединения истекло, клиент откроет новое соединение после периода постепенного отключения. По сообщению группы разработчиков продукта , период ожидания установлен равным 30 секундам.

Вы можете использовать эту тестовую программу, чтобы увидеть, сколько времени занимает получение сообщения после его отправкиочередь.В настоящее время он настроен для запуска по одному сообщению за раз.При использовании пакетной обработки общая пропускная способность может быть намного выше, чем в этом примере.

На моем компьютере сообщение обычно извлекалось в течение 100 миллисекунд после помещения в очередь.Если я установлю для SleepTime больший интервал, то поиск займет немного больше времени, поэтому действует постепенное уменьшение.Если громкость низкая, получение сообщения может занять немного больше времени.

class Program
    {
        private static readonly string connectionString = "";
        private static readonly int sleepTime = 100;
       private static readonly int messageCount = 10;
        static void Main(string[] args)
        {
            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https;

            var client = QueueClient.CreateFromConnectionString(connectionString, "testqueue");
            client.PrefetchCount = 1;
            var timeCheck = DateTime.UtcNow;

            client.OnMessage((message) =>
            {
                var timing = (DateTime.UtcNow - message.EnqueuedTimeUtc).TotalMilliseconds;
                Console.WriteLine($"{message.GetBody<string>()}: {timing} milliseconds between between send and receipt.");
            });

            for (int i = 0; i < messageCount; i++)
            {
                client.Send(new BrokeredMessage($"Message {i}"));
                Console.WriteLine($"Message {i} sent");
                Thread.Sleep(sleepTime);
            }

            Console.WriteLine("Test Complete");

            Console.ReadLine();
        }
    }
...