背景:
本人菜鸟,初步接触物联网协议开发,要求从移动物联网上接入20000余只设备(可能以后更多),移动物联网HTTP实时推送设备上报的数据,服务收到数据后进行解析,并根据解析及时返回移动平台响应报文,移动平台收到报文后响应给设备,完成一次数据上报通信。有以下要求:①移动推送数据后必须及时返回移动响应,否则移动平台认为推送失败重复推送,多次失败后推送服务停止(耗时影响很大)。②收到推送的数据后,需要及时处理,并回复响应报文(设备集中上报时,并发影响很大)。③,响应给移动平台是需要调用http-post方式,并根据是否成功进行下一步操作(网络波动,api接口耗时影响很大)。
踩的坑
第一版使用异步方式开发,使用tornado框架,但每条数据进行解析、生成响应报文、数据存储(已优化,基本不耗时),给平台发送设备响应报文,会消耗很多时间,造成不能及时给移动推送服务进行确认,移动判断推送失败,多次推送,一段时间后推送服务停止。
第二版使用tornado框架配合rabbitMQ消息中间件,将响应设备报文后调用api的步骤存放在消息消费者中处理,但启动少量的消费者时,不足以短时间消费大量的并发数据。启动大量消费者时,长时间没有数据时,造成资源浪费。
第三版则使用tornado框架配合twisted框架,设计两个服务,第一个服务主要接收推送的数据,并使用Tcp/Ip方式将数据推送到第二个服务,由于第一个服务