前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >更稳更快:深大的树洞小程序版本迭代与优化记录

更稳更快:深大的树洞小程序版本迭代与优化记录

原创
作者头像
Song
修改于 2017-07-26 02:13:52
修改于 2017-07-26 02:13:52
4.3K0
举报
文章被收录于专栏:Song的专栏Song的专栏

作者简介: Jason,深圳大学通信工程专业大三在读,深大的树洞小程序开发者。高中接触 Web 开发和设计,大学开始正式学习前端、PHP、Node.js,大一开始在校不间断负责多个公众号、小程序的开发。

深大的树洞(以下简称树洞)是面向深大学生的一款小程序,同学们可以在这里分享新鲜事,吐槽生活中不爽,诉说碰到的委屈。

树洞也是自微信小程序公测以来上线较早的一批小程序,上线之后获得了深大同学们的广泛好评,平台也一直保持着较高的活跃度。

核心功能展示:

产品核心逻辑较为简单,用户进入小程序之后在首页可以浏览用户已发布的内容,支持点赞和评论,用户同时能在底部TAB 栏进入消息页查看和回复相关评论信息。

点击屏幕右下角的悬浮按钮可以进入发布页面,内容支持文字和配图,并提供定位功能,用户如果选择实名发布信息的话,会获取用户的微信昵称和头像以供主页显示。

版本迭代

关于 1.0

大概是今年的 2 月份,当时小程序正式上线了,自己用了一圈,体验上总体来说还是比网页要出色一些。然后我也一直有开发一款树洞类应用的想法,于是就着手开始做一款树洞小程序。

当时为了赶在 2.14 情人节上线,整个开发周期基本就只有不到一周的时间,包括前后端的开发,十分的紧迫。1.0 的技术选型阶段,后端采用 Node.js + MySQL 的架构,而前端小程序方面,为了使用 ES6 和 Less 进行开发,选用了 Labrador 框架。

但是后来发现 Labrador 也有问题,首先就是状态的绑定分为了 propsstate,绑定的时候增加了复杂度,其次就是对于组件的支持并不是特别的舒服,没有 Vue 单文件来的好用。

下面就开始来讲 2.0 的整个开发过程。

技术选型

后端

后端没有推倒重来,在 1.0 的基础上增加了 /v2 的后缀,并且复用了一些 1.0 版本的 API。一方面是考虑到某些 API 的数据结构已经比较完善了,而且暂时没有更好的设计;另一方面是考虑到这样可以节省一点开发的工作,也可以兼容低版本。

对于数据的设计,也没有推倒重来,只添加了广告和通知两个数据库

前端(小程序端)

在 1.0 发布之后,无意之间发现了 WePY 这个框架,发现这个框架借鉴了 Vue 的单文件组件的开发模式,而且一些 API 的使用也更加贴近原生的 Vue,另外在框架层面也实现了数据的脏检查,可以摒弃原生小程序的setData,于是决定采用 WePY。

开发

考虑到 2.0 版本要加入评论回复的提醒,那么如何展示通知就是一个大问题。原因是因为小程序没有提供跨出小程序通知的能力,那么我们就只能在小程序内考虑通知的提示。

而在对后端的通知 API 设计的时候,考虑了两种方案:

  • Websocket
  • 轮询

Websocket 是基于 TCP 的全双工通信,可以实现服务端推送信息,微信的 Web 端也是采用 Websocket 来实现通信的,而轮询则是客户端定时请求服务端来查询有无通知。

相比而言,Websocket肯定是更优选择,但是考虑到小程序入口在微信内部的,聊天时一定要退出小程序,并且很少人会使用小程序置顶的功能,所以如果使用 Websocket 就需要经常重复建立 Websocket 连接。

并且考虑到很少有人会开着树洞等回复,所以实时的通知对用户体验的提升不大,于是我采用了轮询来实现,这也是技术上比较简单的实现方式。

在开发通知页面的时候,我还发现了一个问题,就是微信小程序的 request API 还不支持 PATCH 请求,便暂用 PUT请求作为替代。

通知方面,由于通知只能在小程序内部进行显示。于是我打算使用 Tab 栏来提示,随之而来的第二个问题就是,小程序提供了一个展示 Tab 栏的能力,但是只能自定义 icon 和文字,并且只能在配置文件里配置,等于说完全失去了对 Tab 栏编程能力,于是我抛弃了原生的 Tab 实现,使用 WePY 提供的组件系统自己实现了一个 Tab 栏。

