栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

踩坑日记——大量数据并发及长时间耗时

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

踩坑日记——大量数据并发及长时间耗时

背景:

        本人菜鸟,初步接触物联网协议开发,要求从移动物联网上接入20000余只设备(可能以后更多),移动物联网HTTP实时推送设备上报的数据,服务收到数据后进行解析,并根据解析及时返回移动平台响应报文,移动平台收到报文后响应给设备,完成一次数据上报通信。有以下要求:①移动推送数据后必须及时返回移动响应,否则移动平台认为推送失败重复推送,多次失败后推送服务停止(耗时影响很大)。②收到推送的数据后,需要及时处理,并回复响应报文(设备集中上报时,并发影响很大)。③,响应给移动平台是需要调用http-post方式,并根据是否成功进行下一步操作(网络波动,api接口耗时影响很大)。

踩的坑

        第一版使用异步方式开发,使用tornado框架,但每条数据进行解析、生成响应报文、数据存储(已优化,基本不耗时),给平台发送设备响应报文,会消耗很多时间,造成不能及时给移动推送服务进行确认,移动判断推送失败,多次推送,一段时间后推送服务停止。

        第二版使用tornado框架配合rabbitMQ消息中间件,将响应设备报文后调用api的步骤存放在消息消费者中处理,但启动少量的消费者时,不足以短时间消费大量的并发数据。启动大量消费者时,长时间没有数据时,造成资源浪费。

        第三版则使用tornado框架配合twisted框架,设计两个服务,第一个服务主要接收推送的数据,并使用Tcp/Ip方式将数据推送到第二个服务,由于第一个服务使用tornado框架,采用异步模式,处理速度很快,能够并发大量数据并耗时很少。能够及时返回移动推送服务响应。第二个服务则使用twisted框架多线程方式。每次收到数据后增加一个线程进行处理,能够解决并发,每条数据不相互影响,出现耗时不会影响到其它线程。能够满足要求

        第四版则使用tornado框架配合自带的线程的方式进行操作,因为该框架虽然是异步方式,但有一种情况会出现同步的效果。当某个接口短时间推送大量的数据过来,tornado进行处理时会判断是否为同一个(客户),如果是同一个则会先处理之前的请求,后来的请求挂起,当前一个请求处理完毕后才会处理后面的请求,不会异步处理,造成同步的效果,导致大量的数据阻塞。具体设计方法为,收到数据先向请求端发送接收成功的确认,提前结束推送请求:

# 接收到数据后立马给返回接收确认
self.write(json_encode({'code': 200, 'result': u'成功'}))
self.flush()
self.finish()  # 提前刷新输出缓冲区

之后加入线程进行处理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/573131.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号