.net 核心性能上的 RabbitMQ

use*_*675 5 asp.net rabbitmq .net-core

我正在使用 .Net Core Web Api 评估 RabbitMQ 的性能。我创建了一个 web api,它只会将消息发布到 rabbitmq 队列,而工作进程将选择消息并对其进行处理。

我们想使用 Web api 每秒发送大约 1000 多条消息,我创建了一个新的 .Net Core Web 应用程序和一个用于rabbitmq 发送消息的类,并将应用程序托管在本地 iis 上。

对于负载测试,我使用不同的机器并创建一个简单的 jmeter 文件以发布到 web api,例如 api/rabbit。这将 sendMessage 到一个队列。我已经使用 Taurus 执行了大约 60 秒的 jmeter 测试。

这是结果

  • 并发@ 50 = 453 次点击/秒(平均响应时间为 29 毫秒)
  • 并发@ 100 = 563 次点击/秒(平均响应时间为 174 毫秒)

请指教?

队列访问层

public class RMQAccessLayer : IRMQAccessLayer
{
    private ConnectionFactory _factory;
    private IConnection _connection;
    private IModel _model;
    private IBasicProperties _basicProperties;

    public RMQAccessLayer()
    {
        _factory = new ConnectionFactory() { HostName = "localhost", UserName = "guest", Password = "guest" };
        _connection = _factory.CreateConnection();
        _model = _connection.CreateModel();
        _model.QueueDeclare("hello", true, false, false, null);

        _basicProperties = _model.CreateBasicProperties();
        _basicProperties.Persistent = true;
    }

    public bool SendMessage(string msg)
    {

        var body = Encoding.UTF8.GetBytes(msg);
        _model.BasicPublish("", "hello", _basicProperties, body);

        return true;
    }
}

public interface IRMQAccessLayer
{
    bool SendMessage(string msg);
}
Run Code Online (Sandbox Code Playgroud)

启动文件

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();

        // Add RabbitMQ 
        services.AddSingleton<IRMQAccessLayer, RMQAccessLayer>();

    }
Run Code Online (Sandbox Code Playgroud)

RabbitController.cs

[Route("api/[controller]")]
public class RabbitController : Controller
{
    private IRMQAccessLayer _queue;
    public RabbitController(IRMQAccessLayer queue)
    {
        _queue = queue;
    }
    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
        var emailMessage = "Message Id - " + Guid.NewGuid();
        _queue.SendMessage(emailMessage);
    }
}
Run Code Online (Sandbox Code Playgroud)