最后的页面结构如下图所示:

基于此,首页、通知、用户三个页面不再是 page,而是 component,所以开发的时候 class 应该继承的是 wepy.component 这个类。而其他页面层级的页面的类,则应该继承 wepy.page。也正是由于这种情况,组件是没有生命周期的函数的,所以需要在 index.wpy 上面手动触发组件内的函数,来模拟生命周期函数的调用。

接下来的一个问题,就是关于 request 的登录态的问题。由于小程序是没有 cookie 的,于是我们普通设计 ajax 的登录态 token 不能放在 cookie 上了,于是便考虑将 token 放在 headers 里。在用户首次登陆的时候将登录态的 token 放在本地的 Storage 里,并在每个请求发起的时候自定义了一个请求头,手动带上 token。

示意图如下:

关于树洞开发的一些问题和解决方案就基本记录到这里了。

体验优化

随着树洞用户量的逐渐增加,部分用户反馈在夜间高峰期树洞首页数据刷新缓慢甚至经常刷不出数据。

还有一些已经去外地实习的同学跟我吐槽说,树洞的使用体验不如在校内使用时那么流畅。

我对以上问题进行反思,先考虑从小程序的代码层面进行优化,但是折腾一番后发现在基于微信提供的框架上进行开发后,自己能做的事情十分有限,便作罢。

然后开始从用户请求与服务器端通信的过程入手分析问题,这时正巧看到腾讯云动态加速新品内测,我尝试申请了一下竟然很快就通过了,于是遍想通过接入动态加速,看看问题是否出在网络传输过程中。

接入过程也十分简单,填写加速域名和IP,然后过大概5分钟OK了:

在接入动态加速之后的一个星期的时间,我每天跟踪了之前曾经跟我反馈过问题的同学们的树洞使用体验,发现他们基本没有再跟我吐槽过卡顿、数据丢失等问题,使用高峰期间的用户体验得到了很大的提高。

然后我使用听云测试了一下腾讯云动态加速的加速效果:

  • 源站所在地:广州
  • 检测数据时间段:2017年07月24日 16:30 - 2017年07月25日 16:30
  • 测试条件:10 M大小文件下载

未经加速直连源站各运营商监测数据:

加速后各运营商监测数据:

未经加速直连源站各省份监测数据:

加速后各省份监测数据:

相比之下,加速后性能提升近50%,可用性也有所提高,效果还是相当明显的。

虽然加速效果很明显,但是我发现截止发文时间为止,腾讯云动态加速控制台的统计分析模块所提供的统计维度还是太少,对于树洞这类运营需求比较强的产品来说,显得有些美中不足,希望他们正式上线之后,能加入更丰富的统计功能。

