RabbitMQ: когда узел не работает, CreateModel занимает больше времени, чем обычноC#

Место общения программистов C#
Ответить
Anonymous
 RabbitMQ: когда узел не работает, CreateModel занимает больше времени, чем обычно

Сообщение Anonymous »

У меня есть кластер RabbitMQ. У меня есть приложение, подключенное к кластеру, и оно работает нормально. Я не уверен, нормально ли такое поведение, но не думаю: когда узел не работает, публикация сообщения занимает больше времени, чем обычно (я говорю от 5 до 10 секунд).
У меня есть следующий код для подключения, чтобы создать канал. Имейте в виду, что это синглтон для всего приложения:

Код: Выделить всё

public class RabbitMQConnection : IDisposable
{
private readonly ConnectionFactory _connectionFactory;
private readonly object _lock;
private readonly IList _endpoints;
private bool _shouldClose = false;

private IConnection Connection { get; set; }

public RabbitMQConnection(IEnumerable hostList, string username, string password)
{
_endpoints = hostList.Select(s =>
{
var split = s.Split(':');
var hostname = split[0];
int port = -1;
if (split.Length > 1 && int.TryParse(split[1], out int parsedPort))
port = parsedPort;
return new AmqpTcpEndpoint(hostname, port);
}).ToList();
_connectionFactory = new ConnectionFactory
{
UserName = username,
Password = password,
AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds(5),
};

_lock = new object();
}

~RabbitMQConnection() => Dispose();

private void StartConnection()
{
if (_shouldClose)
return;

lock (_lock)
{
if (Connection?.IsOpen == true)
return;

if (Connection != null)
Connection.Dispose();

Connection = _connectionFactory.CreateConnection(_endpoints);
Connection.ConnectionShutdown += Connection_ConnectionShutdown;
}
}

private void Connection_ConnectionShutdown(object sender, ShutdownEventArgs e) => StartConnection();

public void Dispose()
{
_shouldClose = true;
lock (_lock)
{
if (Connection != null)
{
if (Connection.IsOpen)
Connection.Close();
Connection.Dispose();
Connection = null;
}
}
}

public IModel CreateChannel()
{
StartConnection();
return this.Connection.CreateModel();
}
}
Моя проблема, как уже говорилось, если один из узлов не работает, возврат строки this.Connection.CreateModel() занимает около 5 секунд. Что мне здесь не хватает?

Подробнее здесь: https://stackoverflow.com/questions/790 ... than-usual
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»