最近在做的一个项目,是一个大数据分析平台,有如下需求:有如果个实验设备运行并且将运行数据通过socket发送到分析平台,分析平台通过运行socket作业来完成对socket数据的接收,同时还需要对接收到的socket数据进行解析并且可以通过一个数据看板对数据实时监控。如下图所示:
选择websocket的原因,就是看板页面不必每次都去定时的请求数据,而是一旦websocket服务器发现有新数据则直接推送给客户端进行渲染,减少了占用的宽带和服务器资源。由于socket数据量多且快,所以如果将数据直接存入到传统的关系型数据库则会遇到效率瓶颈,这时候就必须要有一个缓存,redis基于内存且最大的特点就是快,用作缓存再合适不过,待作业结束后再将数据保存进hbase中即可。看板用到了baidu的echarts3折线图。
接收到的socket数据源源不断的被写入到redis中,接收到的数据格式类似于:数据量1|数据量2|数据量3|日期1|日期2...websocket的任务就是将这些数据交给看板进行渲染,那么怎么去拿到数据呢?就是websocket服务端定时的去redis拿,一旦有新数据则推送给看板。
首先开发websocket服务端,ServerSocket采用单例模式,因为是集成服务,所以如果需要关闭服务的话可以直接将ServerSocket关闭即可,服务器端代码如下:
[java] view plain copy
1. PrintWriter pw = getWriter(socket);
2. byte[] buf = new byte[1024];
3. int len = in.read(buf, 0, 1024);
4. byte[] res = new byte[len];
5. System.arraycopy(buf, 0, res, 0, len);
6. String key = new String(res);
7. if (!hasHandshake && key.indexOf("Key") > 0) {
8. key = key.substring(0, key.indexOf("==") + 2);
9. key = key.substring(key.indexOf("Key") + 4, key.length())
10. .trim();
11. key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
12. MessageDigest md = MessageDigest.getInstance("SHA-1");
13. md.update(key.getBytes("utf-8"), 0, key.length());
14. byte[] sha1Hash = md.digest();
15. sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();