以上,希望我分享的内容能帮到大家。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WebService系列之HttpClient调用WebService接口
测试工具下载soapui测试 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl package com.extra.credit.ut
SmileNicky
2021/03/17
4.9K0
WebService系列之HttpClient调用WebService接口
和风天气API数据分析
注册和风天气获取key,请求数据时需要用到,具体可查看 官方文档 请求数据示例 3-10天天气预报 { "HeWeather6": [ { "basic": { "cid": "CN101010100", "location": "北京", "parent_city": "北京", "admin_area": "北京",
用户6808043
2022/02/25
1.3K0
org.apache.http.client.methods.HttpPost 两种消息体形式 —— UrlEncodedFormEntity 和 StringEntity
使用 UrlEncodedFormEntity 来设置 body,消息体内容类似于“KEY1=VALUE1&KEY2=VALUE2&...”这种形式,服务端接收以后也要依据这种协议形式做处理。
LeoXu
2018/08/15
3.5K0
Java调用第三方接口示范
【1】准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法【分为Get和Post方式的有参和无参调用】:
Java廖志伟
2021/01/29
1.4K0
安卓第十夜 亚当的诞生
上一讲介绍了用WebView来抓取一个网页内容。这一讲我将介绍如何在安卓内部直接进行HTTP通信。 《亚当的诞生》,西斯廷礼拜堂的吊顶画,米开朗基罗之作。当时的教皇强迫沉迷于雕塑的米开朗基罗画巨幅壁画
Vamei
2018/01/18
1.2K0
安卓第十夜 亚当的诞生
java签到百度贴吧
获取百度贴吧的BDUSS 在电脑端登录百度贴吧,按F12进入开发者控制台,点击Application 找到BDUSS,记录当中的值 申请Server酱中的Key并且绑定微信 代码如下 <?xml ve
jaychou
2022/12/26
1.7K0
使用httpclient实现图灵机器人web api调用实例
本人在使用图灵机器人的过程中,发现很不错,想试了通过api请求来获取回复,这样可以做一个页面聊天还是很不错的。网上搜到的文章好多都是get接口,现在已经不能用了,也不用urlencodeer方法处理info信息了。经过尝试,终于成功,分享方法代码,供大家参考。
FunTester
2019/08/22
7120
浅谈企业微信中AccessToken管理和API操作
原始方案: V0.1 定时器(schedule) 描述:在SpringBoot项目中,使用@Scheduled注解,每一小时获取一次AccessToken。 问题:在运行一段时间后,因网络波动导致某次请求失败,程序出错,定时器没有继续执行。 影响:程序无法进行任何微信相关的API请求。 改进:V0.2 定时器+异常捕获 V0.2 定时器+异常捕获 描述:在上述版本的情况下,增加异常捕获。 问题:运行一段时间再次出现异常,程序在获取AccessToken过程中出现阻塞,后续代码均未执行,定时器也无法执行。
geekfly
2022/05/06
2.9K0
浅谈企业微信中AccessToken管理和API操作
alertover推送api的java httpclient实现实例
本人前几天发现一款很好用的推送app——alertover,但是官网api的应用示例竟然没有java应用的示例,所以自己尝试写了一个。使用httpclient请求了一下post接口,传了一下json数据,判断一下响应的状态码。现分享代码,共大家参考。
FunTester
2019/08/08
6140
HTTP 请求工具类
坐标 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.1</version> <classifier>jdk15</classifier> </dependency> 工具类 package com.baomidou.springboot.uti
高大北
2022/06/14
9720
Salesforce作为REST Service供java访问
有的时候我们需要在其他平台上获取sfdc端的数据,比如做android项目需要访问sfdc数据,那样就需要Salesforce作为Service,java端通过http获取并对数据进行相关操作。步骤如下:
故久
2019/09/29
7120
Salesforce作为REST Service供java访问
Java调用第三方接口(http总结)
如果有一些jar包找不到,(不是maven管理需要自己下载)有时候有各种问题,或者墙或者找不到之类,可以通过创建一个maven空项目,添加pom依赖,然后下载,在pom仓库里找到即可用。
全栈程序员站长
2022/08/31
3.1K0
在线请求天气API,并解析其中的json数据予以显示
请求互联网信息提供商并取得返回的数据使用到HttpURLConnection,等待数据下载成功得到的Json,把它 解析成程序可利用的数据,使用到JSONObject
爱因斯坦福
2018/09/10
6.1K0
SpringBoot集成ES
Elasticsearch JAVA操作有三种客户端: 1、TransportClient 2、JestClient 3、RestClient 还有种是2.3中有的NodeClient,在5.5.1中好像没有了。 还有种是spring-data-elasticsearch,这里先以TransportClient为例子。
AlexZhang
2021/11/26
8220
Java HttpClient两种数据传输方式
二、server端的数据接收方式,使用@RequestBody接收二进制字节流,使用@RequestParam接收参数列表
week
2018/08/24
3.5K0
【微信开发】 红包接口开发
参考网上好几个版本的答案咯~ 分装 红包工具类 : package com.tepusoft.web.weixin.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.security.KeyStore; import java.security.NoSuchAlgorithmEx
冷冷
2018/02/08
2.6K0
Java微信公众平台开发(六)--微信开发中的token获取
引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效!
用户2417870
2019/09/18
2.2K0
Java微信公众平台开发(六)--微信开发中的token获取
httpclient提交json参数
有一只柴犬
2024/01/25
2620
java发送微信小程序模板消息
注意在访问的时候需要将关键字替换成自己的信息,比如APPID、APPSECRET、ACCESS_TOKEN 等。
请叫我师哥
2021/12/31
2.1K0
分布式性能测试框架用例方案设想(一)
在近期工作规划中,分布式压测框架提上日程,目前「FunTester」已经具备了一些分布式压测中用到的功能。
FunTester
2021/06/23
7250
相关推荐
WebService系列之HttpClient调用WebService接口
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档