rabbitmq MassTransit在同步上下文中发布消息速度太慢

egmofgnx  于 2023-08-05  发布在  RabbitMQ
关注(0)|答案(1)|浏览(178)

我有一种情况,我应该通过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();
}

字符串
所以我使用了TaskUtil.Await和/或Wait(),但是发布性能很差(每秒33条消息),而纯Rabbit客户端的结果要好得多(每秒至少200条消息),并且考虑到消息排序:

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)));
        }
    }


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

t1rydlwq

t1rydlwq1#

如果你产生了一批消息,按顺序,你不应该等待每个发布,这将是非常缓慢的。考虑将任务添加到列表中,并同时等待它们:

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);
}

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

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

    // ...
});

相关问题