Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 用于处理传感器数据的服务结构参与者_.net_Azure_Azure Service Fabric_Service Fabric Actor - Fatal编程技术网

.net 用于处理传感器数据的服务结构参与者

.net 用于处理传感器数据的服务结构参与者,.net,azure,azure-service-fabric,service-fabric-actor,.net,Azure,Azure Service Fabric,Service Fabric Actor,我们目前正在设计一个能够处理大量传感器事件的系统 由于需要处理数百万个不同的传感器实例,我认为ServiceFabricActor模型非常适合。 因此,我们的想法是让一个参与者负责处理一个传感器的事件(SensorId=ActorId) 映射很容易,因为我们只需要通过特定的SensorId查询数据,所以我们在一个地方就有了所有的数据,这可以实现真正快速的查找 现在的问题是,(一些)传感器正在以单个参与者无法再处理的速率发送数据 这就是我们现在陷入困境的原因,我们不能提示系统并告诉它将负载分配给更

我们目前正在设计一个能够处理大量传感器事件的系统

由于需要处理数百万个不同的传感器实例,我认为ServiceFabricActor模型非常适合。 因此,我们的想法是让一个参与者负责处理一个传感器的事件(SensorId=ActorId)

映射很容易,因为我们只需要通过特定的SensorId查询数据,所以我们在一个地方就有了所有的数据,这可以实现真正快速的查找

现在的问题是,(一些)传感器正在以单个参与者无法再处理的速率发送数据

这就是我们现在陷入困境的原因,我们不能提示系统并告诉它将负载分配给更多的参与者,用于特定的传感器,如Sensor123和Sensor567

有没有可能通过ServiceFabric提供的虚拟参与者系统来解决这个问题

更新1

我认为我们没有一个单一演员的问题。对于一个独特的演员,我们可以每秒收到大约5k条消息。 但有些传感器需要50-100k/s的目标吞吐量。因此,通过设计(单线程执行),单个参与者将无法完成此任务

因此,为了澄清最初的问题:我们或多或少地在寻找一种自动划分“某些”参与者的方法

(当然,我们可以为每个传感器创建10个参与者来划分负载。但这会使查找效率低下
此外,我们还需要10倍的RAM。这似乎是不合理的,因为0.5-1%的传感器需要更大的吞吐量)

我建议调查以下选项:

  • 放大/缩小群集。拥有更多的cpu能力可以提高吞吐量。每台机器拥有更少的参与者也会有所帮助
  • 使用入口队列,如事件中心,或在服务结构内创建队列。例如,使用参与者在其
    状态管理器
    中将事件排队,并使用
    提醒
    在后台处理它们。通过这种方式,事件的处理与接收事件是分离的。(不过,您将转变为“最终一致性”的模型)
  • 通过将职责划分为不同的参与者类型,使参与者更小。通过这种方式,您可以更好地在整个集群中分配负载,而代价是一些延迟

  • 我不认为这会给你带来你想要的足够的收益,但是你有没有尝试过为这种“特殊情况”传感器测试一种新的Actor类型,它使用了一种不太持久的持久性方法

    例如StatePersistence.Volatile或StatePersistence.None?我已经看到这显著提高了参与者吞吐量,尤其是statePersistence.None

    显然,这可能不适合您所期望的耐用性要求,但在您获得长期解决方案之前,这可能是一个快速的胜利

    必须同意@LoekD,选项3将是您的最佳选择。尝试将责任细分为不同的参与者,然后可以聚合(在循环计划中?)并向能够处理报告负载的传感器的上帝参与者报告-这再次导致一些最终的一致性,对于您的用例来说,这些一致性可能是可接受的,也可能是不可接受的

    如果所有这些都失败了,您可以尝试在裸机上而不是虚拟机上运行集群,以获得可观的性能增益


    最后,在裸机上评估Erlang。。。说没有.NET开发人员

    非常感谢您的投入!但在我们的情况下,这些选择不会有多大帮助;(.我更新了最初的问题,以澄清我们的需求。