IoT设备(当前为IPv4设备)每天通过TCP套接字向服务器发送有效负载。服务器具有公共IP地址,设备位于路由器/ NAT之后。我将使用基于ESP8266的模块(例如Olimex)
目标
服务器应该能够在需要时将数据发送到任何客户端。对像打孔那样的直接客户端到客户端通信(即从我的智能手机连接到设备)没有兴趣。多达数千个。它们的Internet连接由许多启用4G的路由器/调制解调器提供。每个人将处理10-20个客户。
建议的解决方案
据我所知,MQTT是一个常见的解决方案。客户端定期将数据发送到代理(即,在托管服务器上运行的Mosquitto),代理随后又更新在同一服务器上运行的主Web应用。对于大量的设备(超过1000个),其中大多数设备都位于4G路由器后面?
#1 楼
任何体面的MQTT经纪人都可以轻松处理1,000个客户; Scalagent的基准测试表明,具有以下条件的PC:3 GHz Intel Core 2 Duo处理器
4 GB RAM
可以处理60,000个发布商正在运行Mosquitto。这远远超出了所需的1,000个发布者,因此即使在相对较弱的服务器上,您仍然应该能够处理所需的发布者。
其他一些经纪人声称其性能更高(服务器相应更大)功能,例如HiveMQ,声称可以处理1000万个发布者。
MQTT经纪人通常希望持久连接,并且会使未发送ping响应(或其他活动)的客户端超时)定期。发布后可以断开网络连接,但是很明显,如果断开连接,您将收不到任何信息。
MQTT确实支持“保留”消息的概念,该概念可能有用。 Web客户端可以使用保留标志将某些内容发布到主题,然后该消息将由代理存储。只要您的客户重新连接并订阅该主题,他们就会收到保留的消息(即使该消息是在几个小时前发布的)。每次客户端订阅该主题时,都会发布保留的消息,因此,如果您的连接不固定并且需要存储一条消息,直到客户端重新连接,这可能会对您有所帮助。
评论
我肯定解释错了。仅服务器(商业托管服务)应处理1000多个客户端。不同地方有很多4G路由器,每个路由器只能处理10-20个客户端。
–马克
18-2-18在10:24
哦,我读错了–我的错,@ Mark,我认为您的意思是所有这些都在一个4G路由器后面。在这种情况下,我将对其进行编辑。
–Aurora0001♦
18年2月18日在10:25
我还不完全了解MQTT的基础代码-我担心4G连接:MQTT是否需要持久的Internet连接?网络可能会不稳定...
–马克
18-2-18在10:26
我已经编辑了一些建议,@ Mark;让我知道这是否指向正确的方向。
–Aurora0001♦
18-2-18在10:31
是的,现在更清楚了。我将对该主题做进一步的搜索,如果仍然需要帮助,我将提出另一个问题。非常感谢。
–马克
18年2月18日在10:38
#2 楼
您可以使用来自客户端的持久会话,例如连接时将clean标志设置为false。在这种情况下,当客户端脱机时,代理会将消息的消息缓冲到自己的缓存中,并在设备连接后将其传递。关于数量-即使对于一台服务器,10K的数量也相对较低。您可以将Linux服务器配置为保持50万个活动连接,并且如果您的代理基于云,例如由某些提供商作为服务提供,那么您甚至可以拥有数百万个活动连接。
顺便说一句,我认为Mosquitto或任何其他本地安装是开发和测试的理想选择,但是当您投入生产时,您需要具有HA,冗余,故障转移,等
评论
我认为SaaS MQTT代理永远不是最适合生产的。大多数专业(自托管)MQTT代理在保持完整的MQTT兼容性的同时,还支持大规模的HA,冗余和故障转移。某些SaaS代理不支持所有MQTT功能。如果您对本地蚊子进行测试,然后去SaaS提供商,则很可能事情在生产中无法按预期进行。
–多米尼克·奥伯迈尔
18-2-22在13:11
和往常一样,两种选择都有其优缺点。显然,任何SaaS经纪人都需要完善的沟通团队,对产品开发早期阶段的长期测试,明确的正常运行时间保证以及各种SLA。维护自己的经纪人也是一种不错的方法,但是世界正在进入服务领域。您将为使用经纪人作为产品一部分的产品付出最大的努力,或者变得最有能力,或者您将花费大量的时间和金钱来成为超级有经验的MQTT经纪人管理员(而不是其开发商!)。只需选择+)
–shal
18年2月28日在18:04
评论
最好单独询问问题(1),然后仅询问与问题正文中的标题相匹配的问题(2)。这样,我们可以分别详细解决您的每个问题。您可以在新问题中再次包含您的上下文,如果有帮助,也可以链接到此问题。问题更改并添加了第二个。
从它的声音来看,即使您确实遇到了保持大量打开连接的服务器负载问题,您的系统也将与树型拓扑完全兼容,在这种拓扑中,客户端连接到容纳相应会话并通过每个服务器在单个管道中上下流动的流量很少。您甚至可以在您的4G路由器中本地进行此操作的第一层。