评论

关于云开发新服务“实时数据推送”,你需要了解的全在这了!

微信小程序工程师邓坤力带你了解如何利用千呼万唤始出来的云开发实时数据推送服务打造生动的小程序和小游戏!

“微信小程序工程师邓坤力带你了解如何利用千呼万唤始出来的云开发实时数据推送服务打造生动的小程序和小游戏!”

数据库在小程序·云开发中的应用一文中,我们了解到实时数据推送作为云开发即将上线的一项新能力,主要指客户端使用官方SDK发起socket连接建立对一个集合的监听,目标集合中如果有符合过滤条件的数据发生变更,将会直接推送到建立监听的客户端。

简单来说,使用实时数据推送可以更有效率的拉取数据,帮你把你的应用变成实时有状态,场景会非常有用,比如可以用来做弹幕,做实时排名更新,做实时刷新,或者实时推送一些通知给到用户。

那么,实时数据推送具体是如何为小程序与小游戏赋能,提升开发效率的?让我们跟随微信小程序工程师邓坤力一起,深入了解这项新服务诞生的来龙去脉。

为什么要做实时数据推送?

介绍实时数据推送服务之前,弄懂一个直击灵魂问题将有助于我们的理解,那就是“为什么要做实时数据推送?”

想要更回答这个问题,需要从即时通信服务说起。

我们都知道建立一个简单、常规的即时通信服务需要长连作为实现实时性的基础,需要足够的存储来保证消息与文件的持久化,还需要实时推送功能来实现主动同步客户端的能力。在此过程中,开发者往往需要面临:

(1)需从零自建完整服务,无法聚焦在原型和核心业务开发上。

(2)开发成本高。由于前后端逻辑复杂,开发者往往需要经历设计基础设施搭建,长连管理、数据库开发、安全管理等琐碎繁杂的步骤。

(3)维护成本高。开发者还需负责维护,完成基础设施管理、异常处理等。

(4)微信能力集成。自建服务器的开发者如要基于微信用户登录态进行操作并让小程序安全运行,就不可避免地需要接入微信鉴权体系,整合accesstoken和 sessionkey流程并保证其安全性。

看到这里,可能有很多读者已经想到了具有开箱即用、集成原生微信能力、自带云数据库、云函数、云存储的云开发,那么云开发的这些优势能否有效解决开发者在建立即时通信服务中常常会遇到的难题呢?

答案是不完全能,由于云开发不支持长连,并且不具备主动同步客户端的能力,因此只能通过短轮询以次级长连和推送的次级替代方案,在即时通讯服务构建时往往需要面临短轮询带来的资源浪费、成本与体验难平衡以及实时性差等问题。

可能又有小伙伴要问了,让云开发支持长连不就可以弥补这些缺陷?答案也是否定的,因为若云开发支持长连,整个即时通讯服务的实现仍避免不了对长连的开发和管理,并且需要接受和处理消息,导致流程仍较为复杂,而这恰恰有悖于云开发作为高效率、轻量级解决方案的理念。

由此,云开发的实时推送服务应运而生,它将即时通讯服务所需的能力与云开发独有的优势串联起来,让开发者可以更便捷地使用并快速实现需求。

实时数据推送有哪些能力?

能力概述

实时数据推送是云开发数据库新增的服务,通过这项服务,小程序端可实时监听数据库变更,即它支持根据开发者给定的查询语句进行监听,每当查询语句的结果发生变化时,小程序端就会收到包含更新内容的推送,并对实时数据变化做出响应。

总体来说,使用云开发的实时数据推送能力相比起自建服务可以享受以下便利,从而使其更专注于业务逻辑的设计:

  • 原生能力,开箱即用

  • 无需管理长连

  • 无需编写服务端代码

  • 无需搭建和管理基础设施

  • 自动收到更新推送

丰富的应用场景

实时数据推送的应用场景十分丰富。

在即时通信方面,实时数据推送支持小程序直播聊天室、弹幕等以及小游戏的区服聊天、房间聊天、私信等功能的实现。

在状态同步方面,小程序可以使用实时数据推送来保持应用最新状态的同步,以信息流为例,可以支持实时提示有新的文章、评论、点赞,从而达到更好的用户体验;对小游戏来说,可以支持使用状态同步的模型开发的小游戏,比如棋牌类小游戏。

而在实时协作方面,实时数据推送可以为在线共享文档、项目管理协作工具等提供支持。

简单易用的API

实时数据推送提供简洁易用的API,调用方便,并且可以完整描述整个维度的数据变化,以便开发者对具体业务逻辑做出响应。

自动处理异常

SDK在异常时会尽可能自动恢复状态,并且此恢复为开发者无感知,开发者仅需处理 SDK 无法自动恢复的错误。具体来说:

实时数据推送在断网、网络切换、NAT 地址刷新等情况时均能自动检测异常和恢复连接,并且在更新事件推送失败或丢失时有机制保障会成功拉取,而在更新事件乱序时有机制保障开发者收到的是顺序事件。

云开发新能力矩阵

  • 云调用:云函数免鉴权调用微信服务端开放接口,获取微信开放数据,接收微信服务端消息推送。
  • HTTP API:小程序外访问云开发资源。
  • 数据库聚合:分组查询、统计查询、流水线批处理。
  • 控制台数据库高级查询:控制台中批量数据库增删查改。
  • 云开发Network面板:小程序Network面板支持展示云开发请求。
  • 实时数据推送
