我想为我的项目部署分布式的,有序队列解决方案,但是我有疑问/问题:
我应该使用哪个工具/解决方案?哪一种最容易实现 /学习和基础设施使我省钱? Rabbitmq,Kafka,Redis Streams?
在故障情况下或向系统添加新主题/流时,如何为每个使用者实现主题/流的自动重新平衡?
换句话说,我想实现这样的东西:
..但是,如果我的一个应用程序出现故障,其他实例应该获取当前剩余的所有流量,并以适当的分配(相等的负载)进行访问。
请注意,我的代码是用 node.js v10(打字稿)编写的,而我的基础架构是基于 Azure 的,因此除了自托管解决方案(例如RabbitMQ) ,也可以使用基于天蓝色的解决方案(例如Azure Service Bus),但厂商锁定较少,对我来说是更好的解决方案;)
现在,我提供系统的更详细的背景信息:
我有10万辆车辆的跟踪器设备(不同的跟踪器,许多制造商和协议),每个设备都与我的自定义应用程序之一称为 decoder 进行通信。这个小型微服务解码并统一了来自跟踪器的有效负载,并将其发送到分布式队列。每个跟踪器每10-30秒发送一次消息。
请注意,我必须保持来自单个设备的邮件顺序,这非常重要!
下一步,我有处理应用微服务,我想根据跟踪器设备的数量进行扩展(分叉/集群)。这个应用程式的每个分叉都应订阅一些主题/使用者群组,以处理来自装置的讯息,同时保持秩序。处理每条消息大约需要1-3秒。
请注意,我随时都可以添加或删除跟踪器设备,并且此信息应自动传播到处理应用程序和此实例的分支应该能够自动重新平衡队列中的流量。
问题是如何用尽可能少的(node.js)代码行来做到这一点,同时又要保持解决方案的简单,清洁和廉价? :)
如上图所示,如果3号货叉发生故障,系统必须确定哪个工作货叉应显示“蓝色”消息。另外,如果3号货叉返回,则也需要重新平衡。
我阅读了与消费者组有关的Apache Kafka,但是Kafka很难为我学习和实现。
我了解了RabbitMQ和消费者组/许多主题,但我不知道如何编写自动重新平衡功能以及如何使用RabbitMQ(哪些插件?哪些设置/配置?有这么多的选择...)
我阅读了有关带有message sessions的Azure Service Bus的信息,但是它具有供应商锁定(天蓝色云),价格昂贵,并且像其他解决方案一样,不提供现成的完全自动重新平衡功能。
我阅读了有关Redis Streams(具有conunsumer组)的信息,但是它是一项新功能(缺少node.js的库),并且也没有提供自动重新平衡功能。
答案 0 :(得分:0)
对于第一个问题,您应该寻找成熟的m2m协议Brocker,这将使您可以自由地设计自己的智能数据交换算法。
第二个问题的答案必须使用性能良好的负载均衡器来处理如此大量的100000辆联网汽车。我的建议是使用Azure API Gateway或Nginx负载平衡器。
现在让我们看一下一些联网汽车解决方案,并分析Aws IoT或Azure IoT如何很好地完成这项工作。
在Kafka上完成事件处理时,Nginx或API网关用于负载平衡。使用kafka,您可以实现自己的规则引擎来进行智能数据交换。同样,任何作为物联网桥梁的Message Broker都可以做得更好。如果是的话,您将使用VerneMQ来实现MQTTv5功能和数据路由。在这种情况下,不需要队列。 同样,如果要使用天蓝色队列,则必须集中精力管理队列派生和抢占。若要无缝地控制队列,您必须编写Azure队列触发器无服务器功能。因此,您的不被供应商锁定的目标将无法实现。
使用VerneMQ一言以蔽之,用Nginx进行MQTT V5实施将是一个很好的实施,但是由于所有这些都是开源产品,因此您必须具有强大的实施和故障排除能力,否则您的业务运营将陷入支持失败。
最好使用专业的IoT云服务来解决数千辆联网汽车的问题。这是值得的,因为该服务的SLA是非常高的标准,并且在系统操作管理中花费很少的精力。
如果使用的是Azure解决方案,则可以使用IoT中心,而不必担心负载平衡。使用Azure设备SDK,您可以将所有带有移动LTE SIM,OBD插件等的汽车连接到云。然后,azure函数可以处理事件处理等等。
与Azure IoT设备SDK不同,AWS IoT具有用于设备的SDK。但是在这种架构中,我们希望以不同的方式完成互联汽车项目。为了消除阴影和实际设备状态同步,我们在边缘使用了AWS GreenGrass核心解决方案。除了无服务器的IoT事件处理之外,我们还解决了整个联网汽车解决方案。
类似地,Azure IoT Edge可以用于向设备Twin提供所有罐头信息,并在实际汽车和Twins之间进行同步。
希望这会给您一个清晰的想法,如何实现并查看与供应商锁定或解锁情况相比的成本优势。
谢谢。