【发布时间】:2020-04-05 18:38:26
【问题描述】:
我有一个带有一个无状态服务和多个有状态服务的服务结构应用程序。无状态服务从 RabtitMQ 读取(使用 MassTransit)并将消息传递给相应的有状态服务进行处理。传递给有状态服务的消息在 ConcurrentQueue 中排队,在 RunAsync 中出列并处理。直到那里的消息数量减少为止都很好。最近消息的数量增加了数倍。现在的情况是 RabbitMq 中的消息数以百万计,有状态服务队列超载。内存使用率变得非常高,集群卡住了。
- 队列是否在 RunAsync 方法需要等待的入队过程中被锁定。排队人数非常多。
- 如果队列计数非常高,我无法找到停止从 RabbitMq 获取的方法。至少集群不会挂起或崩溃。
- 在输入负载非常高的情况下,最好的设计是什么?
谢谢
【问题讨论】:
-
1.显示您的代码(生成和使用消息)2.为什么需要有状态服务?3.为什么需要单独的无状态服务来读取队列?为什么不在有状态服务中读取消息? -
@mtkachenko 队列有不同类型的数据。要处理每种类型,有一个具有并发队列的有状态服务类型。所以连接到 RabbitMq 的无状态服务将获取消息,检查相应有状态服务中的类型和入队。有状态服务是 Int64 分区的。由于某些类型的数据数量较多,因此该应用程序以这种方式设计用于个人扩展目的。
标签: rabbitmq azure-service-fabric service-fabric-stateful