C# 总线启动失败时RabbitMQ通道泄漏
我对MassTransit有问题(使用MassTransit 3.5.7(通过Nuget)、RabbitMQ 3.6.10、Erlang 19.0) 看起来,当总线无法启动时,MassTransit没有清除RabbitMQ通道 这是我的测试程序C# 总线启动失败时RabbitMQ通道泄漏,c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,我对MassTransit有问题(使用MassTransit 3.5.7(通过Nuget)、RabbitMQ 3.6.10、Erlang 19.0) 看起来,当总线无法启动时,MassTransit没有清除RabbitMQ通道 这是我的测试程序 using System; using System.Threading; using MassTransit; namespace TestSubscriber { class Program { static void Ma
using System;
using System.Threading;
using MassTransit;
namespace TestSubscriber
{
class Program
{
static void Main()
{
IBusControl busControl = null;
var failCount = 0;
var busNotInitialised = true;
//Keep RabbitMQ switched off for a few iterations of this loop, then switch it on.
while (busNotInitialised)
{
busControl = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
sbc.ReceiveEndpoint(host, "some_queue", endpoint =>
{
endpoint.Handler<string>(async context =>
{
await Console.Out.WriteLineAsync($"Received: {context.Message}");
});
});
});
try
{
busControl.Start();
busNotInitialised = false;
}
catch (Exception)
{
Console.WriteLine($"Attempt:{++failCount} failed.");
//wait some time
Thread.Sleep(5000);
}
}
//At this point, using RabbitMq's management web page, you will see failCount + 1 channels.
busControl.Stop();
//At this point, using RabbitMq's management web page, you will see failCount channels.
Console.ReadLine();
}
}
}
使用系统;
使用系统线程;
使用大众运输;
命名空间TestSubscriber
{
班级计划
{
静态void Main()
{
IBusControl总线控制=空;
var故障计数=0;
var BusNotInitialized=真;
//在该循环的几个迭代中保持RabbitMQ关闭,然后将其打开。
while(未初始化)
{
busControl=Bus.Factory.CreateUsingRabbitMq(sbc=>
{
var host=sbc.host(新Uri(“rabbitmq://localhost/,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
sbc.ReceiveEndpoint(主机,“一些队列”,端点=>
{
Handler(异步上下文=>
{
wait Console.Out.WriteLineAsync($“Received:{context.Message}”);
});
});
});
尝试
{
busControl.Start();
BusNotInitialized=false;
}
捕获(例外)
{
WriteLine($“尝试:{++failCount}失败。”);
//等一会儿
睡眠(5000);
}
}
//此时,使用RabbitMq的管理网页,您将看到failCount+1通道。
busControl.Stop();
//此时,使用RabbitMq的管理网页,您将看到failCount通道。
Console.ReadLine();
}
}
}
它不断尝试创建使用RabbitMQ的服务总线。
一旦服务总线成功创建,程序就会中断循环。
在运行程序几分钟(使用停止的RabbitMQ)并在断点上停止之后,我可以看到很多工作线程(每个失败的服务总线创建尝试对应一个)。
启动RabbitMQ后,所有这些“悬空”连接线程都将连接到RabbitMQ
如果我试图关闭总线,最新的连接(属于已成功创建的总线)将关闭。所有其他悬空连接仍连接到RabbitMQ
这里的问题是,这些挂起的线程在连接时会从队列中读取数据,从而导致数据丢失
有什么办法可以解决这个问题吗?RabbitMQ是现有基础设施中最可靠的一部分。多年来,我们一直在生产中的单个节点上运行它,每天处理数百万条消息。你想解决什么问题?@AlexeyZimarev,我们在Masstransit行为方面的问题,而不是RabbitMq。inI如果在启动服务总线期间出现连接问题(例如),我们的应用程序将重试。如果启动成功,则会有额外的开放通道(从启动失败的try开始),该通道从队列读取数据,但无法处理数据。我们无法从应用程序关闭此频道。这就是我们的问题。对我来说,这似乎是在解决不存在的问题。但这只是我自己使用RabbitMQ运行MT服务的拙劣经验,多年来消耗了数百万条消息。RabbitMQ是现有基础设施中最可靠的一部分。多年来,我们一直在生产中的单个节点上运行它,每天处理数百万条消息。你想解决什么问题?@AlexeyZimarev,我们在Masstransit行为方面的问题,而不是RabbitMq。inI如果在启动服务总线期间出现连接问题(例如),我们的应用程序将重试。如果启动成功,则会有额外的开放通道(从启动失败的try开始),该通道从队列读取数据,但无法处理数据。我们无法从应用程序关闭此频道。这就是我们的问题。对我来说,这似乎是在解决不存在的问题。但这只是我自己使用RabbitMQ运行MT服务的拙劣经验,多年来消耗了数百万条消息。