MassTransit 在同步上下文中发布消息的速度非常慢

Meh*_*ali 1 .net c# masstransit rabbitmq async-await

我遇到一种情况,我应该通过 RabbitMQ 同步发布消息(旧代码),否则消息将乱序,因为 MassTransit 在不同的线程中发布

    public void PostUserQuantitySync(int userId, decimal amount)
{
    foreach (var item in Enumerable.Range(0, 1000))
    {
        var _ = _publishEndpoint.Publish(new CreateUserTransactionRequest() { Amount = item });
    }
    return Ok();
}
Run Code Online (Sandbox Code Playgroud)

因此,我使用了 TaskUtil.Await 和/或 Wait(),但发布性能非常差(每秒 33/s 消息),而纯兔子客户端的结果要好得多(至少每秒 200/s 消息)并且尊重消息订购:

    public void PostUserQuantitySync(int userId, decimal amount)
    {
        foreach (var item in Enumerable.Range(0, 1000))
        {
            TaskUtil.Await(() _publishEndpoint.Publish(new CreateUserTransactionRequest() { Amount = item }, c => c.SetAwaitAck(false)));
        }
    }
Run Code Online (Sandbox Code Playgroud)

MassTransit 在同步上下文中是否存在任何性能问题,或者我应该在代码中使用任何调整吗?

Chr*_*son 8

如果你产生一批消息,按顺序,你不应该等待每个发布,它会很慢。考虑将任务添加到列表中,并立即等待所有任务:

public void PostUserQuantitySync(int userId, decimal amount)
{
    List<Task> tasks = new();
    foreach (var item in Enumerable.Range(0, 1000))
    {
        tasks.Add(_publishEndpoint.Publish(new CreateUserTransactionRequest() { Amount = item }));
    }

    await Task.WhenAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)

如果您使用 RabbitMQ,则可以通过如下所示的方法调整批量发布者设置(MassTransit 在后台使用,在发送时将消息分组在一起,以减少往返开销) :ConfigureBatchPublish

x.UsingRabbitMq((context, cfg) =>
{
    cfg.Host("localhost", h =>
    {
        h.ConfigureBatchSettings(b => b.Enabled = false);
    });

    // ...
});
Run Code Online (Sandbox Code Playgroud)