Я обнаружил, что есть конструктор DeviceClient, который позволяет установить AmqpConnectionPoolSettings.

зрабатываем службу .Net Core, которая будет размещена в Azure Service Fabric. Эта служба SF должна взаимодействовать с 10 000 устройств, зарегистрированных в концентраторе IoT Azure, через конечные точки SSL TLS AMQP 1.0. Каждое устройство IoT Hub имеет свои собственные маркеры безопасности и строку подключения, предоставляемые службой IoT Hub.

Для нашего сценария нам необходимо прослушать все сообщения «облако-на-устройства», поступающие от 10 000 экземпляров устройств IoT Hub, и «направить» их в центральную тему служебной шины, которую прослушивают фактические «шлюзы» в поле. Поэтому в основном мы хотим пересылать сообщения из 10 000 очередей служебной шины в одну центральную очередь.

Каков наилучший подход для обработки этих 10 000 составителей AMQP из SF Service? Есть ли способ, которым мы можем повторно использовать соединения, сеансы или ссылки AMQP, чтобы кэшировать / делиться ресурсами? И как мы можем динамически распределить нагрузку по обслуживанию соединений на 5 узлов в кластере SF?

Мы оцениваем эти пакеты Nuget для реализации:Microsoft.Azure.ServiceBus AMQPNetLite Microsoft.Azure.Devices.Client

Мы делаем несколько тестов, используяMicrosoft.Azure.Devices.Client lib, см. упрощенный пример кода ниже:

using System;
using System.Fabric;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.Devices.Client;
using Microsoft.ServiceFabric.Services.Runtime;

namespace ID.Monitoring.MonServer.ServiceFabric.ServiceBus
{
    /// <summary>
    /// An instance of this class is created for each service instance by the Service Fabric runtime.
    /// </summary>
    internal sealed class ServiceBus : StatelessService
    {
        private readonly DeviceClient _deviceClient;
        private ConnectionStatus _status;

        public ServiceBus(StatelessServiceContext context)
            : base(context)
        {
            _deviceClient = DeviceClient.CreateFromConnectionString("HostName=id-monitoring-dev.azure-devices.net;DeviceId=100;SharedAccessSignature=SharedAccessSignature sr=id-monitoring-dev.azure-devices.net%2Fdevices%2F100&sig={token}&se=1553265888", TransportType.Amqp_Tcp_Only);
        }

        /// <summary>
        /// This is the main entry point for your service instance.
        /// </summary>
        /// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
        protected override async Task RunAsync(CancellationToken cancellationToken)
        {
            _deviceClient.SetConnectionStatusChangesHandler(ConnectionStatusChangeHandler);

            while (true)
            {
                if (_status != ConnectionStatus.Connected)
                {
                    await _deviceClient.OpenAsync();
                }
                var receivedMessage = await _deviceClient.ReceiveAsync(TimeSpan.FromSeconds(10)).ConfigureAwait(false);

                if (receivedMessage != null)
                {
                    var messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes());
                    //TODO: handle incoming message and publish to common 
                    await _deviceClient.CompleteAsync(receivedMessage).ConfigureAwait(false);
                }
            }
        }

        private void ConnectionStatusChangeHandler(ConnectionStatus status, ConnectionStatusChangeReason reason)
        {
            _status = status;
        }
    }
}

Вопрос: хорошо ли это масштабируется до 10 000 экземпляров Service Fabric Service? Или есть более эффективные способы поддержки такого количества списков сервисных шин AMQP из среды Service Fabric Service? Можно ли как-нибудь применить мультиплексирование AMQP-соединений?

Ответы на вопрос(3)

Ваш ответ на вопрос