我目前正在测试我的应用程序的扩展性,但遇到了一些我没想到的事情。
该应用程序在 5 节点集群上运行,它具有多个服务/参与者类型,并且使用共享进程模型。对于某些组件,它使用 actor 事件作为尽力而为的 pubsub 系统(存在回退,因此如果删除通知,则没有问题)。当参与者的数量增加(也称为订阅主题)时,就会出现问题。actorservice 目前被划分为 100 个分区。那时的主题数量约为 160.000,其中每个主题被订阅 1-5 次(需要它的节点),平均订阅 2.5 个(大约 400k 订阅)。
此时集群中的通信开始中断,没有创建新订阅,取消订阅超时。但它也会影响其他服务,对诊断服务的内部调用超时(询问 5 个副本中的每一个),这可能是由于分区/副本端点的解析,因为对网页的外部调用很好(这些端点使用相同的技术/代码栈)。
事件查看器充满了警告和错误,例如:
EventName: ReplicatorFaulted Category: Health EventInstanceId {c4b35124-4997-4de2-9e58-2359665f2fe7} PartitionId {a8b49c25-8a5f-442e-8284-9ebccc7be746} ReplicaId 132580461505725813 FaultType: Transient, Reason: Cancelling update epoch on secondary while waiting for dispatch queues to drain will result in an invalid state, ErrorCode: -2147017731
10.3.0.9:20034-10.3.0.13:62297 send failed at state Connected: 0x80072745
Error While Receiving Connect Reply : CannotConnect , Message : 4ba737e2-4733-4af9-82ab-73f2afd2793b:382722511 from Service 15a5fb45-3ed0-4aba-a54f-212587823cde-132580461224314284-8c2b070b-dbb7-4b78-9698-96e4f7fdcbfc
我尝试过扩展应用程序,但没有激活此订阅模型,我很容易达到两倍大的工作负载而没有任何问题。
所以有几个问题
- 演员事件是否有已知/建议的限制?
- 增加分区数或/和节点数会有所帮助吗?
- 通信干扰是否合乎逻辑?为什么其他服务端点也有问题?