我有一種情況,我應該通過 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 條訊息),而純兔子客戶端的結果要好得多(至少每秒 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 在同步背景關系中是否存在任何性能問題,或者我是否應該在我的代碼中使用任何調整?
uj5u.com熱心網友回復:
如果你生產一批訊息,按順序,你不應該等待每個發布,它會很慢。考慮將任務添加到串列中,并立即等待它們:
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,您可以通過如下所示的方法調整批量發布者設定(MassTransit 在后臺使用,在發送時將訊息分組在一起,以減少往返開銷)ConfigureBatchPublish:
x.UsingRabbitMq((context, cfg) =>
{
cfg.Host("localhost", h =>
{
h.ConfigureBatchSettings(b => b.Enabled = false);
});
// ...
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430776.html
