【问题标题】:ReliableConcurrent Queue in Service FabricService Fabric 中的可靠并发队列
【发布时间】:2020-04-05 18:38:26
【问题描述】:

我有一个带有一个无状态服务和多个有状态服务的服务结构应用程序。无状态服务从 RabtitMQ 读取(使用 MassTransit)并将消息传递给相应的有状态服务进行处理。传递给有状态服务的消息在 ConcurrentQueue 中排队,在 RunAsync 中出列并处理。直到那里的消息数量减少为止都很好。最近消息的数量增加了数倍。现在的情况是 RabbitMq 中的消息数以百万计,有状态服务队列超载。内存使用率变得非常高,集群卡住了。

  1. 队列是否在 RunAsync 方法需要等待的入队过程中被锁定。排队人数非常多。
  2. 如果队列计数非常高,我无法找到停止从 RabbitMq 获取的方法。至少集群不会挂起或崩溃。
  3. 在输入负载非常高的情况下,最好的设计是什么?

谢谢

【问题讨论】:

  • 1. 显示您的代码(生成和使用消息)2. 为什么需要有状态服务? 3. 为什么需要单独的无状态服务来读取队列?为什么不在有状态服务中读取消息?
  • @mtkachenko 队列有不同类型的数据。要处理每种类型,有一个具有并发队列的有状态服务类型。所以连接到 RabbitMq 的无状态服务将获取消息,检查相应有状态服务中的类型和入队。有状态服务是 Int64 分区的。由于某些类型的数据数量较多,因此该应用程序以这种方式设计用于个人扩展目的。

标签: rabbitmq azure-service-fabric service-fabric-stateful


【解决方案1】:

您如何对有状态服务进行分区?如果您有一个范围或命名分区,那么您的所有消息都不应该命中同一个副本。如果您正确应用了分区方案,您的消息将最终位于同一有状态服务的不同分区中,并且您可以横向扩展。

【讨论】:

  • 分区是 Int64 分区,每个分区都是使用随机的分区键调用的。问题是,由于要处理数百万条记录,服务无法保存它。 vm 内存已满。这个设计好像不太好。我可以轮询 rabbitmq 而不是将消息推送到应用程序吗?
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2017-07-25
  • 2017-12-08
  • 2018-11-06
  • 2019-01-08
  • 2016-03-14
  • 2016-07-23
  • 2017-01-28
相关资源
最近更新 更多