我在我的项目中使用 Vertx 4.4.5。我创建了一些服务,并在运行操作系统 RHEL 9 的 Dell R730 上运行的 18 核 VM 上通过 11 个微服务实现了 3k TPS。每个请求周期都会对数据库和 Redis 进行多次读写。 Redis 和数据库位于同一台机器上,但位于不同的虚拟机上。
TPS为3k时,消息大小在1kb左右。然而,当我将消息大小增加到大约时。 100kb 被视为平均生产消息大小。 TPS下降到600。我检查了日志,发现事件总线的消费者在延迟几秒后才收到消息。我在 google 上搜索发现事件总线不是为大消息设计的,因此我使用共享数据在异步映射上写入 100kb 消息,并使用事件总线发送 apiKey 仅用于识别和获取目的。因此,在我的下一个服务中,我使用该 apiKey 从共享数据映射中异步获取该数据。
问题是从服务A(ApiGateWay)到B(BusinessService)我将所有100kb写入共享数据,并在共享数据上写入数据完成后
map.put(.., ..).onCompelete(res->{
if(res.succeed()){
eventBus.request(.., .., ..);
}
});
我使用
调用事件总线eventBus.request(.., .., ..);
将数据发送到下一个服务,而在另一个服务上,消费者在与我使用事件总线而不是共享数据之前相同的延迟后收到此消息。我也将消费者的消息缓冲区设置为10k。
eventBus.consumer(.., ..).setMaxBufferedMessages(10000);
我错过了什么吗?其他一些配置是:
A 上的 WorkerInstances -> 100 A 上的 WorkerPoolSize -> 100
B 上的 WorkerInstances -> 100 B 上的 WorkerPoolSize -> 100
我还尝试在启动服务 A 和 B 时使用
来扩展 hazelcast -Dhazelcast.socket.receive.buffer.size=10240 -Dhazelcast.socket.send.buffer.size=10240
加载运行详细信息
- Jmeter
- 7000 线程
- 100 次循环
- 0.7s 加速
- 1000ms 恒定延迟
感谢您提前提供的帮助。干杯!
很难肯定地说可能会发生什么,但是您对 Hazelcast 地图使用什么序列化方法? Java Serialized 的效率非常低,因此如果正在使用它,将其更改为 Compact 或 IdentifiedDataSerialized 之类的内容可能会有所不同。