目录
- 1 从打车开始说起
- 1.1 需要解决的问题
- 1.2 消息推送
- 2 消息推送
- 2.1 什么是消息推送
- 2.2 方案介绍
- 2.2.1 ajax短轮询
- 2.2.2 长轮询
- 2.2.3 WebSocket
- 2.3 WS实现消息推送
- 2.3.1 架构介绍
- 2.3.2 暂存数据
- 2.3.2.1 什么是MongoDB
- 2.3.2.2 插入数据
- 2.3.2.3 查询数据
- 2.4.1 轮询任务
- 2.4.1.1 代码实现
1 从打车开始说起
我们把滴滴打车的流程简化下
- 登录app后点击打车开始进行打车
- 打车服务开始为司机派单
- 司机接单后开始给来接驾
- 上车乘客后处于行程中
- 行程结束后完成本次打车服务
1.1 需要解决的问题
我们需要实现派单服务,用户发送打车订单后需要进行进行派单,如果在指定时间内没有找到司机就会收到派单超时的通知,并且能够实时查看当前排队的抢单人数
下面我们来介绍下涉打车涉及到的一些问题
1.2 消息推送
我们需要将我们的异步处理结构返回到客户端,我们的客户端是使用的websocket连接的,因为websocket是点对点连接的,连接到一台固定的通知服务后,只能从这一台通知服务来获取数据,因为我们的通知服务允许分布式部署,这个问题改如何解决?
2 消息推送
2.1 什么是消息推送
当我们使用http协议探知服务器上是否有内容更新,就必须频繁的从客户端到服务器端进行确认,而http一下的这些标准会成为一个瓶颈:
- 一条连接上只可以发送一个请求
- 请求只能从客户端开始,客户端不可以接收除了响应以外的指令
- 请求 / 响应首部未经过压缩就直接进行传输,首部的信息越多,那么延迟就越大。
- 发送冗长的首部,每次互相发送相同的首部造成的浪费越多
- 可以任意选择数据压缩格式,非强制压缩发送
2.2 方案介绍
2.2.1 ajax短轮询
Ajax(异步的javascript与xml技术)是一种有效利用javascript和dom的操作,以达到局部web页面的提花和加载的异步通信手段,和以前的同步通信相比,他只更新一部分页面,相应中传输饿数据量会因此的减少
Ajax轮询的原理是,让浏览器每隔一段时间就发送一次请求,询问服务器是否有新消息,而利用ajax实时的从服务器获取内容,有可能导致大量的请求产生。 特点:实现简单、短连接、数据同步不及时、对服务器资源会造成一定压力,此模式广泛应用于:扫描登录、扫码支付、天气更新等(腾讯、京东、阿里一直都在沿用此技术并日渐成熟和稳定)
2.2.2 长轮询
原理和Ajax轮询差不多,都是采用轮询的方式,不过采用的是阻塞模型
也就是说,当客户端发起连接后,如果服务器端内容没有更新,将响应至于挂起状态,一直不回复response给客户端,知道有内容更新,再返回响应。 虽然可以做到实时更新,但是为了保留响应,一次连接饿持续时间也变长了,期间为了维持连接会消费更多的资源,需要有很高的并发,也就是说同时接待客户的能力 从上面两种方式中,其实可以看出是再不断的建立http连接,然后等待服务器处理,可以体现出了http的特点:**被动性**,即:请求只能由客户端发起,服务器端不能主动联系客户端。 特点:无需浏览器或APP端任何单独插件支持、长连接,减少网络(三次)握手和四次挥手、对服务器资源要求较高等,此模式常用于实时消息轮播、金融数据即时刷新、数据图表实时刷新等,JAVA服务器端一般采用Servlet3支持的异步任务、延时结果(DeferedResult)等手段实现。
2.2.3 WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
2.3 WS实现消息推送
通过上面我们实现了延时任务处理以及派单排队,但是如果将我们的异步处理结果推送给客户端呢
我们就需要使用消息推送技术,需要完成一下功能
- 将消息推送到指定的用户
- 对于未上线用户需要暂存数据,上线后推送
2.3.1 架构介绍
因为websocket是点对点的,而服务间调用是轮询的,无法实现微服务之间点对点的消息推送,我们使用定时任务来实现消息推送
- 调用接口先将消息暂存到MongoDB中
- 轮询任务首先拉取当前在线人员列表
- 轮询任务通过在线人员列表到MongoDB中拉取在线用户的通知消息
- 将消息通过WS推送到指定的用户
2.3.2 暂存数据
通过MongoDB将我们的消息数据暂存到数据库中,可以完成对于未上线消息暂存以及对分布式websocket的数据调度
2.3.2.1 什么是MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2.3.2.2 插入数据
@Override public void addMessage(PushMessage message) { mongoTemplate.save(message); }
2.3.2.3 查询数据
@Override public List
getMessageByUserNames(List userNameList) { Query query = new Query(Criteria.where("username").in(userNameList)); return mongoTemplate.findAllAndRemove(query, PushMessage.class); } 2.4.1 轮询任务
轮询任务就是不断的搜索检查是否有新的消息,然后交给WS进行处理
2.4.1.1 代码实现
使用pull方式将MongoDB中的在线用户的暂存消息取出来,推送给在线用户
/** * 定时任务 推送暂存消息 */ @Component public class ScheduledTask { private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class); @Autowired private PushService pushService; private static final ExecutorService executorService = Executors.newFixedThreadPool(10); @Autowired private WebSocketServer webSocketServer; @PostConstruct public void init() { executorService.execute(() -> { autoPushMessage(); }); } /** * 自动推送消息 */ public void autoPushMessage() { //轮询并发送消息 PollingRound.pollingPull(() -> { //获取最新需要推送的消息 List
pushMessagesList = getPushMessages(); //校验消息 if (null != pushMessagesList && !pushMessagesList.isEmpty()) { logger.debug("推送消息线程工作工作中,推送数据条数:{}", pushMessagesList.size()); //推送消息 webSocketServer.pushMessage(pushMessagesList); return PollingRound.delayLoop(100); } logger.debug("推送消息线程工作工作中,推送数据条数:{}", 0); return PollingRound.delayLoop(1000); }); } public List getPushMessages() { List userNameList = webSocketServer.getInLineAccountIds(); if (null != userNameList && !userNameList.isEmpty()) { //在MongoDB中获取当前在线用户的暂存消息 List pushMessageList = pushService.getMessageByAccountIds(userNameList); //返回消息 return pushMessageList; } return null; } }
- 2.4.1.1 代码实现
猜你喜欢
- 16天前(a级景区评定机构)全国A级旅游景区创建与提升培训班在敦煌市举办
- 16天前(中旅酒店 维景)中旅酒店首次AI数字人直播亮相南京维景
- 16天前(安徽民航君澜大饭店装饰设计招标)集东方文化气息,品徽派隽美风韵----安徽民航君澜大饭店静待绽放
- 16天前(天气预报 华为)2025HDC华为天气上新系统级天气智能体,引领更智能的气象服务
- 16天前(马尔代夫华尔道夫酒店多少钱)Chef Zhao就任马尔代夫伊挞富士岛华尔道夫酒店Li Long中餐厅新主厨
- 16天前(澳涞坞是什么)从最美山庄到世界舞台:澳涞山庄见证世界十佳旅居城市评选
- 16天前(澳涞坞是什么)从本土品牌到全球舞台:澳涞山庄获国际顶级产业资源加持
- 16天前(岭南东方大酒店)粤西成势 | 阳江阳春长兴岭南东方酒店正式签约,粤西文旅再添明珠
- 16天前(大黄山景区高质量发展联盟成立多少年)大黄山景区高质量发展联盟成立
- 16天前(内蒙古交通旅游图)内蒙古着力提升交通与旅游服务水平
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章