摘要:之前任职于某公司时带领团队开发一个项目,这个项目的功能主要是查询数据,但是数据查询过程比较慢,所以从前端下发请求后,是异步获取查询结果的。之前老系统用的是客户端轮询的方式调用服务器端接口获取查询结果的,这种方式开发起来比较简单,但缺点就是一方面比较消耗资源;另
之前任职于某公司时带领团队开发一个项目,这个项目的功能主要是查询数据,但是数据查询过程比较慢,所以从前端下发请求后,是异步获取查询结果的。之前老系统用的是客户端轮询的方式调用服务器端接口获取查询结果的,这种方式开发起来比较简单,但缺点就是一方面比较消耗资源;另一方面就是客户端为了提高及时性,需要做轮询策略,即使这样也很难做到消息的实时性。为了解决这个问题,我最终决定使用websocket技术来重构这部分。
我们写了一个消息推送服务器,客户端需要获取推送消息就创建一个和这个服务器的链接。当业务系统查询完成后将结果推送到kafka,消息服务器监听kafka的topic获取结果,再将消息推送给客户端。系统上线后,基本做到秒级接收查询结果,客户端也简单了,只需要监听推送消息,不需要去轮询服务器了。
后续经历了一些项目的开发,像这种服务器端主动推送到客户端的需求陆陆续续也会遇见,最简单的方式就是采取轮询,或者自己写一个websocket的推送,或者使用SSE技术。SpringBoot现在对websocket支持的也比较好,上手也比较容易。但是这些方案基本是不可复用的,每次都要重新开始,而且如果使用websocket方案,还有很多细节需要处理,看似简单,实际做着做着就会发现有不少的配套工作需要做,于是乎就萌生了做一个消息推送平台的想法,这样只要使用方按照规范接入即可使用,省去了重复造轮子的时间。
说做就做,有了想法就要去执行,知行合一,否则等于空想,执行力永远是自我激励最好的方式之一。
首先需要规划的是产品功能,核心功能肯定是推送,但是围绕推送以及平台化这两方面还是有很多辅助功能的,比如需要做saas租户平台,提供给接入方使用,接入方通过这个平台管理自己的应用以及应用的相关数据;最终规划了几个大的模块:消息服务器、租户管理平台、api接口、admin管理平台以及客户端sdk;
产品规划图
产品功能确定后就是技术选型了,基于最熟悉原则,我还是选用了java相关技术栈,消息推送服务器使用Netty框架、Web框架部分还是用SpringBoot来做,消息传递使用RabbitMQ,为什么没用Kafka呢?因为RabbitMQ的消息传递方式比kafka丰富,比如可以广播的特点;数据存储用了MySql和MongoDB,另外还使用了Redis。一开始使用Zookeeper,后来为了简化架构移除了。根据项目的特点,采取按模块的方式开发以及部署,不涉及到微服务架构;所有的模块以及中间件都使用Docker部署。
功能模块以及技术方案确定后就进入开发阶段了,一个人一台电脑,先实现最核心的服务器部分,再做租户管理平台,然后做api接口部分,一步一个脚印。整个开发周期大概两个月左右,过程也比较枯燥,中途也遇到了不少问题和挑战,好在都一一的解决了。尤其是前端jssdk和租户管理端前端的vue部分,这本不是我擅长的,因为我这些年一直从事的服务器端开发,但是自己做产品就需要全面的去拥抱这些技术。好处就是通过这些开发工作,让我多掌握了一门技能,也算是额外的收获。
产品阶段性开发完成后,我部署到了阿里云服务器上。刚开始租了一台服务器,跑了10个docker进程,压力可想而知[可怜],时不时就会因为内存不够导致docker容器退出[笑哭]。后来没办法又加了两台服务器才算稳定下来[呲牙]。产品的使用链接如下「链接」,大家可以体验一下,如果遇到任何请及时反馈给我[握手]。
首页
应用管理
客户端管理
消息管理
通道管理
发送消息
客户端详情
从头构思一个产品到实现这个过程真的不容易,需要强大的意念来支撑着你做这件事,很多细节问题会在做的过程中暴露出来。如果没有这个过程的历练,很多问题仅仅靠思考是无法发现的,这就体现出我强调执行力的重要性了,真所谓:“纸上得来终觉浅,绝知此事要躬行”。
如果你想学习一门技术,最直接的方式还是去运用它,在运用中你才能掌握它。
来源:默默无闻