c# - Mass Transit 可以自动扩展吗?
问题描述
我计划在我们的一个工作项目中使用 RabbitMQ。
我正在评估不同类型的客户,并想知道 MassTransit 是否可以满足我们对可扩展性的需求之一。
我在下面写了一个简单的代码:
public class MyMessage
{
public string SomeText { get; set; }
}
public static class Program
{
public static async Task Main(params string[] args)
{
var counter = 0;
var bus = Bus.Factory.CreateUsingRabbitMq(busFactoryConfigurator =>
{
var host = busFactoryConfigurator.Host(new Uri("rabbitmq://localhost"), hostConfigurator =>
{
hostConfigurator.Username("guest");
hostConfigurator.Password("guest");
});
busFactoryConfigurator.ReceiveEndpoint(host, "test_queue", endpointConfigurator =>
{
endpointConfigurator.Handler<MyMessage>(async context =>
{
var countDoku = counter;
counter++;
await Console.Out.WriteLineAsync(countDoku.ToString() + ": started " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(500);
await Console.Out.WriteLineAsync(countDoku.ToString() + ": done " + Thread.CurrentThread.ManagedThreadId);
await Console.Out.WriteLineAsync($"Received: {context.Message.SomeText}");
});
});
});
await bus.StartAsync();
Parallel.ForEach(Enumerable.Repeat(42, 5000), async _ => await bus.Publish(new MyMessage {SomeText = "Hi"}));
Console.ReadKey();
await bus.StopAsync();
}
}
它远不是完美的基准(例如Console
,Parallel.ForEach
只是用来async
并行抛出尽可能多的操作),但抛开这一点,我注意到一些令人尴尬的事情:
0: started 14
1: started 4
2: started 15
3: started 18
4: started 4
5: started 14
6: started 6
7: started 15
12: started 15
13: started 6
10: started 4
11: started 5
8: started 18
9: started 14
14: started 15
15: started 6
0: done 6
Received: Hi
5: done 14
6: done 5
Received: Hi
3: done 13
Received: Hi
12: done 8
Received: Hi
Received: Hi
7: done 18
Received: Hi
2: done 4
Received: Hi
4: done 15
Received: Hi
1: done 18
Received: Hi
11: done 18
Received: Hi
8: done 5
Received: Hi
9: done 14
Received: Hi
10: done 6
Received: Hi
13: done 4
Received: Hi
14: done 8
Received: Hi
15: done 15
Received: Hi
16: started 15
17: started 15
18: started 8
19: started 4
20: started 8
21: started 15
22: started 4
23: started 5
24: started 18
25: started 5
26: started 6
31: started 14
28: started 18
29: started 5
30: started 4
27: started 13
18: done 14
Received: Hi
17: done 13
Received: Hi
16: done 5
处理部分不能同时处理超过 15 个项目...
我想知道这是我的基准代码的问题还是 MassTransit 配置的限制?我是否应该使用演员框架来更好地分派从队列中接收到的项目负载,以便同时处理更多项目?
解决方案
推荐阅读
- python - 启动内核(spyder)时发生错误
- x86 - Intel的AVX2中的XOR指令“VPXORD”、“VXORPS”和“VXORPD”有什么区别
- android - 在相同的片段类型之间滑动
- java - java.lang.InstantiationException 尝试实例化子类时出错
- django - Django:将一个应用程序中的表单添加到另一个应用程序模板中(详细视图)
- c# - ASP.Net Core Anchor 路由到控制器中的操作
- android - 禁用 Android 'Instant' 应用程序模块以获得风味
- r - 具有组条件的滞后 R 数据表
- node.js - Node/Express:从 URL 中获取 req.query 值并将其转换为 UNIX 时间戳
- dart - Flutter 无法识别有效的导入