首先抱歉这样一个开放式问题,但我不知道任何其他发布此类问题的平台。
所以基本上我正在开发一个IoT平台,在这个平台上,接近200万个设备应该与很少的网关连接。现在我有一个要求,我需要监控每个设备的心跳(周期性),并根据一些错过的心跳我想从网络控制台添加/删除设备。
我打算在设备和网关之间放置一个kafka队列,以便周期性数据可以排队并存储在某些地方,但是在网关级别我的问题开始时我必须监视每个心跳并确定哪个设备有在给定的浸泡期间错过了节拍。我无法维护大型数据结构以保持映射,对于NRT或RT系统来说DB将是昂贵的,任何建议应如何为此设计。
我的平台是Java驱动的,所以任何建议,如果其他一些开源平台可以适合法案或任何设计方法。
感谢。
答案 0 :(得分:1)
您的用例是典型的异步摄取+处理,它始终在大数据系统中发生。
您在摄取事件时选择Kafka是完美的(不要忘记查看监控Kafka的方法。我认识的大多数人都认为Kafka是神奇的药丸,它会解决所有问题,但却找不到他们把系统投入生产的时间,卡夫卡集群周围缺乏监控已经让他们苦苦挣扎了)
现在在网关层的处理部分,您可以查看Spark(流媒体)/ Storm / Flink等系统。我对Spark非常熟悉,你的用例看起来更像是带窗口的火花流。如果您已熟悉Scala(它们的Java API也非常简单),它可以很好地扩展并且还有一个简单的开发周期。
除非您想要保存已取出的设备的历史数据以及何时使用,否则您不需要数据库。 Spark流式传输作业的输出(在每个浸泡时间窗口之后)实际上可以与您的网络控制台通信并关闭设备。有一点需要注意的是您的应用程序的保留时间 - 如果它很大,那么您可能需要为更多具有RAM和磁盘的计算机进行配置。 Spark非常快,因为它在内存中维护整个数据窗口(如果它无法保存在RAM中,则刷新到磁盘)