最近需要实现一个查询代理的接口,业务场景如下:
1、生产环境下有许多设备,每台设备每天大概能产生30W条数据,大概有40个设备,每天大概1000W条结构化数据,存储在数据库中;
2、产生的业务数据需要提供查询接口,为第三方提供查询服务,例如根据设备编号+时间范围、根据时间范围等进行查询,每次范围0~10W条左右(最多不超过10W,约束条件);
问题:需要提供一个高效、方便的接口,支持多客户并发访问,满足上万条数据的返回,尽量实时。
初步思路:
A、http、websevices对返回结果集的有限,暂时不考虑;
B、制定交互协议,通过TCP/IP,以短链接的形式进行交互,每次查询时,需要提供一个UUID作为任务编号,代理接口组织好数据后,通过任务编号返回;
C、制定协议,接收客户端的查询请求,为每个客户端配置一个ftp帐号,数据组织好后,推送到ftp,然后再消息通知客户端,也是采用短链接方式交互;
D、也见过专业的接口服务,除了提供查询协议,也提供相应的jar,通过jar的引用,客户端进行傻瓜式的调用即可
请问:
1、不知大家是否有其他好的思路;
2、针对提供jar包的方式,是否能提供一些思路;
首先是存储,这个可以很明显的做到分表,一个设备一个。另外还可以按周(月)进行拆分。这样的话,大概一个表的极限数据就是900w。这是存储的设计,比较简单。
再说查询:
关于A,可能你是有误解,我个人反而建议用Http提供API
B、C方案核心都是异步任务+通知,及时性不佳。
D,针对http请求包装一个Client是很容易的事情,主流的sdk大都是这个玩法。
关于http请求10w条数据,此处需要评估下你的单条数据大小。如果可以,把限制做成1w条,然后对数据进行压缩后下发。
数据存储这块跟你思路差不多,采用分区表的方式进行存储,问题不大;
我现在没有想清楚的是,采用那种方式提供接口,就是想支持多并发,并且方便客户端调用,你说的也是一种思路,谢谢啦。
@我是豆豆:因为你要及时性,那这个时候单次的请求没必要搞那么大。如果要大批量下载数据,那就是导出相关的功能了。
@幻天芒: 谢谢回复,你的意思就是根据请求的范围去查询,查询完毕后,通知请求方进行下载即可,是吧。
@我是豆豆: 是的,这是不要求及时性,大批量下载的玩法。
http api 提供查询服务,限制条数,返回json,返回二进制流都可以
client sdk提供接口,可以使用google proto 类似这种二进制协议来通信,针对你这种一次性要返回10万+条数据的,可以考虑tcp client 和server建立链接后,查询条件发送到server,server可以分页到db查询,比如每次1w 条,然后多次出现,分配tcp send给client。使用sdk也可以做异步加载的优化,数据用到了,在请求server
主要看你使用场景,数据大小,和是否有必要一次性必须loaded 10w+数据。
感谢回复,我也在考虑结果集采用分批次的方式返回给请求方。
当天表 历史表 就行了 历史表都是废数据,,大部分只看当天的