点赞 5
收藏
评论

9 个评论

  • 铭锋科技
    铭锋科技
    2019-08-28

    看到这个,我才对云开发感那么一点点兴趣,支持向更轻量更高效的趋势发展

    2019-08-28
    赞同 2
    回复
  • ネф イω
    ネф イω
    2019-09-09

    @邓坤力

    超级棒,已经用上了效果非常好,太给力咯!!

    2019-09-09
    赞同 1
    回复 7
    • Wm
      Wm
      2019-09-11
      你使用上是否碰到问题?多用户都能收到数据更新推送?
      2019-09-11
      回复
    • ネф イω
      ネф イω
      2019-09-11回复Wm
      在监控页面 电脑端和真机 如监控到有新的数据,都会有提醒
      2019-09-11
      回复
    • Wm
      Wm
      2019-09-11回复ネф イω

      你们使用上没碰到什么问题吗?我碰到一个奇怪的问题,在模拟器上添加一条数据,我的手机能正常收到数据更新,别的用户添加数据时,我也能收到,但是我添加数据时别的用户却不能收到数据更新推送,微信都更新到了最的版本了

      2019-09-11
      回复
    • Wm
      Wm
      2019-09-11
      我在开发者工具上使用完全没有问题,每一端发起添加数据,更新数据,彼此都能收到数据更新推送,但是当其它用户都来测试时却有问题
      2019-09-11
      回复
    • Wm
      Wm
      2019-09-11回复ネф イω
      我想问下,你联合其他真机使用者测过没?我这边使用微信开发者工具和手机测试是ok的 ,彼此都能触发数据库更新推送
      2019-09-11
      回复
    查看更多(2)
  • 2019-09-26
    能否配合那个下拉底端继续加载功能一起使用
    2019-09-26
    赞同
    回复
  • 🔆
    🔆
    2019-09-11

    各位大神想问问这了能连接多少用户?怎么计算的?

    2019-09-11
    赞同
    回复
  • 2019-09-02

    还想请问,watcher是否支持时间上的“现在”?

    比如数据库中有个含有未来某个时间的记录,我希望watcher能够到达那个时间再触发,能否实现?根据目前的where的文档,貌似是不可以的。

    2019-09-02
    赞同
    回复 2
    • ネф イω
      ネф イω
      2019-09-11
      _.gt 判断 未来出现的时间戳 >当前时间戳 db.command了解下应该可以
      2019-09-11
      回复
    • 2019-09-11回复ネф イω
      我知道command,但是我想要的效果类似这样:date: db.command.gt(db.serverDate())
      2019-09-11
      回复
  • 2019-08-30

    另外还希望提供watcher的暂停、恢复功能。否则每次close后重现开启监听,还要继续做一次init,增加了逻辑成本

    2019-08-30
    赞同
    回复 1
    • 邓坤力
      邓坤力
      2019-09-04
      感谢建议,接下来会考虑增加支持
      2019-09-04
      回复
  • 2019-08-30

    简单接入了我的项目,效果非常不错!

    希望尽快更新,能对init获取数据的数量有所限制

    2019-08-30
    赞同
    回复
  • 2019-08-28

    我也想问啥时候能用

    2019-08-28
    赞同
    回复 1
    • 邓坤力
      邓坤力
      2019-09-04
      已上线 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/realtime.html
      2019-09-04
      回复
  • 马斯洛
    马斯洛
    2019-08-28
    什么时候能用
    2019-08-28
    赞同
    回复 7
    • 邓坤力
      邓坤力
      2019-09-04
      已上线 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/realtime.html
      2019-09-04
      回复
    • monton
      monton
      2019-12-12回复邓坤力
      请问使用这个功能,服务端定时器(setTimeout触发)的更新数据库操作能否实时推送到小程序端呢?我试了一下,好像不行,总是等到小程序端再次访问时才反馈更新数据过来,并不是实时的。
      2019-12-12
      回复
    • 邓坤力
      邓坤力
      2019-12-12回复monton
      小程序保持在前台是吗?小程序端再次访问是指从微信重新进入小程序是吗?只有在前台的时候才会收到数据的,小程序在后台的时候异步 js 不会运行
      2019-12-12
      回复
    • monton
      monton
      2019-12-12回复邓坤力
      小程序一直在前台的。服务端10秒就超时了,小程序端20秒超时,小程序第一次访问服务端,双方的定时器都开始运行,服务端在10秒超时后会更新数据库。在小程序端查看打印信息,10秒时没有服务端推送的消息,到20秒超时后,小程序端发送了一个定时器结束消息给服务端,此时服务端就推送来了更新数据库消息,但是这个更新是10秒时发生的。
      2019-12-12
      回复
    • monton
      monton
      2019-12-12回复邓坤力
      似乎是setTimeout没起作用?
          console.log("timer start")
          setTimeout(function () {
            console.log("timer end")
            const tdb = cloud.database()
            tdb.collection('test').add({
              data: {
                time: db.serverDate()
              }
            }).then(res => {
              if (res.errMsg.indexOf('ok') == -1) {
                console.log(res)
                console.log("add test failed.")
                return null
              }
            })
          }, 10000) // 三分钟,测试时改为10秒
      本来是10秒后执行,结果等到前端调用请求后才执行
      2019-12-12
      回复
    查看更多(2)
登录 后发表内容